diff --git a/src/Umbraco.Web.UI.Client/.env b/src/Umbraco.Web.UI.Client/.env index 6042061013..2863beab6e 100644 --- a/src/Umbraco.Web.UI.Client/.env +++ b/src/Umbraco.Web.UI.Client/.env @@ -1,6 +1,6 @@ # Copy this to .env.local and change what you want to test. VITE_UMBRACO_USE_MSW=on # on = turns on MSW, off = disables all mock handlers -VITE_UMBRACO_API_URL=http://localhost:11000 +VITE_UMBRACO_API_URL=https://localhost:44339 VITE_UMBRACO_INSTALL_STATUS=running # running or must-install or must-upgrade VITE_MSW_QUIET=off # on = turns off MSW console logs, off = turns on MSW console logs VITE_UMBRACO_EXTENSION_MOCKS=off # on = turns on extension mocks, off = turns off extension mocks diff --git a/src/Umbraco.Web.UI.Client/.vscode/lit.code-snippets b/src/Umbraco.Web.UI.Client/.vscode/lit.code-snippets index fd01fd2b4c..38ffed71f5 100644 --- a/src/Umbraco.Web.UI.Client/.vscode/lit.code-snippets +++ b/src/Umbraco.Web.UI.Client/.vscode/lit.code-snippets @@ -4,18 +4,21 @@ "scope": "typescript", "body": [ "import { UUITextStyles } from '@umbraco-ui/uui-css';", - "import { css, html, LitElement } from 'lit';", + "import { css, html } from 'lit';", "import { customElement } from 'lit/decorators.js';", + "import { UmbLitElement } from '@umbraco-cms/internal/lit-element';", "", "@customElement('umb-${TM_FILENAME_BASE/(.*)\\..+$/$1/}')", - "export class Umb${TM_FILENAME_BASE/(.*)\\..+$/${1:/pascalcase}/}Element extends LitElement {", - "\tstatic styles = [UUITextStyles, css``];", - "", + "export class Umb${TM_FILENAME_BASE/(.*)\\..+$/${1:/pascalcase}/}Element extends UmbLitElement {", "\trender() {", "\t\treturn html`${0:umb-${TM_FILENAME_BASE/(.*)\\..+$/$1/}}`;", "\t}", + "", + "\tstatic styles = [UUITextStyles, css``];", "}", "", + "export default Umb${TM_FILENAME_BASE/(.*)\\..+$/${1:/pascalcase}/}Element", + "", "declare global {", "\tinterface HTMLElementTagNameMap {", "\t\t'umb-${TM_FILENAME_BASE/(.*)\\..+$/$1/}': Umb${TM_FILENAME_BASE/(.*)\\..+$/${1:/pascalcase}/}Element;", diff --git a/src/Umbraco.Web.UI.Client/.vscode/settings.json b/src/Umbraco.Web.UI.Client/.vscode/settings.json index badd3c2f00..387d52b0f6 100644 --- a/src/Umbraco.Web.UI.Client/.vscode/settings.json +++ b/src/Umbraco.Web.UI.Client/.vscode/settings.json @@ -1,6 +1,11 @@ { "cssVariables.lookupFiles": ["node_modules/@umbraco-ui/uui-css/dist/custom-properties.css"], - "cSpell.words": ["combobox", "templating", "variantable"], + "cSpell.words": [ + "combobox", + "Elementable", + "templating", + "variantable" + ], "exportall.config.folderListener": [], "exportall.config.relExclusion": [] } diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/CancelablePromise.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/CancelablePromise.ts index 26ad303915..724faeb7aa 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/CancelablePromise.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/CancelablePromise.ts @@ -22,15 +22,13 @@ export interface OnCancel { } export class CancelablePromise implements Promise { - readonly [Symbol.toStringTag]!: string; - - private _isResolved: boolean; - private _isRejected: boolean; - private _isCancelled: boolean; - private readonly _cancelHandlers: (() => void)[]; - private readonly _promise: Promise; - private _resolve?: (value: T | PromiseLike) => void; - private _reject?: (reason?: any) => void; + #isResolved: boolean; + #isRejected: boolean; + #isCancelled: boolean; + readonly #cancelHandlers: (() => void)[]; + readonly #promise: Promise; + #resolve?: (value: T | PromiseLike) => void; + #reject?: (reason?: any) => void; constructor( executor: ( @@ -39,78 +37,82 @@ export class CancelablePromise implements Promise { onCancel: OnCancel ) => void ) { - this._isResolved = false; - this._isRejected = false; - this._isCancelled = false; - this._cancelHandlers = []; - this._promise = new Promise((resolve, reject) => { - this._resolve = resolve; - this._reject = reject; + this.#isResolved = false; + this.#isRejected = false; + this.#isCancelled = false; + this.#cancelHandlers = []; + this.#promise = new Promise((resolve, reject) => { + this.#resolve = resolve; + this.#reject = reject; const onResolve = (value: T | PromiseLike): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { return; } - this._isResolved = true; - this._resolve?.(value); + this.#isResolved = true; + this.#resolve?.(value); }; const onReject = (reason?: any): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { return; } - this._isRejected = true; - this._reject?.(reason); + this.#isRejected = true; + this.#reject?.(reason); }; const onCancel = (cancelHandler: () => void): void => { - if (this._isResolved || this._isRejected || this._isCancelled) { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { return; } - this._cancelHandlers.push(cancelHandler); + this.#cancelHandlers.push(cancelHandler); }; Object.defineProperty(onCancel, 'isResolved', { - get: (): boolean => this._isResolved, + get: (): boolean => this.#isResolved, }); Object.defineProperty(onCancel, 'isRejected', { - get: (): boolean => this._isRejected, + get: (): boolean => this.#isRejected, }); Object.defineProperty(onCancel, 'isCancelled', { - get: (): boolean => this._isCancelled, + get: (): boolean => this.#isCancelled, }); return executor(onResolve, onReject, onCancel as OnCancel); }); } + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } + public then( onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, onRejected?: ((reason: any) => TResult2 | PromiseLike) | null ): Promise { - return this._promise.then(onFulfilled, onRejected); + return this.#promise.then(onFulfilled, onRejected); } public catch( onRejected?: ((reason: any) => TResult | PromiseLike) | null ): Promise { - return this._promise.catch(onRejected); + return this.#promise.catch(onRejected); } public finally(onFinally?: (() => void) | null): Promise { - return this._promise.finally(onFinally); + return this.#promise.finally(onFinally); } public cancel(): void { - if (this._isResolved || this._isRejected || this._isCancelled) { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { return; } - this._isCancelled = true; - if (this._cancelHandlers.length) { + this.#isCancelled = true; + if (this.#cancelHandlers.length) { try { - for (const cancelHandler of this._cancelHandlers) { + for (const cancelHandler of this.#cancelHandlers) { cancelHandler(); } } catch (error) { @@ -118,11 +120,11 @@ export class CancelablePromise implements Promise { return; } } - this._cancelHandlers.length = 0; - this._reject?.(new CancelError('Request aborted')); + this.#cancelHandlers.length = 0; + this.#reject?.(new CancelError('Request aborted')); } public get isCancelled(): boolean { - return this._isCancelled; + return this.#isCancelled; } } diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/OpenAPI.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/OpenAPI.ts index a14bc1a928..1b5e07e50e 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/OpenAPI.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/OpenAPI.ts @@ -20,7 +20,7 @@ export type OpenAPIConfig = { export const OpenAPI: OpenAPIConfig = { BASE: '', - VERSION: '1.0', + VERSION: 'Latest', WITH_CREDENTIALS: false, CREDENTIALS: 'include', TOKEN: undefined, diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/request.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/request.ts index 0a87eb5f1c..215bc34dab 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/request.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/core/request.ts @@ -177,7 +177,7 @@ const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Pr }; const getRequestBody = (options: ApiRequestOptions): any => { - if (options.body) { + if (options.body !== undefined) { if (options.mediaType?.includes('/json')) { return JSON.stringify(options.body) } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { @@ -231,7 +231,8 @@ const getResponseBody = async (response: Response): Promise => { try { const contentType = response.headers.get('Content-Type'); if (contentType) { - const isJSON = contentType.toLowerCase().startsWith('application/json'); + const jsonTypes = ['application/json', 'application/problem+json'] + const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); if (isJSON) { return await response.json(); } else { diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/index.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/index.ts index 9919e60217..d603ff50ae 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/index.ts @@ -23,6 +23,7 @@ export type { ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMedi export type { ContentTypeSortModel } from './models/ContentTypeSortModel'; export type { ContentUrlInfoModel } from './models/ContentUrlInfoModel'; export type { CopyDataTypeRequestModel } from './models/CopyDataTypeRequestModel'; +export type { CopyDocumentRequestModel } from './models/CopyDocumentRequestModel'; export type { CreateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel } from './models/CreateContentRequestModelBaseDocumentValueModelDocumentVariantRequestModel'; export type { CreateContentRequestModelBaseMediaValueModelMediaVariantRequestModel } from './models/CreateContentRequestModelBaseMediaValueModelMediaVariantRequestModel'; export type { CreateDataTypeRequestModel } from './models/CreateDataTypeRequestModel'; @@ -98,6 +99,7 @@ export type { LanguageItemResponseModel } from './models/LanguageItemResponseMod export type { LanguageModelBaseModel } from './models/LanguageModelBaseModel'; export type { LanguageResponseModel } from './models/LanguageResponseModel'; export type { LoggerResponseModel } from './models/LoggerResponseModel'; +export type { LoginRequestModel } from './models/LoginRequestModel'; export type { LogLevelCountsReponseModel } from './models/LogLevelCountsReponseModel'; export { LogLevelModel } from './models/LogLevelModel'; export type { LogMessagePropertyPresentationModel } from './models/LogMessagePropertyPresentationModel'; @@ -112,11 +114,14 @@ export type { MediaValueModel } from './models/MediaValueModel'; export type { MediaVariantRequestModel } from './models/MediaVariantRequestModel'; export type { MediaVariantResponseModel } from './models/MediaVariantResponseModel'; export type { MemberGroupItemReponseModel } from './models/MemberGroupItemReponseModel'; +export type { MemberItemResponseModel } from './models/MemberItemResponseModel'; export type { MemberTypeItemResponseModel } from './models/MemberTypeItemResponseModel'; export type { ModelsBuilderResponseModel } from './models/ModelsBuilderResponseModel'; export { ModelsModeModel } from './models/ModelsModeModel'; export type { MoveDataTypeRequestModel } from './models/MoveDataTypeRequestModel'; export type { MoveDictionaryRequestModel } from './models/MoveDictionaryRequestModel'; +export type { MoveDocumentRequestModel } from './models/MoveDocumentRequestModel'; +export type { MoveMediaRequestModel } from './models/MoveMediaRequestModel'; export type { ObjectTypeResponseModel } from './models/ObjectTypeResponseModel'; export type { OkResultModel } from './models/OkResultModel'; export { OperatorModel } from './models/OperatorModel'; @@ -128,6 +133,7 @@ export type { PackageMigrationStatusResponseModel } from './models/PackageMigrat export type { PackageModelBaseModel } from './models/PackageModelBaseModel'; export type { PagedAuditLogResponseModel } from './models/PagedAuditLogResponseModel'; export type { PagedAuditLogWithUsernameResponseModel } from './models/PagedAuditLogWithUsernameResponseModel'; +export type { PagedBooleanModel } from './models/PagedBooleanModel'; export type { PagedContentTreeItemResponseModel } from './models/PagedContentTreeItemResponseModel'; export type { PagedCultureReponseModel } from './models/PagedCultureReponseModel'; export type { PagedDictionaryOverviewResponseModel } from './models/PagedDictionaryOverviewResponseModel'; @@ -154,6 +160,7 @@ export type { PagedRelationResponseModel } from './models/PagedRelationResponseM export type { PagedSavedLogSearchResponseModel } from './models/PagedSavedLogSearchResponseModel'; export type { PagedSearcherResponseModel } from './models/PagedSearcherResponseModel'; export type { PagedSearchResultResponseModel } from './models/PagedSearchResultResponseModel'; +export type { PagedTagResponseModel } from './models/PagedTagResponseModel'; export type { PagedTelemetryResponseModel } from './models/PagedTelemetryResponseModel'; export type { PagedUserGroupPresentationModel } from './models/PagedUserGroupPresentationModel'; export type { PagedUserResponseModel } from './models/PagedUserResponseModel'; @@ -187,6 +194,7 @@ export type { SetAvatarRequestModel } from './models/SetAvatarRequestModel'; export type { StaticFileItemResponseModel } from './models/StaticFileItemResponseModel'; export { StatusResultTypeModel } from './models/StatusResultTypeModel'; export type { StylesheetItemResponseModel } from './models/StylesheetItemResponseModel'; +export type { TagResponseModel } from './models/TagResponseModel'; export { TelemetryLevelModel } from './models/TelemetryLevelModel'; export type { TelemetryRepresentationBaseModel } from './models/TelemetryRepresentationBaseModel'; export type { TelemetryRequestModel } from './models/TelemetryRequestModel'; @@ -225,8 +233,10 @@ export type { UpdateUserGroupsOnUserRequestModel } from './models/UpdateUserGrou export type { UpdateUserRequestModel } from './models/UpdateUserRequestModel'; export type { UpgradeSettingsResponseModel } from './models/UpgradeSettingsResponseModel'; export type { UserGroupBaseModel } from './models/UserGroupBaseModel'; +export type { UserGroupItemResponseModel } from './models/UserGroupItemResponseModel'; export type { UserGroupPresentationModel } from './models/UserGroupPresentationModel'; export type { UserInstallResponseModel } from './models/UserInstallResponseModel'; +export type { UserItemResponseModel } from './models/UserItemResponseModel'; export { UserOrderModel } from './models/UserOrderModel'; export type { UserPresentationBaseModel } from './models/UserPresentationBaseModel'; export type { UserResponseModel } from './models/UserResponseModel'; @@ -252,6 +262,7 @@ export { LanguageResource } from './services/LanguageResource'; export { LogViewerResource } from './services/LogViewerResource'; export { MediaResource } from './services/MediaResource'; export { MediaTypeResource } from './services/MediaTypeResource'; +export { MemberResource } from './services/MemberResource'; export { MemberGroupResource } from './services/MemberGroupResource'; export { MemberTypeResource } from './services/MemberTypeResource'; export { ModelsBuilderResource } from './services/ModelsBuilderResource'; @@ -259,6 +270,7 @@ export { ObjectTypesResource } from './services/ObjectTypesResource'; export { PackageResource } from './services/PackageResource'; export { PartialViewResource } from './services/PartialViewResource'; export { ProfilingResource } from './services/ProfilingResource'; +export { PropertyTypeResource } from './services/PropertyTypeResource'; export { PublishedCacheResource } from './services/PublishedCacheResource'; export { RedirectManagementResource } from './services/RedirectManagementResource'; export { RelationResource } from './services/RelationResource'; @@ -269,11 +281,11 @@ export { SecurityResource } from './services/SecurityResource'; export { ServerResource } from './services/ServerResource'; export { StaticFileResource } from './services/StaticFileResource'; export { StylesheetResource } from './services/StylesheetResource'; +export { TagResource } from './services/TagResource'; export { TelemetryResource } from './services/TelemetryResource'; export { TemplateResource } from './services/TemplateResource'; export { TemporaryFileResource } from './services/TemporaryFileResource'; export { TrackedReferenceResource } from './services/TrackedReferenceResource'; export { UpgradeResource } from './services/UpgradeResource'; -export { UserGroupsResource } from './services/UserGroupsResource'; -export { UsersResource } from './services/UsersResource'; -export { V1Resource } from './services/V1Resource'; +export { UserResource } from './services/UserResource'; +export { UserGroupResource } from './services/UserGroupResource'; diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CopyDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CopyDocumentRequestModel.ts new file mode 100644 index 0000000000..9061fa7ee8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/CopyDocumentRequestModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type CopyDocumentRequestModel = { + targetId?: string | null; + relateToOriginal?: boolean; + includeDescendants?: boolean; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeResponseModel.ts index ed9934a1b5..5fa2a1085c 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/DataTypeResponseModel.ts @@ -4,8 +4,9 @@ import type { DataTypeModelBaseModel } from './DataTypeModelBaseModel'; -export type DataTypeResponseModel = DataTypeModelBaseModel & { - $type: string; - id?: string; - parentId?: string | null; -}; +export type DataTypeResponseModel = (DataTypeModelBaseModel & { + $type: string; + id?: string; + parentId?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LoginRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LoginRequestModel.ts new file mode 100644 index 0000000000..4c6a271071 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/LoginRequestModel.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type LoginRequestModel = { + username?: string; + password?: string; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MemberItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MemberItemResponseModel.ts new file mode 100644 index 0000000000..33ff7c7aa2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MemberItemResponseModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type MemberItemResponseModel = (ItemResponseModelBaseModel & { + icon?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDocumentRequestModel.ts new file mode 100644 index 0000000000..8dab764bf6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveDocumentRequestModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type MoveDocumentRequestModel = { + targetId?: string | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveMediaRequestModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveMediaRequestModel.ts new file mode 100644 index 0000000000..0077a725a5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/MoveMediaRequestModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type MoveMediaRequestModel = { + targetId?: string | null; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedBooleanModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedBooleanModel.ts new file mode 100644 index 0000000000..01f4876705 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedBooleanModel.ts @@ -0,0 +1,9 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type PagedBooleanModel = { + total: number; + items: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedTagResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedTagResponseModel.ts new file mode 100644 index 0000000000..f771dc306c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PagedTagResponseModel.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { TagResponseModel } from './TagResponseModel'; + +export type PagedTagResponseModel = { + total: number; + items: Array; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeResponseModelBaseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeResponseModelBaseModel.ts index 72adb84e18..ad3a59bbbf 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeResponseModelBaseModel.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/PropertyTypeResponseModelBaseModel.ts @@ -6,14 +6,15 @@ import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel' import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; export type PropertyTypeResponseModelBaseModel = { - id?: string; - containerId?: string | null; - alias?: string; - name?: string; - description?: string | null; - dataTypeId?: string; - variesByCulture?: boolean; - variesBySegment?: boolean; - validation?: PropertyTypeValidationModel; - appearance?: PropertyTypeAppearanceModel; + id?: string; + containerId?: string | null; + alias?: string; + name?: string; + description?: string | null; + dataTypeId?: string; + variesByCulture?: boolean; + variesBySegment?: boolean; + validation?: PropertyTypeValidationModel; + appearance?: PropertyTypeAppearanceModel; }; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TagResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TagResponseModel.ts new file mode 100644 index 0000000000..8b6ef8dfd1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/TagResponseModel.ts @@ -0,0 +1,11 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +export type TagResponseModel = { + id?: string; + text?: string | null; + group?: string | null; + nodeCount?: number; +}; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupItemResponseModel.ts new file mode 100644 index 0000000000..651ba550d0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserGroupItemResponseModel.ts @@ -0,0 +1,10 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type UserGroupItemResponseModel = (ItemResponseModelBaseModel & { + icon?: string | null; +}); + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserItemResponseModel.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserItemResponseModel.ts new file mode 100644 index 0000000000..daa5937712 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/models/UserItemResponseModel.ts @@ -0,0 +1,8 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { ItemResponseModelBaseModel } from './ItemResponseModelBaseModel'; + +export type UserItemResponseModel = ItemResponseModelBaseModel; + diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DataTypeResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DataTypeResource.ts index ccf865111c..1ce6ab2cae 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DataTypeResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DataTypeResource.ts @@ -136,6 +136,27 @@ export class DataTypeResource { }); } + /** + * @returns boolean Success + * @throws ApiError + */ + public static getDataTypeByIdIsUsed({ + id, + }: { + id: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/data-type/{id}/is-used', + path: { + 'id': id, + }, + errors: { + 404: `Not Found`, + }, + }); + } + /** * @returns any Success * @throws ApiError diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentResource.ts index 5758389b26..0cc3b7611d 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/DocumentResource.ts @@ -1,10 +1,12 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { CopyDocumentRequestModel } from '../models/CopyDocumentRequestModel'; import type { CreateDocumentRequestModel } from '../models/CreateDocumentRequestModel'; import type { DocumentItemResponseModel } from '../models/DocumentItemResponseModel'; import type { DocumentNotificationResponseModel } from '../models/DocumentNotificationResponseModel'; import type { DocumentResponseModel } from '../models/DocumentResponseModel'; +import type { MoveDocumentRequestModel } from '../models/MoveDocumentRequestModel'; import type { PagedDocumentTreeItemResponseModel } from '../models/PagedDocumentTreeItemResponseModel'; import type { PagedRecycleBinItemResponseModel } from '../models/PagedRecycleBinItemResponseModel'; import type { UpdateDocumentNotificationsRequestModel } from '../models/UpdateDocumentNotificationsRequestModel'; @@ -108,6 +110,33 @@ export class DocumentResource { }); } + /** + * @returns string Created + * @throws ApiError + */ + public static postDocumentByIdCopy({ + id, + requestBody, + }: { + id: string, + requestBody?: CopyDocumentRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document/{id}/copy', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Location', + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** * @returns any Success * @throws ApiError @@ -148,6 +177,32 @@ export class DocumentResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static putDocumentByIdMove({ + id, + requestBody, + }: { + id: string, + requestBody?: MoveDocumentRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/move', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** * @returns any Success * @throws ApiError diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaResource.ts index 4e0385a534..00e9d3c6b1 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MediaResource.ts @@ -6,6 +6,7 @@ import type { CreateMediaRequestModel } from '../models/CreateMediaRequestModel' import type { DocumentResponseModel } from '../models/DocumentResponseModel'; import type { DocumentTreeItemResponseModel } from '../models/DocumentTreeItemResponseModel'; import type { MediaItemResponseModel } from '../models/MediaItemResponseModel'; +import type { MoveMediaRequestModel } from '../models/MoveMediaRequestModel'; import type { PagedContentTreeItemResponseModel } from '../models/PagedContentTreeItemResponseModel'; import type { PagedRecycleBinItemResponseModel } from '../models/PagedRecycleBinItemResponseModel'; import type { UpdateMediaRequestModel } from '../models/UpdateMediaRequestModel'; @@ -107,6 +108,32 @@ export class MediaResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static putMediaByIdMove({ + id, + requestBody, + }: { + id: string, + requestBody?: MoveMediaRequestModel, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/media/{id}/move', + path: { + 'id': id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + /** * @returns any Success * @throws ApiError diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/V1Resource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberResource.ts similarity index 56% rename from src/Umbraco.Web.UI.Client/libs/backend-api/src/services/V1Resource.ts rename to src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberResource.ts index d63c01efe2..e7edb3d3bc 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/V1Resource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/MemberResource.ts @@ -1,28 +1,28 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { StaticFileItemResponseModel } from '../models/StaticFileItemResponseModel'; +import type { MemberItemResponseModel } from '../models/MemberItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; -export class V1Resource { +export class MemberResource { /** * @returns any Success * @throws ApiError */ - public static getItem({ - path, + public static getMemberItem({ + id, }: { - path?: Array, - }): CancelablePromise> { + id?: Array, + }): CancelablePromise> { return __request(OpenAPI, { method: 'GET', - url: '/item', + url: '/umbraco/management/api/v1/member/item', query: { - 'path': path, + 'id': id, }, }); } diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PropertyTypeResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PropertyTypeResource.ts new file mode 100644 index 0000000000..3026b7808a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/PropertyTypeResource.ts @@ -0,0 +1,36 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { PagedBooleanModel } from '../models/PagedBooleanModel'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class PropertyTypeResource { + + /** + * @returns PagedBooleanModel Success + * @throws ApiError + */ + public static getPropertyTypeIsUsed({ + contentTypeId, + propertyAlias, + }: { + contentTypeId?: string, + propertyAlias?: string, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/property-type/is-used', + query: { + 'contentTypeId': contentTypeId, + 'propertyAlias': propertyAlias, + }, + errors: { + 400: `Bad Request`, + }, + }); + } + +} diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/SecurityResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/SecurityResource.ts index f97720b6d0..32ea6803ee 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/SecurityResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/SecurityResource.ts @@ -1,6 +1,8 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { LoginRequestModel } from '../models/LoginRequestModel'; + import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; @@ -22,10 +24,16 @@ export class SecurityResource { * @returns any Success * @throws ApiError */ - public static postSecurityBackOfficeAuthorize(): CancelablePromise { + public static postSecurityBackOfficeLogin({ + requestBody, + }: { + requestBody?: LoginRequestModel, + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/security/back-office/authorize', + url: '/umbraco/management/api/v1/security/back-office/login', + body: requestBody, + mediaType: 'application/json', }); } diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StaticFileResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StaticFileResource.ts index 83645d7d1f..1a4d318a15 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StaticFileResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/StaticFileResource.ts @@ -2,6 +2,7 @@ /* tslint:disable */ /* eslint-disable */ import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; +import type { StaticFileItemResponseModel } from '../models/StaticFileItemResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; @@ -9,6 +10,24 @@ import { request as __request } from '../core/request'; export class StaticFileResource { + /** + * @returns any Success + * @throws ApiError + */ + public static getStaticFileItem({ + path, + }: { + path?: Array, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/static-file/item', + query: { + 'path': path, + }, + }); + } + /** * @returns PagedFileSystemTreeItemPresentationModel Success * @throws ApiError diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TagResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TagResource.ts new file mode 100644 index 0000000000..16f39aaf21 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/TagResource.ts @@ -0,0 +1,42 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { PagedTagResponseModel } from '../models/PagedTagResponseModel'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class TagResource { + + /** + * @returns PagedTagResponseModel Success + * @throws ApiError + */ + public static getTag({ + query, + tagGroup, + culture, + skip, + take = 100, + }: { + query?: string, + tagGroup?: string, + culture?: string, + skip?: number, + take?: number, + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tag', + query: { + 'query': query, + 'tagGroup': tagGroup, + 'culture': culture, + 'skip': skip, + 'take': take, + }, + }); + } + +} diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserGroupsResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserGroupResource.ts similarity index 72% rename from src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserGroupsResource.ts rename to src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserGroupResource.ts index c161c4e304..baf844acfc 100644 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserGroupsResource.ts +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserGroupResource.ts @@ -4,26 +4,27 @@ import type { PagedUserGroupPresentationModel } from '../models/PagedUserGroupPresentationModel'; import type { SaveUserGroupRequestModel } from '../models/SaveUserGroupRequestModel'; import type { UpdateUserGroupRequestModel } from '../models/UpdateUserGroupRequestModel'; +import type { UserGroupItemResponseModel } from '../models/UserGroupItemResponseModel'; import type { UserGroupPresentationModel } from '../models/UserGroupPresentationModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; -export class UserGroupsResource { +export class UserGroupResource { /** * @returns string Created * @throws ApiError */ - public static postUserGroups({ + public static postUserGroup({ requestBody, }: { requestBody?: SaveUserGroupRequestModel, }): CancelablePromise { return __request(OpenAPI, { method: 'POST', - url: '/umbraco/management/api/v1/user-groups', + url: '/umbraco/management/api/v1/user-group', body: requestBody, mediaType: 'application/json', responseHeader: 'Location', @@ -37,7 +38,7 @@ export class UserGroupsResource { * @returns PagedUserGroupPresentationModel Success * @throws ApiError */ - public static getUserGroups({ + public static getUserGroup({ skip, take = 100, }: { @@ -46,7 +47,7 @@ export class UserGroupsResource { }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user-groups', + url: '/umbraco/management/api/v1/user-group', query: { 'skip': skip, 'take': take, @@ -58,14 +59,14 @@ export class UserGroupsResource { * @returns any Success * @throws ApiError */ - public static getUserGroupsById({ + public static getUserGroupById({ id, }: { id: string, }): CancelablePromise { return __request(OpenAPI, { method: 'GET', - url: '/umbraco/management/api/v1/user-groups/{id}', + url: '/umbraco/management/api/v1/user-group/{id}', path: { 'id': id, }, @@ -79,14 +80,14 @@ export class UserGroupsResource { * @returns any Success * @throws ApiError */ - public static deleteUserGroupsById({ + public static deleteUserGroupById({ id, }: { id: string, }): CancelablePromise { return __request(OpenAPI, { method: 'DELETE', - url: '/umbraco/management/api/v1/user-groups/{id}', + url: '/umbraco/management/api/v1/user-group/{id}', path: { 'id': id, }, @@ -100,7 +101,7 @@ export class UserGroupsResource { * @returns any Success * @throws ApiError */ - public static putUserGroupsById({ + public static putUserGroupById({ id, requestBody, }: { @@ -109,7 +110,7 @@ export class UserGroupsResource { }): CancelablePromise { return __request(OpenAPI, { method: 'PUT', - url: '/umbraco/management/api/v1/user-groups/{id}', + url: '/umbraco/management/api/v1/user-group/{id}', path: { 'id': id, }, @@ -121,4 +122,22 @@ export class UserGroupsResource { }); } + /** + * @returns any Success + * @throws ApiError + */ + public static getUserGroupItem({ + id, + }: { + id?: Array, + }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user-group/item', + query: { + 'id': id, + }, + }); + } + } diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserResource.ts new file mode 100644 index 0000000000..9af279fb5c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UserResource.ts @@ -0,0 +1,324 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ChangePasswordUserRequestModel } from '../models/ChangePasswordUserRequestModel'; +import type { CreateUserRequestModel } from '../models/CreateUserRequestModel'; +import type { CreateUserResponseModel } from '../models/CreateUserResponseModel'; +import type { DirectionModel } from '../models/DirectionModel'; +import type { DisableUserRequestModel } from '../models/DisableUserRequestModel'; +import type { EnableUserRequestModel } from '../models/EnableUserRequestModel'; +import type { InviteUserRequestModel } from '../models/InviteUserRequestModel'; +import type { PagedUserResponseModel } from '../models/PagedUserResponseModel'; +import type { SetAvatarRequestModel } from '../models/SetAvatarRequestModel'; +import type { UnlockUsersRequestModel } from '../models/UnlockUsersRequestModel'; +import type { UpdateUserGroupsOnUserRequestModel } from '../models/UpdateUserGroupsOnUserRequestModel'; +import type { UpdateUserRequestModel } from '../models/UpdateUserRequestModel'; +import type { UserItemResponseModel } from '../models/UserItemResponseModel'; +import type { UserOrderModel } from '../models/UserOrderModel'; +import type { UserResponseModel } from '../models/UserResponseModel'; +import type { UserStateModel } from '../models/UserStateModel'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class UserResource { + /** + * @returns any Success + * @throws ApiError + */ + public static postUser({ + requestBody, + }: { + requestBody?: CreateUserRequestModel | InviteUserRequestModel; + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns PagedUserResponseModel Success + * @throws ApiError + */ + public static getUser({ + skip, + take = 100, + }: { + skip?: number; + take?: number; + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user', + query: { + skip: skip, + take: take, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getUserById({ id }: { id: string }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/{id}', + path: { + id: id, + }, + errors: { + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deleteUserById({ id }: { id: string }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user/{id}', + path: { + id: id, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static putUserById({ + id, + requestBody, + }: { + id: string; + requestBody?: UpdateUserRequestModel; + }): CancelablePromise { + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/user/{id}', + path: { + id: id, + }, + body: requestBody, + mediaType: 'application/json', + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static deleteUserAvatarById({ id }: { id: string }): CancelablePromise { + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user/avatar/{id}', + path: { + id: id, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUserAvatarById({ + id, + requestBody, + }: { + id: string; + requestBody?: SetAvatarRequestModel; + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/avatar/{id}', + path: { + id: id, + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUserChangePasswordById({ + id, + requestBody, + }: { + id: string; + requestBody?: ChangePasswordUserRequestModel; + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/change-password/{id}', + path: { + id: id, + }, + body: requestBody, + mediaType: 'application/json', + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUserDisable({ requestBody }: { requestBody?: DisableUserRequestModel }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/disable', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUserEnable({ requestBody }: { requestBody?: EnableUserRequestModel }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/enable', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getUserFilter({ + skip, + take = 100, + orderBy, + orderDirection, + userGroupIds, + userStates, + filter = '', + }: { + skip?: number; + take?: number; + orderBy?: UserOrderModel; + orderDirection?: DirectionModel; + userGroupIds?: Array; + userStates?: Array; + filter?: string; + }): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/filter', + query: { + skip: skip, + take: take, + orderBy: orderBy, + orderDirection: orderDirection, + userGroupIds: userGroupIds, + userStates: userStates, + filter: filter, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUserInvite({ requestBody }: { requestBody?: InviteUserRequestModel }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/invite', + body: requestBody, + mediaType: 'application/json', + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getUserItem({ id }: { id?: Array }): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/item', + query: { + id: id, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUserSetUserGroups({ + requestBody, + }: { + requestBody?: UpdateUserGroupsOnUserRequestModel; + }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/set-user-groups', + body: requestBody, + mediaType: 'application/json', + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUserUnlock({ requestBody }: { requestBody?: UnlockUsersRequestModel }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/unlock', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static postUsersUnlock({ requestBody }: { requestBody?: UnlockUsersRequestModel }): CancelablePromise { + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/users/unlock', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + }, + }); + } +} diff --git a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UsersResource.ts b/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UsersResource.ts deleted file mode 100644 index e2b78bae8a..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/backend-api/src/services/UsersResource.ts +++ /dev/null @@ -1,323 +0,0 @@ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { ChangePasswordUserRequestModel } from '../models/ChangePasswordUserRequestModel'; -import type { CreateUserRequestModel } from '../models/CreateUserRequestModel'; -import type { CreateUserResponseModel } from '../models/CreateUserResponseModel'; -import type { DirectionModel } from '../models/DirectionModel'; -import type { DisableUserRequestModel } from '../models/DisableUserRequestModel'; -import type { EnableUserRequestModel } from '../models/EnableUserRequestModel'; -import type { InviteUserRequestModel } from '../models/InviteUserRequestModel'; -import type { PagedUserResponseModel } from '../models/PagedUserResponseModel'; -import type { SetAvatarRequestModel } from '../models/SetAvatarRequestModel'; -import type { UnlockUsersRequestModel } from '../models/UnlockUsersRequestModel'; -import type { UpdateUserGroupsOnUserRequestModel } from '../models/UpdateUserGroupsOnUserRequestModel'; -import type { UpdateUserRequestModel } from '../models/UpdateUserRequestModel'; -import type { UserOrderModel } from '../models/UserOrderModel'; -import type { UserResponseModel } from '../models/UserResponseModel'; -import type { UserStateModel } from '../models/UserStateModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class UsersResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static postUsers({ - requestBody, - }: { - requestBody?: (CreateUserRequestModel | InviteUserRequestModel), - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/users', - body: requestBody, - mediaType: 'application/json', - errors: { - 400: `Bad Request`, - }, - }); - } - - /** - * @returns PagedUserResponseModel Success - * @throws ApiError - */ - public static getUsers({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/users', - query: { - 'skip': skip, - 'take': take, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getUsersById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/users/{id}', - path: { - 'id': id, - }, - errors: { - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static deleteUsersById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/users/{id}', - path: { - 'id': id, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static putUsersById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/users/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static deleteUsersAvatarById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/users/avatar/{id}', - path: { - 'id': id, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postUsersAvatarById({ - id, - requestBody, - }: { - id: string, - requestBody?: SetAvatarRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/users/avatar/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - errors: { - 400: `Bad Request`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postUsersChangePasswordById({ - id, - requestBody, - }: { - id: string, - requestBody?: ChangePasswordUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/users/change-password/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postUsersDisable({ - requestBody, - }: { - requestBody?: DisableUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/users/disable', - body: requestBody, - mediaType: 'application/json', - errors: { - 400: `Bad Request`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postUsersEnable({ - requestBody, - }: { - requestBody?: EnableUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/users/enable', - body: requestBody, - mediaType: 'application/json', - errors: { - 400: `Bad Request`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getUsersFilter({ - skip, - take = 100, - orderBy, - orderDirection, - userGroupIds, - userStates, - filter = '', - }: { - skip?: number, - take?: number, - orderBy?: UserOrderModel, - orderDirection?: DirectionModel, - userGroupIds?: Array, - userStates?: Array, - filter?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/users/filter', - query: { - 'skip': skip, - 'take': take, - 'orderBy': orderBy, - 'orderDirection': orderDirection, - 'userGroupIds': userGroupIds, - 'userStates': userStates, - 'filter': filter, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postUsersInvite({ - requestBody, - }: { - requestBody?: InviteUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/users/invite', - body: requestBody, - mediaType: 'application/json', - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postUsersSetUserGroups({ - requestBody, - }: { - requestBody?: UpdateUserGroupsOnUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/users/set-user-groups', - body: requestBody, - mediaType: 'application/json', - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postUsersUnlock({ - requestBody, - }: { - requestBody?: UnlockUsersRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/users/unlock', - body: requestBody, - mediaType: 'application/json', - errors: { - 400: `Bad Request`, - }, - }); - } - -} diff --git a/src/Umbraco.Web.UI.Client/libs/collection/collection.context.ts b/src/Umbraco.Web.UI.Client/libs/collection/collection.context.ts new file mode 100644 index 0000000000..6f0ae47adc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/collection/collection.context.ts @@ -0,0 +1,149 @@ +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { + UmbArrayState, + UmbNumberState, + UmbObjectState, + UmbObserverController, +} from '@umbraco-cms/backoffice/observable-api'; +import { umbExtensionsRegistry, createExtensionClass } from '@umbraco-cms/backoffice/extensions-api'; +import { UmbCollectionRepository } from '@umbraco-cms/backoffice/repository'; +import type { UmbFilterModel } from '@umbraco-cms/backoffice/models'; + +// TODO: Clean up the need for store as Media has switched to use Repositories(repository). +export class UmbCollectionContext { + private _host: UmbControllerHostElement; + private _entityType: string | null; + + protected _dataObserver?: UmbObserverController; + + #items = new UmbArrayState([]); + public readonly items = this.#items.asObservable(); + + #total = new UmbNumberState(0); + public readonly total = this.#total.asObservable(); + + #selection = new UmbArrayState([]); + public readonly selection = this.#selection.asObservable(); + + #filter = new UmbObjectState({}); + public readonly filter = this.#filter.asObservable(); + + repository?: UmbCollectionRepository; + + /* + TODO: + private _search = new StringState(''); + public readonly search = this._search.asObservable(); + */ + + constructor(host: UmbControllerHostElement, entityType: string | null, repositoryAlias: string) { + this._entityType = entityType; + this._host = host; + + new UmbObserverController( + this._host, + umbExtensionsRegistry.getByTypeAndAlias('repository', repositoryAlias), + async (repositoryManifest) => { + if (repositoryManifest) { + const result = await createExtensionClass(repositoryManifest, [this._host]); + this.repository = result; + this._onRepositoryReady(); + } + } + ); + } + + public isSelected(id: string) { + return this.#selection.getValue().includes(id); + } + + public setSelection(value: Array) { + if (!value) return; + this.#selection.next(value); + } + + public clearSelection() { + this.#selection.next([]); + } + + public select(id: string) { + this.#selection.appendOne(id); + } + + public deselect(id: string) { + this.#selection.filter((k) => k !== id); + } + + // TODO: how can we make sure to call this. + public destroy(): void { + this.#items.unsubscribe(); + } + + public getEntityType() { + return this._entityType; + } + + /* + public getData() { + return this.#data.getValue(); + } + */ + + /* + public update(data: Partial) { + this._data.next({ ...this.getData(), ...data }); + } + */ + + // protected _onStoreSubscription(): void { + // if (!this._store) { + // return; + // } + + // this._dataObserver?.destroy(); + + // if (this._entityId) { + // this._dataObserver = new UmbObserverController( + // this._host, + // this._store.getTreeItemChildren(this._entityId), + // (nodes) => { + // if (nodes) { + // this.#data.next(nodes); + // } + // } + // ); + // } else { + // this._dataObserver = new UmbObserverController(this._host, this._store.getTreeRoot(), (nodes) => { + // if (nodes) { + // this.#data.next(nodes); + // } + // }); + // } + // } + + protected async _onRepositoryReady() { + if (!this.repository) return; + this.requestCollection(); + } + + public async requestCollection() { + if (!this.repository) return; + + const filter = this.#filter.getValue(); + const { data } = await this.repository.requestCollection(filter); + + if (data) { + this.#total.next(data.total); + this.#items.next(data.items); + } + } + + // TODO: find better name + setFilter(filter: Partial) { + this.#filter.next({ ...this.#filter.getValue(), ...filter }); + this.requestCollection(); + } +} + +export const UMB_COLLECTION_CONTEXT_TOKEN = new UmbContextToken>('UmbCollectionContext'); diff --git a/src/Umbraco.Web.UI.Client/libs/collection/index.ts b/src/Umbraco.Web.UI.Client/libs/collection/index.ts new file mode 100644 index 0000000000..7dc5e58379 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/collection/index.ts @@ -0,0 +1 @@ +export * from './collection.context'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-container-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/libs/content-type/content-type-container-structure-helper.class.ts similarity index 73% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-container-structure-helper.class.ts rename to src/Umbraco.Web.UI.Client/libs/content-type/content-type-container-structure-helper.class.ts index 5a76262c13..44d4a2d08e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-container-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/libs/content-type/content-type-container-structure-helper.class.ts @@ -1,15 +1,14 @@ -import { UmbDocumentWorkspaceContext } from '../../../../documents/documents/workspace/document-workspace.context'; -import { PropertyContainerTypes } from './workspace-structure-manager.class'; +import { PropertyContainerTypes, UmbContentTypePropertyStructureManager } from './content-type-structure-manager.class'; import { PropertyTypeContainerResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import { UmbContextConsumerController, UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; import { UmbArrayState, UmbBooleanState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -export class UmbWorkspaceContainerStructureHelper { +export class UmbContentTypeContainerStructureHelper { #host: UmbControllerHostElement; #init; + #initResolver?: (value: unknown) => void; - #workspaceContext?: UmbDocumentWorkspaceContext; + #structure?: UmbContentTypePropertyStructureManager; private _ownerType?: PropertyContainerTypes = 'Tab'; private _childType?: PropertyContainerTypes = 'Group'; @@ -30,13 +29,18 @@ export class UmbWorkspaceContainerStructureHelper { constructor(host: UmbControllerHostElement) { this.#host = host; + this.#init = new Promise((resolve) => { + this.#initResolver = resolve; + }); this.#containers.sortBy((a, b) => (a.sortOrder || 0) - (b.sortOrder || 0)); + } - this.#init = new UmbContextConsumerController(host, UMB_ENTITY_WORKSPACE_CONTEXT, (context) => { - this.#workspaceContext = context as UmbDocumentWorkspaceContext; - this._observeOwnerContainers(); - }).asPromise(); + public setStructureManager(structure: UmbContentTypePropertyStructureManager) { + this.#structure = structure; + this.#initResolver?.(undefined); + this.#initResolver = undefined; + this._observeOwnerContainers(); } public setType(value?: PropertyContainerTypes) { @@ -76,7 +80,7 @@ export class UmbWorkspaceContainerStructureHelper { } private _observeOwnerContainers() { - if (!this.#workspaceContext) return; + if (!this.#structure) return; if (this._isRoot) { this.#containers.next([]); @@ -86,7 +90,7 @@ export class UmbWorkspaceContainerStructureHelper { } else if (this._ownerName && this._ownerType) { new UmbObserverController( this.#host, - this.#workspaceContext.structure.containersByNameAndType(this._ownerName, this._ownerType), + this.#structure.containersByNameAndType(this._ownerName, this._ownerType), (ownerContainers) => { this.#containers.next([]); this._ownerContainers = ownerContainers || []; @@ -101,12 +105,12 @@ export class UmbWorkspaceContainerStructureHelper { } private _observeOwnerProperties() { - if (!this.#workspaceContext) return; + if (!this.#structure) return; this._ownerContainers.forEach((container) => { new UmbObserverController( this.#host, - this.#workspaceContext!.structure.hasPropertyStructuresOf(container.id!), + this.#structure!.hasPropertyStructuresOf(container.id!), (hasProperties) => { this.#hasProperties.next(hasProperties); }, @@ -116,12 +120,12 @@ export class UmbWorkspaceContainerStructureHelper { } private _observeChildContainers() { - if (!this.#workspaceContext || !this._ownerName || !this._childType) return; + if (!this.#structure || !this._ownerName || !this._childType) return; this._ownerContainers.forEach((container) => { new UmbObserverController( this.#host, - this.#workspaceContext!.structure.containersOfParentKey(container.id, this._childType!), + this.#structure!.containersOfParentKey(container.id, this._childType!), this._insertGroupContainers, '_observeGroupsOf_' + container.id ); @@ -129,11 +133,11 @@ export class UmbWorkspaceContainerStructureHelper { } private _observeRootContainers() { - if (!this.#workspaceContext || !this._isRoot) return; + if (!this.#structure || !this._isRoot) return; new UmbObserverController( this.#host, - this.#workspaceContext!.structure.rootContainers(this._childType!), + this.#structure.rootContainers(this._childType!), (rootContainers) => { this.#containers.next([]); this._insertGroupContainers(rootContainers); @@ -156,7 +160,7 @@ export class UmbWorkspaceContainerStructureHelper { * Returns true if the container is an owner container. */ isOwnerContainer(groupId?: string) { - if (!this.#workspaceContext || !groupId) return; + if (!this.#structure || !groupId) return; return this._ownerContainers.find((x) => x.id === groupId) !== undefined; } @@ -164,15 +168,15 @@ export class UmbWorkspaceContainerStructureHelper { /** Manipulate methods: */ async addContainer(ownerId?: string, sortOrder?: number) { - if (!this.#workspaceContext) return; + if (!this.#structure) return; - await this.#workspaceContext.structure.createContainer(null, ownerId, this._childType, sortOrder); + await this.#structure.createContainer(null, ownerId, this._childType, sortOrder); } async partialUpdateContainer(groupId?: string, partialUpdate?: Partial) { await this.#init; - if (!this.#workspaceContext || !groupId || !partialUpdate) return; + if (!this.#structure || !groupId || !partialUpdate) return; - return await this.#workspaceContext.structure.updateContainer(null, groupId, partialUpdate); + return await this.#structure.updateContainer(null, groupId, partialUpdate); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-helper.class.ts b/src/Umbraco.Web.UI.Client/libs/content-type/content-type-property-structure-helper.class.ts similarity index 69% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-helper.class.ts rename to src/Umbraco.Web.UI.Client/libs/content-type/content-type-property-structure-helper.class.ts index 0df98340b0..6105ef98bc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-property-structure-helper.class.ts +++ b/src/Umbraco.Web.UI.Client/libs/content-type/content-type-property-structure-helper.class.ts @@ -1,18 +1,17 @@ -import { UmbDocumentWorkspaceContext } from '../../../../documents/documents/workspace/document-workspace.context'; -import { PropertyContainerTypes } from './workspace-structure-manager.class'; +import { PropertyContainerTypes, UmbContentTypePropertyStructureManager } from './content-type-structure-manager.class'; import { DocumentTypePropertyTypeResponseModel, PropertyTypeResponseModelBaseModel, } from '@umbraco-cms/backoffice/backend-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import { UmbContextConsumerController, UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; import { UmbArrayState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -export class UmbWorkspacePropertyStructureHelper { +export class UmbContentTypePropertyStructureHelper { #host: UmbControllerHostElement; #init; + #initResolver?: (value: unknown) => void; - #workspaceContext?: UmbDocumentWorkspaceContext; + #structure?: UmbContentTypePropertyStructureManager; private _containerType?: PropertyContainerTypes; private _isRoot?: boolean; @@ -23,12 +22,18 @@ export class UmbWorkspacePropertyStructureHelper { constructor(host: UmbControllerHostElement) { this.#host = host; + this.#init = new Promise((resolve) => { + this.#initResolver = resolve; + }); // TODO: Remove as any when sortOrder is implemented: this.#propertyStructure.sortBy((a, b) => ((a as any).sortOrder ?? 0) - ((b as any).sortOrder ?? 0)); - this.#init = new UmbContextConsumerController(host, UMB_ENTITY_WORKSPACE_CONTEXT, (context) => { - this.#workspaceContext = context as UmbDocumentWorkspaceContext; - this._observeGroupContainers(); - }).asPromise(); + } + + public setStructureManager(structure: UmbContentTypePropertyStructureManager) { + this.#structure = structure; + this.#initResolver?.(undefined); + this.#initResolver = undefined; + this._observeGroupContainers(); } public setContainerType(value?: PropertyContainerTypes) { @@ -59,14 +64,14 @@ export class UmbWorkspacePropertyStructureHelper { } private _observeGroupContainers() { - if (!this.#workspaceContext || !this._containerType) return; + if (!this.#structure || !this._containerType) return; if (this._isRoot === true) { this._observePropertyStructureOf(null); } else if (this._containerName !== undefined) { new UmbObserverController( this.#host, - this.#workspaceContext!.structure.containersByNameAndType(this._containerName, this._containerType), + this.#structure.containersByNameAndType(this._containerName, this._containerType), (groupContainers) => { groupContainers.forEach((group) => this._observePropertyStructureOf(group.id)); }, @@ -76,11 +81,11 @@ export class UmbWorkspacePropertyStructureHelper { } private _observePropertyStructureOf(groupId?: string | null) { - if (!this.#workspaceContext || groupId === undefined) return; + if (!this.#structure || groupId === undefined) return; new UmbObserverController( this.#host, - this.#workspaceContext.structure.propertyStructuresOf(groupId), + this.#structure.propertyStructuresOf(groupId), (properties) => { // If this need to be able to remove properties, we need to clean out the ones of this group.id before inserting them: const _propertyStructure = this.#propertyStructure.getValue().filter((x) => x.containerId !== groupId); @@ -103,35 +108,35 @@ export class UmbWorkspacePropertyStructureHelper { async addProperty(ownerId?: string, sortOrder?: number) { await this.#init; - if (!this.#workspaceContext) return; + if (!this.#structure) return; - return await this.#workspaceContext.structure.createProperty(null, ownerId, sortOrder); + return await this.#structure.createProperty(null, ownerId, sortOrder); } async insertProperty(property: PropertyTypeResponseModelBaseModel, sortOrder = 0) { await this.#init; - if (!this.#workspaceContext) return false; + if (!this.#structure) return false; const newProperty = { ...property, sortOrder }; // TODO: Remove as any when server model has gotten sortOrder: - await this.#workspaceContext.structure.insertProperty(null, newProperty); + await this.#structure.insertProperty(null, newProperty); return true; } async removeProperty(propertyId: string) { await this.#init; - if (!this.#workspaceContext) return false; + if (!this.#structure) return false; - await this.#workspaceContext.structure.removeProperty(null, propertyId); + await this.#structure.removeProperty(null, propertyId); return true; } // Takes optional arguments as this is easier for the implementation in the view: async partialUpdateProperty(propertyKey?: string, partialUpdate?: Partial) { await this.#init; - if (!this.#workspaceContext || !propertyKey || !partialUpdate) return; + if (!this.#structure || !propertyKey || !partialUpdate) return; - return await this.#workspaceContext.structure.updateProperty(null, propertyKey, partialUpdate); + return await this.#structure.updateProperty(null, propertyKey, partialUpdate); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-structure-manager.class.ts b/src/Umbraco.Web.UI.Client/libs/content-type/content-type-structure-manager.class.ts similarity index 86% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-structure-manager.class.ts rename to src/Umbraco.Web.UI.Client/libs/content-type/content-type-structure-manager.class.ts index bbce77931d..e2612f1a51 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/workspace-structure-manager.class.ts +++ b/src/Umbraco.Web.UI.Client/libs/content-type/content-type-structure-manager.class.ts @@ -1,11 +1,10 @@ -import { UmbDocumentTypeRepository } from '../../../../documents/document-types/repository/document-type.repository'; -import { generateGuid } from '@umbraco-cms/backoffice/utils'; +import { UmbDetailRepository } from '../repository'; +import { UmbId } from '@umbraco-cms/backoffice/id'; import { - DocumentTypeResponseModel, DocumentTypePropertyTypeResponseModel, PropertyTypeContainerResponseModelBaseModel, - ContentTypeResponseModelBaseDocumentTypePropertyTypeResponseModelDocumentTypePropertyTypeContainerResponseModel, PropertyTypeResponseModelBaseModel, + DocumentTypeResponseModel, } from '@umbraco-cms/backoffice/backend-api'; import { UmbControllerHostElement, UmbControllerInterface } from '@umbraco-cms/backoffice/controller'; import { @@ -19,15 +18,14 @@ import { export type PropertyContainerTypes = 'Group' | 'Tab'; -// TODO: get this type from the repository, or use some generic type. type T = DocumentTypeResponseModel; -// TODO: make general interface for NodeTypeRepository, to replace UmbDocumentTypeRepository: -export class UmbWorkspacePropertyStructureManager { +// TODO: get this type from the repository, or use some generic type. +export class UmbContentTypePropertyStructureManager = UmbDetailRepository> { #host: UmbControllerHostElement; #init!: Promise; - #documentTypeRepository: R; + #contentTypeRepository: R; #rootDocumentTypeId?: string; #documentTypeObservers = new Array(); @@ -41,14 +39,10 @@ export class UmbWorkspacePropertyStructureManager { documentTypes.forEach((documentType) => { - // We could cache by docType Key? - // TODO: how do we ensure a container goes away? - - //this._initDocumentTypeContainers(documentType); this._loadDocumentTypeCompositions(documentType); }); }); @@ -77,7 +71,7 @@ export class UmbWorkspacePropertyStructureManager { + new UmbObserverController(this.#host, await this.#contentTypeRepository.byId(data.id), (docType) => { if (docType) { - // TODO: Handle if there was changes made to the specific document type in this context. + // TODO: Handle if there was changes made to the owner document type in this context. /* possible easy solutions could be to notify user wether they want to update(Discard the changes to accept the new ones). */ @@ -153,26 +145,26 @@ export class UmbWorkspacePropertyStructureManager x.id === documentTypeKey)?.containers ?? [])]; + const containers = [...(this.#documentTypes.getValue().find((x) => x.id === contentTypeId)?.containers ?? [])]; containers.push(container); - this.#documentTypes.updateOne(documentTypeKey, { containers }); + this.#documentTypes.updateOne(contentTypeId, { containers }); return container; } @@ -207,7 +199,7 @@ export class UmbWorkspacePropertyStructureManager { return data.filter((x) => x.name === name && x.type === containerType); diff --git a/src/Umbraco.Web.UI.Client/libs/content-type/index.ts b/src/Umbraco.Web.UI.Client/libs/content-type/index.ts new file mode 100644 index 0000000000..a47e7f2afb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/content-type/index.ts @@ -0,0 +1,3 @@ +export * from './content-type-container-structure-helper.class'; +export * from './content-type-property-structure-helper.class'; +export * from './content-type-structure-manager.class'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-api/create-extension-element.function.ts b/src/Umbraco.Web.UI.Client/libs/extensions-api/create-extension-element.function.ts index ccb92df877..4b051ceea7 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-api/create-extension-element.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-api/create-extension-element.function.ts @@ -3,33 +3,34 @@ import { isManifestElementNameType } from './is-manifest-element-name-type.funct import { loadExtension } from './load-extension.function'; import type { HTMLElementConstructor } from '@umbraco-cms/backoffice/models'; import type { ManifestElement } from '@umbraco-cms/backoffice/extensions-registry'; -import type { PageComponent } from '@umbraco-cms/backoffice/router'; -export async function createExtensionElement(manifest: ManifestElement): Promise { +export async function createExtensionElement( + manifest: ManifestElement +): Promise { //TODO: Write tests for these extension options: const js = await loadExtension(manifest); if (isManifestElementNameType(manifest)) { // created by manifest method providing HTMLElement - return document.createElement(manifest.elementName); + return document.createElement(manifest.elementName) as ElementType; } // TODO: Do we need this except for the default() loader? if (js) { - if (hasDefaultExport(js)) { - // created by default class + if (hasDefaultExport>(js)) { + // Element will be created by default class return new js.default(); } + // If some JS was loaded and manifest did not have a elementName neither it the JS file contain a default export, so we will fail: console.error( '-- Extension did not succeed creating an element, missing a default export of the served JavaScript file', manifest ); - - // If some JS was loaded and it did not at least contain a default export, then we are safe to assume that it executed its side effects and does not need to be returned return undefined; } + // If some JS was loaded and manifest did not have a elementName neither it the JS file contain a default export, so we will fail: console.error( '-- Extension did not succeed creating an element, missing a default export or `elementName` in the manifest.', manifest diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-classable-type.function.ts b/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-classable-type.function.ts index 1b80efcbc7..d464e0bb99 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-classable-type.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-classable-type.function.ts @@ -4,5 +4,5 @@ import { isManifestClassConstructorType } from './is-manifest-class-instance-typ import type { ManifestBase, ManifestClass } from '@umbraco-cms/backoffice/extensions-registry'; export function isManifestClassableType(manifest: ManifestBase): manifest is ManifestClass { - return isManifestClassConstructorType(manifest) || isManifestLoaderType(manifest) || isManifestJSType(manifest); + return isManifestClassConstructorType(manifest) || isManifestLoaderType(manifest) || isManifestJSType(manifest); } diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-elementable-type.function.ts b/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-elementable-type.function.ts index c794099245..48ac06a7e0 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-elementable-type.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-elementable-type.function.ts @@ -3,6 +3,10 @@ import { isManifestJSType } from './is-manifest-js-type.function'; import { isManifestLoaderType } from './is-manifest-loader-type.function'; import type { ManifestElement, ManifestBase } from '@umbraco-cms/backoffice/extensions-registry'; -export function isManifestElementableType(manifest: ManifestBase): manifest is ManifestElement { - return isManifestElementNameType(manifest) || isManifestLoaderType(manifest) || isManifestJSType(manifest); +export function isManifestElementableType(manifest: ManifestBase): manifest is ManifestElement { + return ( + isManifestElementNameType(manifest) || + isManifestLoaderType(manifest) || + isManifestJSType(manifest) + ); } diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-js-type.function.ts b/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-js-type.function.ts index 9d4cfbf7b8..eb450b24a7 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-js-type.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-js-type.function.ts @@ -1,6 +1,6 @@ -import { ManifestJSType } from './load-extension.function'; -import type { ManifestBase } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestBase, ManifestWithLoader } from '@umbraco-cms/backoffice/extensions-registry'; -export function isManifestJSType(manifest: ManifestBase | unknown): manifest is ManifestJSType { - return (manifest as ManifestJSType).js !== undefined; +export type ManifestJSType = ManifestWithLoader & { js: string }; +export function isManifestJSType(manifest: ManifestBase | unknown): manifest is ManifestJSType { + return (manifest as ManifestJSType).js !== undefined; } diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-loader-type.function.ts b/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-loader-type.function.ts index 1f018b2d6f..389813a00d 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-loader-type.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-api/is-manifest-loader-type.function.ts @@ -1,6 +1,8 @@ -import { ManifestLoaderType } from './load-extension.function'; -import type { ManifestBase } from '@umbraco-cms/backoffice/extensions-registry'; -export function isManifestLoaderType(manifest: ManifestBase): manifest is ManifestLoaderType { - return typeof (manifest as ManifestLoaderType).loader === 'function'; +import type { ManifestBase, ManifestWithLoader } from '@umbraco-cms/backoffice/extensions-registry'; +export type ManifestLoaderType = ManifestWithLoader & { + loader: () => Promise; +}; +export function isManifestLoaderType(manifest: ManifestBase): manifest is ManifestLoaderType { + return typeof (manifest as ManifestLoaderType).loader === 'function'; } diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-api/load-extension.function.ts b/src/Umbraco.Web.UI.Client/libs/extensions-api/load-extension.function.ts index 7e0c0ebda3..68a6ff713c 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-api/load-extension.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-api/load-extension.function.ts @@ -1,17 +1,14 @@ import { isManifestJSType } from './is-manifest-js-type.function'; import { isManifestLoaderType } from './is-manifest-loader-type.function'; -import type { ManifestElement } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestWithLoader } from '@umbraco-cms/backoffice/extensions-registry'; -export type ManifestLoaderType = ManifestElement & { loader: () => Promise }; -export type ManifestJSType = ManifestElement & { js: string }; - -export async function loadExtension(manifest: ManifestElement): Promise { +export async function loadExtension(manifest: ManifestWithLoader): Promise { try { - if (isManifestLoaderType(manifest)) { + if (isManifestLoaderType(manifest)) { return manifest.loader(); } - if (isManifestJSType(manifest) && manifest.js) { + if (isManifestJSType(manifest) && manifest.js) { return await import(/* @vite-ignore */ manifest.js); } } catch (err: any) { diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/external-login-provider.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/external-login-provider.models.ts deleted file mode 100644 index ebc0588bc9..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/external-login-provider.models.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { ManifestElement } from './models'; - -export interface ManifestExternalLoginProvider extends ManifestElement { - type: 'externalLoginProvider'; - meta: MetaExternalLoginProvider; -} - -export interface MetaExternalLoginProvider { - label: string; - pathname: string; -} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/index.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/index.ts index 3ea5cea392..ad11b648cd 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/index.ts @@ -1,2 +1,3 @@ +export * from './interfaces'; export * from './models'; export * from './entry-point-extension-initializer'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/dashboard-extension-element.interface.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/dashboard-extension-element.interface.ts new file mode 100644 index 0000000000..a485d571da --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/dashboard-extension-element.interface.ts @@ -0,0 +1,5 @@ +import type { ManifestDashboard } from '../models'; + +export interface UmbDashboardExtensionElement extends HTMLElement { + manifest?: ManifestDashboard; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/external-login-provider-extension-element.interface.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/external-login-provider-extension-element.interface.ts new file mode 100644 index 0000000000..92f856ebf1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/external-login-provider-extension-element.interface.ts @@ -0,0 +1,5 @@ +import type { ManifestExternalLoginProvider } from '../models'; + +export interface UmbExternalLoginProviderExtensionElement extends HTMLElement { + manifest?: ManifestExternalLoginProvider; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/index.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/index.ts new file mode 100644 index 0000000000..14fb03e1dc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/index.ts @@ -0,0 +1,10 @@ +export * from './dashboard-extension-element.interface'; +export * from './external-login-provider-extension-element.interface'; +export * from './menu-item-extension-element.interface'; +export * from './modal-extension-element.interface'; +export * from './property-editor-ui-extension-element.interface'; +export * from './section-extension-element.interface'; +export * from './section-sidebar-app-extension-element.interface'; +export * from './section-view-extension-element.interface'; +export * from './tree-item-extension-element.interface'; +export * from './workspace-editor-view-extension-element.interface'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/menu-item-extension-element.interface.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/menu-item-extension-element.interface.ts new file mode 100644 index 0000000000..e962732f6f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/menu-item-extension-element.interface.ts @@ -0,0 +1,5 @@ +import type { ManifestMenuItem } from '../models'; + +export interface UmbMenuItemExtensionElement extends HTMLElement { + manifest?: ManifestMenuItem; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/modal-extension-element.interface.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/modal-extension-element.interface.ts new file mode 100644 index 0000000000..8c7b0c398a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/modal-extension-element.interface.ts @@ -0,0 +1,8 @@ +import type { UmbModalHandler } from '@umbraco-cms/backoffice/modal'; + +export interface UmbModalExtensionElement + extends HTMLElement { + modalHandler?: UmbModalHandler; + + data?: UmbModalData; +} diff --git a/src/Umbraco.Web.UI.Client/libs/property-editor/index.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/property-editor-ui-extension-element.interface.ts similarity index 67% rename from src/Umbraco.Web.UI.Client/libs/property-editor/index.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/property-editor-ui-extension-element.interface.ts index afa798d5e8..44a9bd1e3b 100644 --- a/src/Umbraco.Web.UI.Client/libs/property-editor/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/property-editor-ui-extension-element.interface.ts @@ -1,6 +1,6 @@ import { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; -export interface UmbPropertyEditorElement extends HTMLElement { +export interface UmbPropertyEditorExtensionElement extends HTMLElement { value: unknown; config: DataTypePropertyPresentationModel[]; } diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/section-extension-element.interface.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/section-extension-element.interface.ts new file mode 100644 index 0000000000..653658e71f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/section-extension-element.interface.ts @@ -0,0 +1,5 @@ +import type { ManifestSection } from '../models'; + +export interface UmbSectionExtensionElement extends HTMLElement { + manifest?: ManifestSection; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/section-sidebar-app-extension-element.interface.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/section-sidebar-app-extension-element.interface.ts new file mode 100644 index 0000000000..ebb2c7adea --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/section-sidebar-app-extension-element.interface.ts @@ -0,0 +1,5 @@ +import type { ManifestSectionSidebarApp } from '../models'; + +export interface UmbSectionSidebarAppExtensionElement extends HTMLElement { + manifest?: ManifestSectionSidebarApp; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/section-view-extension-element.interface.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/section-view-extension-element.interface.ts new file mode 100644 index 0000000000..b3dc2123c7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/section-view-extension-element.interface.ts @@ -0,0 +1,5 @@ +import type { ManifestSectionView } from '../models'; + +export interface UmbSectionViewExtensionElement extends HTMLElement { + manifest?: ManifestSectionView; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/tree-item-extension-element.interface.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/tree-item-extension-element.interface.ts new file mode 100644 index 0000000000..3221a65c31 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/tree-item-extension-element.interface.ts @@ -0,0 +1,5 @@ +import { TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; + +export interface UmbTreeItemExtensionElement extends HTMLElement { + item?: TreeItemPresentationModel; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/workspace-editor-view-extension-element.interface.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/workspace-editor-view-extension-element.interface.ts new file mode 100644 index 0000000000..123d3bfa58 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/interfaces/workspace-editor-view-extension-element.interface.ts @@ -0,0 +1,5 @@ +import type { ManifestWorkspaceEditorView } from '../models'; + +export interface UmbWorkspaceEditorViewExtensionElement extends HTMLElement { + manifest?: ManifestWorkspaceEditorView; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/collection-view.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/collection-view.model.ts similarity index 89% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/collection-view.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/collection-view.model.ts index 823ca3bc21..31e4667675 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/collection-view.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/collection-view.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement, ManifestWithConditions } from './models'; +import type { ManifestElement, ManifestWithConditions } from '.'; export interface ManifestCollectionView extends ManifestElement, ManifestWithConditions { type: 'collectionView'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/dashboard-collection.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/dashboard-collection.model.ts similarity index 89% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/dashboard-collection.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/dashboard-collection.model.ts index 3255547b42..2ce68be8da 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/dashboard-collection.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/dashboard-collection.model.ts @@ -1,4 +1,4 @@ -import type { ManifestBase } from './models'; +import type { ManifestBase } from '.'; export interface ManifestDashboardCollection extends ManifestBase { type: 'dashboardCollection'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/dashboard.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/dashboard.model.ts similarity index 73% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/dashboard.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/dashboard.model.ts index 033e554623..1bbdb5c903 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/dashboard.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/dashboard.model.ts @@ -1,6 +1,9 @@ -import type { ManifestElement, ManifestWithConditions } from './models'; +import type { UmbDashboardExtensionElement } from '../interfaces'; +import type { ManifestElement, ManifestWithConditions } from '.'; -export interface ManifestDashboard extends ManifestElement, ManifestWithConditions { +export interface ManifestDashboard + extends ManifestElement, + ManifestWithConditions { type: 'dashboard'; meta: MetaDashboard; } diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/entity-action.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/entity-action.model.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/entity-action.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/entity-action.model.ts index 4816f084fd..3c2dd26ecb 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/entity-action.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/entity-action.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement } from './models'; +import type { ManifestElement } from '.'; /** * An action to perform on an entity diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/entity-bulk-action.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/entity-bulk-action.model.ts similarity index 91% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/entity-bulk-action.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/entity-bulk-action.model.ts index 5564bb5b5d..c1e7fc8728 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/entity-bulk-action.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/entity-bulk-action.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement, ManifestWithConditions } from './models'; +import type { ManifestElement, ManifestWithConditions } from '.'; /** * An action to perform on multiple entities diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/external-login-provider.model.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/external-login-provider.model.ts new file mode 100644 index 0000000000..c51d5df20c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/external-login-provider.model.ts @@ -0,0 +1,12 @@ +import type { UmbExternalLoginProviderExtensionElement } from '../interfaces/external-login-provider-extension-element.interface'; +import type { ManifestElement } from '.'; + +export interface ManifestExternalLoginProvider extends ManifestElement { + type: 'externalLoginProvider'; + meta: MetaExternalLoginProvider; +} + +export interface MetaExternalLoginProvider { + label: string; + pathname: string; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/header-app.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/header-app.model.ts similarity index 92% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/header-app.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/header-app.model.ts index e6e990c591..06932383aa 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/header-app.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/header-app.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement } from './models'; +import type { ManifestElement } from '.'; /** * Header apps are displayed in the top right corner of the backoffice diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/health-check.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/health-check.model.ts similarity index 84% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/health-check.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/health-check.model.ts index 110418e215..b95dedf7eb 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/health-check.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/health-check.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement } from './models'; +import type { ManifestElement } from '.'; export interface ManifestHealthCheck extends ManifestElement { type: 'healthCheck'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/index.ts similarity index 63% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/index.ts index 7e336f7d1d..def8693ca7 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/index.ts @@ -1,59 +1,60 @@ -import type { ManifestCollectionView } from './collection-view.models'; -import type { ManifestDashboard } from './dashboard.models'; -import type { ManifestDashboardCollection } from './dashboard-collection.models'; -import type { ManifestEntityAction } from './entity-action.models'; -import type { ManifestEntityBulkAction } from './entity-bulk-action.models'; -import type { ManifestExternalLoginProvider } from './external-login-provider.models'; -import type { ManifestHeaderApp, ManifestHeaderAppButtonKind } from './header-app.models'; -import type { ManifestHealthCheck } from './health-check.models'; -import type { ManifestPackageView } from './package-view.models'; -import type { ManifestPropertyAction } from './property-action.models'; -import type { ManifestPropertyEditorUI, ManifestPropertyEditorModel } from './property-editor.models'; -import type { ManifestSection } from './section.models'; -import type { ManifestSectionView } from './section-view.models'; -import type { ManifestSectionSidebarApp, ManifestSectionSidebarAppMenuKind } from './section-sidebar-app.models'; -import type { ManifestMenu } from './menu.models'; -import type { ManifestMenuItem, ManifestMenuItemTreeKind } from './menu-item.models'; -import type { ManifestTheme } from './theme.models'; -import type { ManifestTree } from './tree.models'; -import type { ManifestTreeItem } from './tree-item.models'; -import type { ManifestUserProfileApp } from './user-profile-app.models'; -import type { ManifestWorkspace } from './workspace.models'; -import type { ManifestWorkspaceAction } from './workspace-action.models'; -import type { ManifestWorkspaceView } from './workspace-view.models'; -import type { ManifestWorkspaceViewCollection } from './workspace-view-collection.models'; -import type { ManifestRepository } from './repository.models'; -import type { ManifestModal } from './modal.models'; -import type { ManifestStore, ManifestTreeStore, ManifestItemStore } from './store.models'; +import type { ManifestCollectionView } from './collection-view.model'; +import type { ManifestDashboard } from './dashboard.model'; +import type { ManifestDashboardCollection } from './dashboard-collection.model'; +import type { ManifestEntityAction } from './entity-action.model'; +import type { ManifestEntityBulkAction } from './entity-bulk-action.model'; +import type { ManifestExternalLoginProvider } from './external-login-provider.model'; +import type { ManifestHeaderApp, ManifestHeaderAppButtonKind } from './header-app.model'; +import type { ManifestHealthCheck } from './health-check.model'; +import type { ManifestMenu } from './menu.model'; +import type { ManifestMenuItem, ManifestMenuItemTreeKind } from './menu-item.model'; +import type { ManifestModal } from './modal.model'; +import type { ManifestPackageView } from './package-view.model'; +import type { ManifestPropertyAction } from './property-action.model'; +import type { ManifestPropertyEditorUI, ManifestPropertyEditorModel } from './property-editor.model'; +import type { ManifestRepository } from './repository.model'; +import type { ManifestSection } from './section.model'; +import type { ManifestSectionSidebarApp, ManifestSectionSidebarAppMenuKind } from './section-sidebar-app.model'; +import type { ManifestSectionView } from './section-view.model'; +import type { ManifestStore, ManifestTreeStore, ManifestItemStore } from './store.model'; +import type { ManifestTheme } from './theme.model'; +import type { ManifestTree } from './tree.model'; +import type { ManifestTreeItem } from './tree-item.model'; +import type { ManifestUserProfileApp } from './user-profile-app.model'; +import type { ManifestWorkspace } from './workspace.model'; +import type { ManifestWorkspaceAction } from './workspace-action.model'; +import type { ManifestWorkspaceEditorView } from './workspace-editor-view.model'; +import type { ManifestWorkspaceViewCollection } from './workspace-view-collection.model'; + import type { ClassConstructor } from '@umbraco-cms/backoffice/models'; -export * from './collection-view.models'; -export * from './dashboard-collection.models'; -export * from './dashboard.models'; -export * from './entity-action.models'; -export * from './entity-bulk-action.models'; -export * from './external-login-provider.models'; -export * from './header-app.models'; -export * from './health-check.models'; -export * from './package-view.models'; -export * from './property-action.models'; -export * from './property-editor.models'; -export * from './section-view.models'; -export * from './section.models'; -export * from './section-sidebar-app.models'; -export * from './menu.models'; -export * from './menu-item.models'; -export * from './theme.models'; -export * from './tree.models'; -export * from './tree-item.models'; -export * from './user-profile-app.models'; -export * from './workspace-action.models'; -export * from './workspace-view-collection.models'; -export * from './workspace-view.models'; -export * from './repository.models'; -export * from './store.models'; -export * from './workspace.models'; -export * from './modal.models'; +export * from './collection-view.model'; +export * from './dashboard-collection.model'; +export * from './dashboard.model'; +export * from './entity-action.model'; +export * from './entity-bulk-action.model'; +export * from './external-login-provider.model'; +export * from './header-app.model'; +export * from './health-check.model'; +export * from './menu-item.model'; +export * from './menu.model'; +export * from './modal.model'; +export * from './package-view.model'; +export * from './property-action.model'; +export * from './property-editor.model'; +export * from './repository.model'; +export * from './section-sidebar-app.model'; +export * from './section-view.model'; +export * from './section.model'; +export * from './store.model'; +export * from './theme.model'; +export * from './tree-item.model'; +export * from './tree.model'; +export * from './user-profile-app.model'; +export * from './workspace-action.model'; +export * from './workspace-view-collection.model'; +export * from './workspace-editor-view.model'; +export * from './workspace.model'; export type ManifestTypes = | ManifestCollectionView @@ -66,6 +67,11 @@ export type ManifestTypes = | ManifestHeaderApp | ManifestHeaderAppButtonKind | ManifestHealthCheck + | ManifestItemStore + | ManifestMenu + | ManifestMenuItem + | ManifestMenuItemTreeKind + | ManifestModal | ManifestPackageView | ManifestPropertyAction | ManifestPropertyEditorModel @@ -75,21 +81,16 @@ export type ManifestTypes = | ManifestSectionSidebarApp | ManifestSectionSidebarAppMenuKind | ManifestSectionView - | ManifestMenu - | ManifestMenuItem - | ManifestMenuItemTreeKind + | ManifestStore | ManifestTheme | ManifestTree | ManifestTreeItem + | ManifestTreeStore | ManifestUserProfileApp | ManifestWorkspace | ManifestWorkspaceAction - | ManifestWorkspaceView + | ManifestWorkspaceEditorView | ManifestWorkspaceViewCollection - | ManifestModal - | ManifestStore - | ManifestTreeStore - | ManifestItemStore | ManifestBase; export type ManifestStandardTypes = ManifestTypes['type']; @@ -155,8 +156,10 @@ export interface ManifestWithLoader extends ManifestBase { /** * The type of extension such as dashboard etc... */ -export interface ManifestClass extends ManifestWithLoader { +export interface ManifestClass + extends ManifestWithLoader<{ default: ClassConstructor }> { //type: ManifestStandardTypes; + readonly CLASS_TYPE?: ClassType; /** * The file location of the javascript file to load @@ -172,16 +175,18 @@ export interface ManifestClass extends ManifestWithLoader { /** * @TJS-ignore */ - class?: ClassConstructor; + class?: ClassConstructor; //loader?: () => Promise; } -export interface ManifestClassWithClassConstructor extends ManifestClass { - class: ClassConstructor; +export interface ManifestClassWithClassConstructor extends ManifestClass { + class: ClassConstructor; } -export interface ManifestElement extends ManifestWithLoader { +export interface ManifestElement + extends ManifestWithLoader<{ default: ClassConstructor } | Omit> { //type: ManifestStandardTypes; + readonly ELEMENT_TYPE?: ElementType; /** * The file location of the javascript file to load @@ -204,7 +209,7 @@ export interface ManifestElement extends ManifestWithLoader extends ManifestElement { meta: MetaManifestWithView; } diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/menu-item.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/menu-item.model.ts similarity index 67% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/menu-item.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/menu-item.model.ts index e27223bbf8..9823ce29e3 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/menu-item.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/menu-item.model.ts @@ -1,6 +1,7 @@ -import type { ManifestElement } from './models'; +import type { UmbMenuItemExtensionElement } from '../interfaces/menu-item-extension-element.interface'; +import type { ManifestElement } from '.'; -export interface ManifestMenuItem extends ManifestElement { +export interface ManifestMenuItem extends ManifestElement { type: 'menuItem'; meta: MetaMenuItem; conditions: ConditionsMenuItem; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/menu.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/menu.model.ts similarity index 60% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/menu.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/menu.model.ts index 5e5b0906de..3ca2a76b3c 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/menu.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/menu.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement } from './models'; +import type { ManifestElement } from '.'; export interface ManifestMenu extends ManifestElement { type: 'menu'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/modal.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/modal.model.ts similarity index 60% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/modal.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/modal.model.ts index 901a998bf5..2bace8be4d 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/modal.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/modal.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement } from './models'; +import type { ManifestElement } from '.'; export interface ManifestModal extends ManifestElement { type: 'modal'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/package-view.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/package-view.model.ts similarity index 77% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/package-view.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/package-view.model.ts index 9a8e05cdae..bcb442f55f 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/package-view.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/package-view.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement } from './models'; +import type { ManifestElement } from '.'; export interface ManifestPackageView extends ManifestElement { type: 'packageView'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/property-action.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/property-action.model.ts similarity index 75% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/property-action.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/property-action.model.ts index 8c98a0da0d..f1a89b43ee 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/property-action.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/property-action.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement, ManifestWithConditions } from './models'; +import type { ManifestElement, ManifestWithConditions } from '.'; export interface ManifestPropertyAction extends ManifestElement, ManifestWithConditions { type: 'propertyAction'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/property-editor.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/property-editor.model.ts similarity index 84% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/property-editor.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/property-editor.model.ts index f52e32162e..0094761351 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/property-editor.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/property-editor.model.ts @@ -1,7 +1,7 @@ -import type { ManifestElement, ManifestBase } from './models'; +import type { UmbPropertyEditorExtensionElement } from '../interfaces'; +import type { ManifestElement, ManifestBase } from '.'; -// UI -export interface ManifestPropertyEditorUI extends ManifestElement { +export interface ManifestPropertyEditorUI extends ManifestElement { type: 'propertyEditorUI'; meta: MetaPropertyEditorUI; } diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/repository.model.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/repository.model.ts new file mode 100644 index 0000000000..93b1d6f81c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/repository.model.ts @@ -0,0 +1,6 @@ +import type { ManifestClass } from '.'; + +// TODO: Consider adding a ClassType for this manifest. (Currently we cannot know the scope of a repository, therefor we are going with unknown for now.) +export interface ManifestRepository extends ManifestClass { + type: 'repository'; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/section-sidebar-app.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/section-sidebar-app.model.ts similarity index 69% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/section-sidebar-app.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/section-sidebar-app.model.ts index c769ded62b..04e842a843 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/section-sidebar-app.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/section-sidebar-app.model.ts @@ -1,6 +1,7 @@ -import type { ManifestElement } from './models'; +import type { UmbSectionSidebarAppExtensionElement } from '../interfaces/section-sidebar-app-extension-element.interface'; +import type { ManifestElement } from '.'; -export interface ManifestSectionSidebarApp extends ManifestElement { +export interface ManifestSectionSidebarApp extends ManifestElement { type: 'sectionSidebarApp'; conditions: ConditionsSectionSidebarApp; } diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/section-view.model.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/section-view.model.ts new file mode 100644 index 0000000000..8353f261a4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/section-view.model.ts @@ -0,0 +1,19 @@ +import type { UmbSectionViewExtensionElement } from '../interfaces/section-view-extension-element.interface'; +import type { ManifestElement, ManifestWithConditions } from '.'; + +export interface ManifestSectionView + extends ManifestElement, + ManifestWithConditions { + type: 'sectionView'; + meta: MetaSectionView; +} + +export interface MetaSectionView { + label: string; + pathname: string; + icon: string; +} + +export interface ConditionsSectionView { + sections: Array; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/section.model.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/section.model.ts new file mode 100644 index 0000000000..d91ffdefd7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/section.model.ts @@ -0,0 +1,12 @@ +import type { UmbSectionExtensionElement } from '../interfaces'; +import type { ManifestElement } from '.'; + +export interface ManifestSection extends ManifestElement { + type: 'section'; + meta: MetaSection; +} + +export interface MetaSection { + label: string; + pathname: string; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/store.model.ts similarity index 88% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/store.model.ts index dbca5d6956..cf738a7266 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/store.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/store.model.ts @@ -1,4 +1,4 @@ -import type { ManifestClass } from './models'; +import type { ManifestClass } from '.'; import { UmbItemStore, UmbStoreBase, UmbTreeStore } from '@umbraco-cms/backoffice/store'; export interface ManifestStore extends ManifestClass { diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/theme.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/theme.model.ts similarity index 88% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/theme.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/theme.model.ts index 0e18a0164a..b220be34b2 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/theme.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/theme.model.ts @@ -1,4 +1,4 @@ -import type { ManifestWithLoader } from './models'; +import type { ManifestWithLoader } from '.'; // TODO: make or find type for JS Module with default export: Would be nice to support css file directly. diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/tree-item.model.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/tree-item.model.ts new file mode 100644 index 0000000000..7f327014a0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/tree-item.model.ts @@ -0,0 +1,11 @@ +import { UmbTreeItemExtensionElement } from '../interfaces'; +import type { ManifestElement } from '.'; + +export interface ManifestTreeItem extends ManifestElement { + type: 'treeItem'; + conditions: ConditionsTreeItem; +} + +export interface ConditionsTreeItem { + entityType: string; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/tree.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/tree.model.ts similarity index 75% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/tree.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/tree.model.ts index 49e8387bb4..61283bbcbb 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/tree.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/tree.model.ts @@ -1,4 +1,4 @@ -import type { ManifestBase } from './models'; +import type { ManifestBase } from '.'; export interface ManifestTree extends ManifestBase { type: 'tree'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/user-profile-app.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/user-profile-app.model.ts similarity index 80% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/user-profile-app.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/user-profile-app.model.ts index 456f6e32d0..41a8207914 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/user-profile-app.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/user-profile-app.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement } from './models'; +import type { ManifestElement } from '.'; export interface ManifestUserProfileApp extends ManifestElement { type: 'userProfileApp'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace-action.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace-action.model.ts similarity index 77% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace-action.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace-action.model.ts index 2cb7595388..927b3fe31e 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace-action.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace-action.model.ts @@ -1,6 +1,7 @@ import type { InterfaceColor, InterfaceLook } from '@umbraco-ui/uui-base/lib/types/index'; -import type { ManifestElement } from './models'; +import type { ManifestElement } from '.'; import type { ClassConstructor } from '@umbraco-cms/backoffice/models'; +import { UmbWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; export interface ManifestWorkspaceAction extends ManifestElement { type: 'workspaceAction'; @@ -12,7 +13,7 @@ export interface MetaWorkspaceAction { label?: string; //TODO: Use or implement additional label-key look?: InterfaceLook; color?: InterfaceColor; - api: ClassConstructor; + api: ClassConstructor; } export interface ConditionsWorkspaceAction { diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace-editor-view.model.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace-editor-view.model.ts new file mode 100644 index 0000000000..61aab74915 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace-editor-view.model.ts @@ -0,0 +1,11 @@ +import type { UmbWorkspaceEditorViewExtensionElement } from '../interfaces/workspace-editor-view-extension-element.interface'; +import type { ManifestWithView } from '.'; + +export interface ManifestWorkspaceEditorView extends ManifestWithView { + type: 'workspaceEditorView'; + conditions: ConditionsWorkspaceView; +} + +export interface ConditionsWorkspaceView { + workspaces: string[]; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace-view-collection.model.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace-view-collection.model.ts new file mode 100644 index 0000000000..c0f53f870f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace-view-collection.model.ts @@ -0,0 +1,16 @@ +import type { ManifestWithConditions, ManifestWithView, MetaManifestWithView } from '.'; + +export interface ManifestWorkspaceViewCollection + extends ManifestWithView, + ManifestWithConditions { + type: 'workspaceViewCollection'; + meta: MetaEditorViewCollection; +} +export interface MetaEditorViewCollection extends MetaManifestWithView { + entityType: string; + repositoryAlias: string; +} + +export interface ConditionsEditorViewCollection { + workspaces: string[]; +} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace.model.ts similarity index 76% rename from src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace.models.ts rename to src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace.model.ts index 4bbc012cd7..d04fea3aa5 100644 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace.models.ts +++ b/src/Umbraco.Web.UI.Client/libs/extensions-registry/models/workspace.model.ts @@ -1,4 +1,4 @@ -import type { ManifestElement } from './models'; +import type { ManifestElement } from '.'; export interface ManifestWorkspace extends ManifestElement { type: 'workspace'; diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/repository.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/repository.models.ts deleted file mode 100644 index 7f4847dd74..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/repository.models.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { ManifestClass } from './models'; - -export interface ManifestRepository extends ManifestClass { - type: 'repository'; -} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/section-view.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/section-view.models.ts deleted file mode 100644 index 5bd892e818..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/section-view.models.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { ManifestElement, ManifestWithConditions } from './models'; - -export interface ManifestSectionView extends ManifestElement, ManifestWithConditions { - type: 'sectionView'; - meta: MetaSectionView; -} - -export interface MetaSectionView { - label: string; - pathname: string; - icon: string; -} - -export interface ConditionsSectionView { - sections: Array; -} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/section.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/section.models.ts deleted file mode 100644 index adeb16d83f..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/section.models.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { ManifestElement } from './models'; - -export interface ManifestSection extends ManifestElement { - type: 'section'; - meta: MetaSection; -} - -export interface MetaSection { - label: string; - pathname: string; -} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/tree-item.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/tree-item.models.ts deleted file mode 100644 index 9231a8ae68..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/tree-item.models.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { ManifestElement } from './models'; - -export interface ManifestTreeItem extends ManifestElement { - type: 'treeItem'; - conditions: ConditionsTreeItem; -} - -export interface ConditionsTreeItem { - entityType: string; -} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace-view-collection.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace-view-collection.models.ts deleted file mode 100644 index 309a2af11b..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace-view-collection.models.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { ManifestBase, ManifestWithConditions } from './models'; - -export interface ManifestWorkspaceViewCollection - extends ManifestBase, - ManifestWithConditions { - type: 'workspaceViewCollection'; - meta: MetaEditorViewCollection; -} - -// TODO: Get rid of store alias, when we are done migrating to repositories(remember to enforce repositoryAlias): -export interface MetaEditorViewCollection { - pathname: string; - label: string; - icon: string; - entityType: string; - storeAlias?: string; - repositoryAlias?: string; -} - -export interface ConditionsEditorViewCollection { - workspaces: string[]; -} diff --git a/src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace-view.models.ts b/src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace-view.models.ts deleted file mode 100644 index 6f2898de75..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/extensions-registry/workspace-view.models.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { ManifestWithView } from './models'; - -export interface ManifestWorkspaceView extends ManifestWithView { - type: 'workspaceView'; - meta: MetaWorkspaceView; - conditions: ConditionsWorkspaceView; -} - -export interface MetaWorkspaceView { - pathname: string; - label: string; - icon: string; -} - -export interface ConditionsWorkspaceView { - workspaces: string[]; -} diff --git a/src/Umbraco.Web.UI.Client/libs/id/index.ts b/src/Umbraco.Web.UI.Client/libs/id/index.ts new file mode 100644 index 0000000000..f5a65afed2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/id/index.ts @@ -0,0 +1,11 @@ +import { v4, validate } from 'uuid'; + +export class UmbId { + public static new() { + return v4(); + } + + public static validate(id: string) { + return validate(id); + } +} diff --git a/src/Umbraco.Web.UI.Client/libs/modal/modal-handler.ts b/src/Umbraco.Web.UI.Client/libs/modal/modal-handler.ts index 43f10f9e14..6a0b00c0bb 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/modal-handler.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/modal-handler.ts @@ -4,10 +4,10 @@ import type { UUIModalSidebarElement, UUIModalSidebarSize, } from '@umbraco-ui/uui'; -import { v4 as uuidv4 } from 'uuid'; import { BehaviorSubject } from 'rxjs'; import { UmbModalConfig, UmbModalType } from './modal.context'; import { UmbModalToken } from './token/modal-token'; +import { UmbId } from '@umbraco-cms/backoffice/id'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; @@ -62,7 +62,7 @@ export class UmbModalHandlerClass string; @@ -26,7 +26,7 @@ export class UmbModalRouteRegistration { multiple: boolean; selection: Array; - filter?: (language: T) => boolean; + filter?: (item: T) => boolean; } -export interface UmbPickerModalResult { +export interface UmbPickerModalResult { selection: Array; } diff --git a/src/Umbraco.Web.UI.Client/libs/modal/token/user-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/user-picker-modal.token.ts index c1bf2c975a..43cced8222 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/token/user-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/user-picker-modal.token.ts @@ -1,7 +1,16 @@ -import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbModalToken, UmbPickerModalData } from '@umbraco-cms/backoffice/modal'; +import { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; -export const UMB_USER_PICKER_MODAL = new UmbModalToken>('Umb.Modal.UserPicker', { - type: 'sidebar', - size: 'small', -}); +export type UmbUserPickerModalData = UmbPickerModalData; + +export interface UmbUserPickerModalResult { + selection: Array; +} + +export const UMB_USER_PICKER_MODAL = new UmbModalToken( + 'Umb.Modal.UserPicker', + { + type: 'sidebar', + size: 'small', + } +); diff --git a/src/Umbraco.Web.UI.Client/libs/models/index.ts b/src/Umbraco.Web.UI.Client/libs/models/index.ts index 0d96ea3bff..d370269599 100644 --- a/src/Umbraco.Web.UI.Client/libs/models/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/models/index.ts @@ -108,3 +108,9 @@ export type PackageManifestResponse = UmbPackage[]; export type UmbPackageWithMigrationStatus = UmbPackage & { hasPendingMigrations: boolean; }; + +export interface UmbFilterModel { + skip?: number; + take?: number; + filter?: string; +} diff --git a/src/Umbraco.Web.UI.Client/libs/notification/notification-handler.test.ts b/src/Umbraco.Web.UI.Client/libs/notification/notification-handler.test.ts index f6b8cd4b5a..76c674f232 100644 --- a/src/Umbraco.Web.UI.Client/libs/notification/notification-handler.test.ts +++ b/src/Umbraco.Web.UI.Client/libs/notification/notification-handler.test.ts @@ -1,9 +1,7 @@ import { assert, expect } from '@open-wc/testing'; -import { validate as uuidValidate } from 'uuid'; - import { UmbNotificationHandler } from './notification-handler'; - import type { UmbNotificationOptions } from './notification.context'; +import { UmbId } from '@umbraco-cms/backoffice/id'; describe('UmbNotificationHandler', () => { let notificationHandler: UmbNotificationHandler; @@ -17,7 +15,7 @@ describe('UmbNotificationHandler', () => { describe('properties', () => { it('has a key property', () => { expect(notificationHandler).to.have.property('key'); - expect(uuidValidate(notificationHandler.key)).to.be.true; + expect(UmbId.validate(notificationHandler.key)).to.be.true; }); it('has an element property', () => { diff --git a/src/Umbraco.Web.UI.Client/libs/notification/notification-handler.ts b/src/Umbraco.Web.UI.Client/libs/notification/notification-handler.ts index 3ef8958993..f6af9a2bd0 100644 --- a/src/Umbraco.Web.UI.Client/libs/notification/notification-handler.ts +++ b/src/Umbraco.Web.UI.Client/libs/notification/notification-handler.ts @@ -1,6 +1,6 @@ import { UUIToastNotificationElement } from '@umbraco-ui/uui'; -import { v4 as uuidv4 } from 'uuid'; import type { UmbNotificationOptions, UmbNotificationColor, UmbNotificationDefaultData } from './notification.context'; +import { UmbId } from '@umbraco-cms/backoffice/id'; /** * @export @@ -27,7 +27,7 @@ export class UmbNotificationHandler { * @memberof UmbNotificationHandler */ constructor(options: UmbNotificationOptions) { - this.key = uuidv4(); + this.key = UmbId.new(); this.color = options.color || this._defaultColor; this.duration = options.duration !== undefined ? options.duration : this._defaultDuration; diff --git a/src/Umbraco.Web.UI.Client/libs/repository/collection-repository.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/collection-repository.interface.ts new file mode 100644 index 0000000000..a0bdaff15a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/repository/collection-repository.interface.ts @@ -0,0 +1,3 @@ +export interface UmbCollectionRepository { + requestCollection(filter?: any): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/libs/repository/data-source/collection-data-source.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/data-source/collection-data-source.interface.ts new file mode 100644 index 0000000000..92ac7cba1e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/repository/data-source/collection-data-source.interface.ts @@ -0,0 +1,7 @@ +import type { UmbPagedData } from '../tree-repository.interface'; +import type { DataSourceResponse } from '../../repository'; + +export interface UmbCollectionDataSource> { + getCollection(): Promise>; + filterCollection(filter: any): Promise>; +} diff --git a/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source-response.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source-response.interface.ts index 2360da75a8..17032a03a1 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source-response.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source-response.interface.ts @@ -1,9 +1,9 @@ -import type { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; +import type { ApiError, CancelError } from '@umbraco-cms/backoffice/backend-api'; export interface DataSourceResponse extends UmbDataSourceErrorResponse { data?: T; } export interface UmbDataSourceErrorResponse { - error?: ProblemDetailsModel; + error?: ApiError | CancelError; } diff --git a/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source.interface.ts index 1721ce3e47..59cba2a69d 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/data-source/data-source.interface.ts @@ -1,9 +1,9 @@ import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; -export interface UmbDataSource { +export interface UmbDataSource { createScaffold(parentId: string | null): Promise>; get(unique: string): Promise>; - insert(data: CreateRequestType): Promise; + insert(data: CreateRequestType): Promise>; update(unique: string, data: UpdateRequestType): Promise>; delete(unique: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/libs/repository/data-source/index.ts b/src/Umbraco.Web.UI.Client/libs/repository/data-source/index.ts index 08d765462a..d58b89b70e 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/data-source/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/data-source/index.ts @@ -5,3 +5,4 @@ export * from './tree-data-source.interface'; export * from './item-data-source.interface'; export * from './move-data-source.interface'; export * from './copy-data-source.interface'; +export * from './collection-data-source.interface'; diff --git a/src/Umbraco.Web.UI.Client/libs/repository/detail-repository.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/detail-repository.interface.ts index cb70ab8dd2..83b475b52c 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/detail-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/detail-repository.interface.ts @@ -1,3 +1,4 @@ +import { Observable } from 'rxjs'; import type { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; export interface UmbRepositoryErrorResponse { @@ -7,10 +8,16 @@ export interface UmbRepositoryResponse extends UmbRepositoryErrorResponse { data?: T; } -export interface UmbDetailRepository { +export interface UmbDetailRepository< + CreateRequestType = any, + CreateResponseType = any, + UpdateRequestType = any, + ResponseType = any +> { createScaffold(parentId: string | null): Promise>; requestById(id: string): Promise>; - create(data: CreateRequestType): Promise; + byId(id: string): Promise>; + create(data: CreateRequestType): Promise>; save(id: string, data: UpdateRequestType): Promise; delete(id: string): Promise; } diff --git a/src/Umbraco.Web.UI.Client/libs/repository/index.ts b/src/Umbraco.Web.UI.Client/libs/repository/index.ts index ba407c2083..9efaa532e9 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/index.ts @@ -2,6 +2,7 @@ export * from './data-source'; export * from './detail-repository.interface'; export * from './tree-repository.interface'; export * from './folder-repository.interface'; +export * from './collection-repository.interface'; export * from './item-repository.interface'; export * from './move-repository.interface'; export * from './copy-repository.interface'; diff --git a/src/Umbraco.Web.UI.Client/libs/resources/index.ts b/src/Umbraco.Web.UI.Client/libs/resources/index.ts index e0769f21ef..a7773b17b8 100644 --- a/src/Umbraco.Web.UI.Client/libs/resources/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/resources/index.ts @@ -1,3 +1,4 @@ export * from './resource.controller'; +export * from './serverUrl.token'; export * from './tryExecute.function'; export * from './tryExecuteAndNotify.function'; diff --git a/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts b/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts index 2432b6fe96..6f9b9fae23 100644 --- a/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts +++ b/src/Umbraco.Web.UI.Client/libs/resources/resource.controller.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { - UmbNotificationOptions, UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN, + UmbNotificationOptions, } from '@umbraco-cms/backoffice/notification'; -import { ApiError, CancelablePromise, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; +import { ApiError, CancelError, CancelablePromise } from '@umbraco-cms/backoffice/backend-api'; import { UmbController, UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; @@ -32,65 +32,75 @@ export class UmbResourceController extends UmbController { this.cancel(); } - /** - * Extract the ProblemDetailsModel object from an ApiError. - * - * This assumes that all ApiErrors contain a ProblemDetailsModel object in their body. - */ - static toProblemDetailsModel(error: unknown): ProblemDetailsModel | undefined { - if (error instanceof ApiError) { - try { - const errorDetails = ( - typeof error.body === 'string' ? JSON.parse(error.body) : error.body - ) as ProblemDetailsModel; - return errorDetails; - } catch { - return { - title: error.name, - detail: error.message, - }; - } - } else if (error instanceof Error) { - return { - title: error.name, - detail: error.message, - }; - } - - return undefined; - } - /** * Base execute function with a try/catch block and return a tuple with the result and the error. */ static async tryExecute(promise: Promise): Promise> { try { return { data: await promise }; - } catch (e) { - return { error: UmbResourceController.toProblemDetailsModel(e) }; + } catch (error) { + if (error instanceof ApiError || error instanceof CancelError) { + return { error }; + } + + console.error('Unknown error', error); + throw new Error('Unknown error'); } } /** - * Wrap the {execute} function in a try/catch block and return the result. + * Wrap the {tryExecute} function in a try/catch block and return the result. * If the executor function throws an error, then show the details in a notification. */ async tryExecuteAndNotify(options?: UmbNotificationOptions): Promise> { const { data, error } = await UmbResourceController.tryExecute(this.#promise); if (error) { - if (this.#notificationContext) { - this.#notificationContext?.peek('danger', { - data: { - headline: error.title ?? 'Server Error', - message: error.detail ?? 'Something went wrong', - }, - ...options, - }); + /** + * Determine if we want to show a notification or just log the error to the console. + * If the error is not a recognizable system error (i.e. a HttpError), then we will show a notification + * with the error details using the default notification options. + */ + if (error instanceof CancelError) { + // Cancelled - do nothing + return {}; } else { - console.group('UmbResourceController'); - console.error(error); - console.groupEnd(); + // ApiError - body could hold a ProblemDetailsModel from the server + (error as any).body = typeof error.body === 'string' ? JSON.parse(error.body) : error.body; + + // Go through the error status codes and act accordingly + switch (error.status ?? 0) { + case 401: + // Unauthorized + console.log('Unauthorized'); + + // TODO: Do not remove the token here but instead let whatever is listening to the event decide what to do + localStorage.removeItem('tokenResponse'); + + // TODO: Show a modal dialog to login either by bubbling an event to UmbAppElement or by showing a modal directly + this.#notificationContext?.peek('warning', { + data: { + headline: 'Session Expired', + message: 'Your session has expired. Please refresh the page.', + }, + }); + break; + default: + // Other errors + if (this.#notificationContext) { + this.#notificationContext.peek('danger', { + data: { + headline: error.body.title ?? error.name ?? 'Server Error', + message: error.body.detail ?? error.message ?? 'Something went wrong', + }, + ...options, + }); + } else { + console.group('UmbResourceController'); + console.error(error); + console.groupEnd(); + } + } } } diff --git a/src/Umbraco.Web.UI.Client/libs/resources/serverUrl.token.ts b/src/Umbraco.Web.UI.Client/libs/resources/serverUrl.token.ts new file mode 100644 index 0000000000..92ade0759a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/resources/serverUrl.token.ts @@ -0,0 +1,16 @@ +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +/** + * The base URL of the configured Umbraco server. + * If the server is local, this will be an empty string. + * + * @remarks This is the base URL of the Umbraco server, not the base URL of the backoffice. + * + * @example https://localhost:44300 + * @example https://my-umbraco-site.com + * @example '' + */ +export const UMB_SERVER_URL = new UmbContextToken( + 'UmbServerUrl', + 'The base URL of the configured Umbraco server.' +); diff --git a/src/Umbraco.Web.UI.Client/libs/resources/tryExecuteAndNotify.function.ts b/src/Umbraco.Web.UI.Client/libs/resources/tryExecuteAndNotify.function.ts index d34b90fb02..caf0e61703 100644 --- a/src/Umbraco.Web.UI.Client/libs/resources/tryExecuteAndNotify.function.ts +++ b/src/Umbraco.Web.UI.Client/libs/resources/tryExecuteAndNotify.function.ts @@ -6,7 +6,7 @@ import type { UmbNotificationOptions } from '@umbraco-cms/backoffice/notificatio export function tryExecuteAndNotify( host: UmbControllerHostElement, resource: Promise, - options?: UmbNotificationOptions + options?: UmbNotificationOptions ) { return new UmbResourceController(host, resource).tryExecuteAndNotify(options); } diff --git a/src/Umbraco.Web.UI.Client/libs/router/index.ts b/src/Umbraco.Web.UI.Client/libs/router/index.ts index ff7b6c5ba1..850b56b590 100644 --- a/src/Umbraco.Web.UI.Client/libs/router/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/router/index.ts @@ -1,5 +1,4 @@ export type { - IRoute, PageComponent, Guard, IRoutingInfo, @@ -10,7 +9,6 @@ export type { Query, } from 'router-slot/model'; export * from 'router-slot/util'; -export * from './route-location.interface'; export * from './route.context'; export * from './route.interface'; export * from './generate-route-path-builder.function'; diff --git a/src/Umbraco.Web.UI.Client/libs/router/route-location.interface.ts b/src/Umbraco.Web.UI.Client/libs/router/route-location.interface.ts deleted file mode 100644 index ef5f56188f..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/router/route-location.interface.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface UmbRouteLocation { - name?: string; - params: { - [key: string]: string; - }; -} diff --git a/src/Umbraco.Web.UI.Client/libs/utils/generate-guid.ts b/src/Umbraco.Web.UI.Client/libs/utils/generate-guid.ts deleted file mode 100644 index b0b7f6b981..0000000000 --- a/src/Umbraco.Web.UI.Client/libs/utils/generate-guid.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { v4 as uuid } from 'uuid'; -export function generateGuid() { - return uuid(); -} diff --git a/src/Umbraco.Web.UI.Client/libs/utils/index.ts b/src/Umbraco.Web.UI.Client/libs/utils/index.ts index d16b3e3261..8d9fbe8634 100644 --- a/src/Umbraco.Web.UI.Client/libs/utils/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/utils/index.ts @@ -1,4 +1,2 @@ -export * from './utils'; export * from './umbraco-path'; export * from './udi-service'; -export * from './generate-guid'; diff --git a/src/Umbraco.Web.UI.Client/libs/workspace/actions/workspace-action-base.ts b/src/Umbraco.Web.UI.Client/libs/workspace/actions/workspace-action-base.ts index ab6cb796f9..f9d9780928 100644 --- a/src/Umbraco.Web.UI.Client/libs/workspace/actions/workspace-action-base.ts +++ b/src/Umbraco.Web.UI.Client/libs/workspace/actions/workspace-action-base.ts @@ -1,20 +1,23 @@ +import { UmbWorkspaceContextInterface } from '../context'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController, UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; -export interface UmbWorkspaceAction { +export interface UmbWorkspaceAction { host: UmbControllerHostElement; - workspaceContext?: T; + workspaceContext?: WorkspaceType; execute(): Promise; } -export class UmbWorkspaceActionBase { +export abstract class UmbWorkspaceActionBase implements UmbWorkspaceAction { host: UmbControllerHostElement; workspaceContext?: WorkspaceType; constructor(host: UmbControllerHostElement) { this.host = host; new UmbContextConsumerController(this.host, UMB_ENTITY_WORKSPACE_CONTEXT, (instance) => { - this.workspaceContext = instance as WorkspaceType; + // TODO: Be aware we are casting here. We should consider a better solution for typing the contexts. (But notice we still want to capture the first workspace...) + this.workspaceContext = instance as unknown as WorkspaceType; }); } + abstract execute(): Promise; } diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 2b8b1d6073..b3bb745a5f 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.0", "license": "MIT", "dependencies": { + "@openid/appauth": "^1.3.1", "@umbraco-ui/uui": "^1.2.1", "@umbraco-ui/uui-css": "^1.2.1", "element-internals-polyfill": "^1.1.19", @@ -56,7 +57,7 @@ "eslint-plugin-wc": "^1.4.0", "msw": "^1.1.0", "msw-storybook-addon": "^1.8.0", - "openapi-typescript-codegen": "^0.23.0", + "openapi-typescript-codegen": "^0.24.0", "playwright-msw": "^2.1.0", "plop": "^3.1.1", "prettier": "2.8.4", @@ -80,13 +81,35 @@ "npm": ">=9.5 < 10" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "node_modules/@75lb/deep-merge": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", + "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "lodash.assignwith": "^4.2.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/@75lb/deep-merge/node_modules/typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -136,9 +159,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" @@ -157,21 +180,21 @@ } }, "node_modules/@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-module-transforms": "^7.21.2", "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", + "@babel/parser": "^7.21.4", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -187,12 +210,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.21.4", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -201,20 +224,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", @@ -373,12 +382,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" @@ -566,9 +575,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1957,19 +1966,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2042,9 +2051,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", - "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", + "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", "cpu": [ "arm" ], @@ -2058,9 +2067,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", - "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", + "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", "cpu": [ "arm64" ], @@ -2074,9 +2083,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", - "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", + "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", "cpu": [ "x64" ], @@ -2090,9 +2099,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", - "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", + "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", "cpu": [ "arm64" ], @@ -2106,9 +2115,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", - "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", + "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", "cpu": [ "x64" ], @@ -2122,9 +2131,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", - "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", + "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", "cpu": [ "arm64" ], @@ -2138,9 +2147,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", - "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", + "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", "cpu": [ "x64" ], @@ -2154,9 +2163,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", - "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", + "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", "cpu": [ "arm" ], @@ -2170,9 +2179,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", - "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", + "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", "cpu": [ "arm64" ], @@ -2186,9 +2195,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", - "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", + "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", "cpu": [ "ia32" ], @@ -2202,9 +2211,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", - "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", + "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", "cpu": [ "loong64" ], @@ -2218,9 +2227,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", - "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", + "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", "cpu": [ "mips64el" ], @@ -2234,9 +2243,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", - "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", + "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", "cpu": [ "ppc64" ], @@ -2250,9 +2259,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", - "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", + "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", "cpu": [ "riscv64" ], @@ -2266,9 +2275,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", - "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", + "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", "cpu": [ "s390x" ], @@ -2282,9 +2291,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", - "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", + "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", "cpu": [ "x64" ], @@ -2298,9 +2307,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", - "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", + "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", "cpu": [ "x64" ], @@ -2314,9 +2323,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", - "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", + "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", "cpu": [ "x64" ], @@ -2330,9 +2339,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", - "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", + "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", "cpu": [ "x64" ], @@ -2346,9 +2355,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", - "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", + "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", "cpu": [ "arm64" ], @@ -2362,9 +2371,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", - "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", + "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", "cpu": [ "ia32" ], @@ -2378,9 +2387,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", - "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", + "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", "cpu": [ "x64" ], @@ -2393,15 +2402,39 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -2462,9 +2495,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2776,13 +2809,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -2807,21 +2841,27 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -2884,9 +2924,9 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.8.tgz", - "integrity": "sha512-hjS5dy8u+Baa5r/SVAQyWZYQr8YZzpeGldNXJlZQBPjt7FQL7Acd1BnXJWmIhl62s5uh0WJNAcUMfAAcnqTchA==", + "version": "0.17.9", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.9.tgz", + "integrity": "sha512-4LVGt03RobMH/7ZrbHqRxQrS9cc2uh+iNKSj8UWr8M26A2i793ju+csaB5zaqYltqJmA2jUq4VeYfKmVqvsXQg==", "dev": true, "dependencies": { "@open-draft/until": "^1.0.3", @@ -2996,35 +3036,35 @@ } }, "node_modules/@open-wc/semantic-dom-diff": { - "version": "0.19.7", - "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.19.7.tgz", - "integrity": "sha512-ahwHb7arQXXnkIGCrOsM895FJQrU47VWZryCsSSzl5nB3tJKcJ8yjzQ3D/yqZn6v8atqOz61vaY05aNsqoz3oA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.19.9.tgz", + "integrity": "sha512-iUL0OPA6PeLQVEEJ/gsgkEiwOGgK4E1KS//zTB+u+OAh0NifNTfxDxIHQa7rEGvplaq2b2zztT2yyzOzj+MlAA==", "dev": true, "dependencies": { "@types/chai": "^4.3.1", - "@web/test-runner-commands": "^0.6.1" + "@web/test-runner-commands": "^0.6.5" } }, "node_modules/@open-wc/testing": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@open-wc/testing/-/testing-3.1.7.tgz", - "integrity": "sha512-HCS2LuY6hXtEwjqmad+eanId5H7E+3mUi9Z3rjAhH+1DCJ53lUnjzWF1lbCYbREqrdCpmzZvW1t5R3e9gJZSCA==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@open-wc/testing/-/testing-3.1.8.tgz", + "integrity": "sha512-SpKhlSwCqUkVOOmdb9RanOQgqv4T32wzExkvuaVcUFcBeUdpwQsg1+WYpdv31Z4cRCkAhQ4A8OIpGphzqF8T7w==", "dev": true, "dependencies": { "@esm-bundle/chai": "^4.3.4-fix.0", "@open-wc/chai-dom-equals": "^0.12.36", "@open-wc/semantic-dom-diff": "^0.19.7", - "@open-wc/testing-helpers": "^2.1.4", + "@open-wc/testing-helpers": "^2.2.1", "@types/chai": "^4.2.11", - "@types/chai-dom": "^0.0.12", + "@types/chai-dom": "^1.11.0", "@types/sinon-chai": "^3.2.3", "chai-a11y-axe": "^1.3.2" } }, "node_modules/@open-wc/testing-helpers": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@open-wc/testing-helpers/-/testing-helpers-2.1.4.tgz", - "integrity": "sha512-iZJxxKI9jRgnPczm8p2jpuvBZ3DHYSLrBmhDfzs7ol8vXMNt+HluzM1j1TSU95MFVGnfaspvvt9fMbXKA7cNcA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@open-wc/testing-helpers/-/testing-helpers-2.2.1.tgz", + "integrity": "sha512-8zuJK7tUQYuXRIC/cVcPbAPOhtBJCe3Jfpk7im7WK0DIAXH9Q/ycB+yu3R8g4BQ31f/FdLjIFRbPZzIU75kkRg==", "dev": true, "dependencies": { "@open-wc/scoped-elements": "^2.1.3", @@ -3032,6 +3072,19 @@ "lit-html": "^2.0.0" } }, + "node_modules/@openid/appauth": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@openid/appauth/-/appauth-1.3.1.tgz", + "integrity": "sha512-e54kpi219wES2ijPzeHe1kMnT8VKH8YeTd1GAn9BzVBmutz3tBgcG1y8a4pziNr4vNjFnuD4W446Ua7ELnNDiA==", + "dependencies": { + "@types/base64-js": "^1.3.0", + "@types/jquery": "^3.5.5", + "base64-js": "^1.5.1", + "follow-redirects": "^1.13.3", + "form-data": "^4.0.0", + "opener": "^1.5.2" + } + }, "node_modules/@pkgr/utils": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", @@ -3053,13 +3106,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.31.1.tgz", - "integrity": "sha512-IsytVZ+0QLDh1Hj83XatGp/GsI1CDJWbyDaBGbainsh0p2zC7F4toUocqowmjS6sQff2NGT3D9WbDj/3K2CJiA==", + "version": "1.32.3", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.32.3.tgz", + "integrity": "sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==", "dev": true, "dependencies": { "@types/node": "*", - "playwright-core": "1.31.1" + "playwright-core": "1.32.3" }, "bin": { "playwright": "cli.js" @@ -3071,6 +3124,36 @@ "fsevents": "2.3.2" } }, + "node_modules/@puppeteer/browsers": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-0.5.0.tgz", + "integrity": "sha512-Uw6oB7VvmPRLE4iKsjuOh8zgDabhNX67dzo8U/BB0f9527qx+4eeUs+korU98OhG5C4ubg7ufBgVi63XYwS6TQ==", + "dev": true, + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=14.1.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-json": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", @@ -3092,15 +3175,15 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", - "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.2.tgz", + "integrity": "sha512-Y35fRGUjC3FaurG722uhUuG8YHOJRJQbI6/CkbRkdPotSpDj9NtIN85z1zrcyDcCQIW4qp5mgG72U+gJ0TAFEg==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.0", + "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, @@ -3145,21 +3228,21 @@ "dev": true }, "node_modules/@storybook/addon-a11y": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.0.2.tgz", - "integrity": "sha512-PCJaLdp/3MypMYQufLIaKL4gzZjDgU8fTW45O7feXwiUZzFUVZamBwBw5BHcHAPsDOr5CmebGvJ9+l2gByWL/g==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.0.7.tgz", + "integrity": "sha512-juLmRgUh1quGoqHyG7Ttpvj/2nIyIhcuidDKXo5ot7IbJ/g80e4o2BFPbMUT1Qdq9TL/ahbNxeP7QjV0oRJKxQ==", "dev": true, "dependencies": { - "@storybook/addon-highlight": "7.0.2", - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/addon-highlight": "7.0.7", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "axe-core": "^4.2.0", "lodash": "^4.17.21", "react-resize-detector": "^7.1.2" @@ -3182,19 +3265,19 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.2.tgz", - "integrity": "sha512-rcj39u9MrmzsrDWYt1zsoVxrogZ1Amrv9xkEofEY/QKUr2R3xpHhTALveY9BKIlG1GoE8zLlLoP2k4nz3sNNwQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.7.tgz", + "integrity": "sha512-WxsnSjAvdf6NhUfTqcwV+FJmsJV56gh2cY4QnGfqfwO5zoBWTUYnhz57TgxSMhJY0kspyX9Q1Kc//r1d5lt1qA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "dequal": "^2.0.2", "lodash": "^4.17.21", "polished": "^4.2.2", @@ -3202,7 +3285,7 @@ "react-inspector": "^6.0.0", "telejson": "^7.0.3", "ts-dedent": "^2.0.0", - "uuid-browser": "^3.1.0" + "uuid": "^9.0.0" }, "funding": { "type": "opencollective", @@ -3222,19 +3305,19 @@ } }, "node_modules/@storybook/addon-backgrounds": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.2.tgz", - "integrity": "sha512-yRNHQ4PPRJ+HIORQPhDGxn5xolw1xW0ByQZoNRpMD+AMEyfUNFdWbCsRQAOWjNhawxVMHM7EeA2Exrb41zhEjA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.7.tgz", + "integrity": "sha512-DhT32K1+ti7MXY9oqt36b9jlg7iY68IP0ZQbR3gjShcsIXZpFqh18TQo0vwDY1ldqnBvkTk6Jd5vcxA8tfyshw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" }, @@ -3256,20 +3339,20 @@ } }, "node_modules/@storybook/addon-controls": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.0.2.tgz", - "integrity": "sha512-dMpRtj5cmfC9vEMve5ncvbWCEC+WD9YuzJ+grdc48E/Hd//p+O2FE6klSkrz5FAjrc+rHINixdyssekpEL6nYQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.0.7.tgz", + "integrity": "sha512-/QEzleKoWRQ3i7KB32QvqDGcGMw4kG2BxEf0d+ymxd2SjoeL6kX2eHE0b4OxFPXiWUyTfXBFwmcI2Re3fRUJnQ==", "dev": true, "dependencies": { - "@storybook/blocks": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-common": "7.0.2", - "@storybook/manager-api": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/blocks": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-common": "7.0.7", + "@storybook/manager-api": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" }, @@ -3291,28 +3374,28 @@ } }, "node_modules/@storybook/addon-docs": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.0.2.tgz", - "integrity": "sha512-q3rDWoZEym6Lkmhqc/HBNfLDAmTY8l0WINGUZo/nF98eP5iu4B7Nk7V6BRGYGQt6Y6ZyIQ8WKH0e/eJww2zIog==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.0.7.tgz", + "integrity": "sha512-5PT7aiTD6QPH+4CZLcv4PiUgWucD9JNGHVMRbQMEyFW6qbs87dHmu1m1uXIvx3BF5h3mTo4FHNAf8IQIq5HH9w==", "dev": true, "dependencies": { "@babel/core": "^7.20.2", "@babel/plugin-transform-react-jsx": "^7.19.0", "@jest/transform": "^29.3.1", "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/csf-plugin": "7.0.2", - "@storybook/csf-tools": "7.0.2", + "@storybook/blocks": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/csf-plugin": "7.0.7", + "@storybook/csf-tools": "7.0.7", "@storybook/global": "^5.0.0", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.0.2", - "@storybook/postinstall": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/react-dom-shim": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/node-logger": "7.0.7", + "@storybook/postinstall": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/react-dom-shim": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "fs-extra": "^11.1.0", "remark-external-links": "^8.0.0", "remark-slug": "^6.0.0", @@ -3323,35 +3406,29 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/mdx1-csf": ">=1.0.0-0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@storybook/mdx1-csf": { - "optional": true - } } }, "node_modules/@storybook/addon-essentials": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.0.2.tgz", - "integrity": "sha512-LAsWsXa/Pp2B4Ve2WVgc990FtsiHpFDRsq7S3V7xRrZP8DYRbtJIVdszPMDS5uKC+yzbswFEXz08lqbGvq8zgQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.0.7.tgz", + "integrity": "sha512-uNx0BvN1XP7cNnk/L4oiFQlEB/KABqOeIyI8/mhfIyTvvwo9uAYIQAyiwWuz9MFmofCNm7CgLNOUaEwNDkM4CA==", "dev": true, "dependencies": { - "@storybook/addon-actions": "7.0.2", - "@storybook/addon-backgrounds": "7.0.2", - "@storybook/addon-controls": "7.0.2", - "@storybook/addon-docs": "7.0.2", - "@storybook/addon-highlight": "7.0.2", - "@storybook/addon-measure": "7.0.2", - "@storybook/addon-outline": "7.0.2", - "@storybook/addon-toolbars": "7.0.2", - "@storybook/addon-viewport": "7.0.2", - "@storybook/core-common": "7.0.2", - "@storybook/manager-api": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/preview-api": "7.0.2", + "@storybook/addon-actions": "7.0.7", + "@storybook/addon-backgrounds": "7.0.7", + "@storybook/addon-controls": "7.0.7", + "@storybook/addon-docs": "7.0.7", + "@storybook/addon-highlight": "7.0.7", + "@storybook/addon-measure": "7.0.7", + "@storybook/addon-outline": "7.0.7", + "@storybook/addon-toolbars": "7.0.7", + "@storybook/addon-viewport": "7.0.7", + "@storybook/core-common": "7.0.7", + "@storybook/manager-api": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/preview-api": "7.0.7", "ts-dedent": "^2.0.0" }, "funding": { @@ -3364,14 +3441,14 @@ } }, "node_modules/@storybook/addon-highlight": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.0.2.tgz", - "integrity": "sha512-9BkL1OOanguuy73S6nLK0isUb045tOkFONd/PQldOJ0PV3agCvKxKHyzlBz7Hsba8KZhY5jQs+nVW2NiREyGYg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.0.7.tgz", + "integrity": "sha512-expme2GzzCXX7/lL7UjCDi1Tfj+4LeNsAdWiurVLH7glK7yKPPeXXkIldbLP/XjJv4NKlqCwnNRHQx0vDLlE6g==", "dev": true, "dependencies": { - "@storybook/core-events": "7.0.2", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.0.2" + "@storybook/preview-api": "7.0.7" }, "funding": { "type": "opencollective", @@ -3379,19 +3456,19 @@ } }, "node_modules/@storybook/addon-links": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.0.2.tgz", - "integrity": "sha512-lPtfy2MqrcI9YjupBM2eRKGPdFKVPCz7WgO/JQQakGugORJTEGCyJrNJNtWY9jDenv8ynLZ40OxtPBZi54Sr6Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.0.7.tgz", + "integrity": "sha512-DEjDxjHb3mT8Sdnx4In5Ev9gJ/XdjlHOq4iuy0wnMyrCV4wnzTQnIeSCx8nkrXFb314zc33JPnCcrb5pQoD5GQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/router": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/router": "7.0.7", + "@storybook/types": "7.0.7", "prop-types": "^15.7.2", "ts-dedent": "^2.0.0" }, @@ -3413,18 +3490,18 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.0.2.tgz", - "integrity": "sha512-cf/d5MXpHAjyUiDIVfc8pLn79CPHgnryDmNNlSiP2zEFKcivrRWiu8Rmrad8pGqLkuAh+PXLKCGn9uiqDvg7QQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.0.7.tgz", + "integrity": "sha512-lb4wEIvIVF+ePx1sC+n9rDI0+49sRa6MWbcvZ+BhbAoCeGcX7uACQFdW6HyXolmBuZASsTnzVQ4KqzzvY1dSWw==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/types": "7.0.2" + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/types": "7.0.7" }, "funding": { "type": "opencollective", @@ -3444,18 +3521,18 @@ } }, "node_modules/@storybook/addon-outline": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.0.2.tgz", - "integrity": "sha512-thVISO4NM22xlETisBvAPvz2yFD3qLGOjgzBmj8l8r9Rv0IEdwdPrwm5j0WTv8OtbhC4A8lPpvMsn5FhY5mDXg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.0.7.tgz", + "integrity": "sha512-AxbNZ4N1fXBTeMYM9tFudfW+Gzq7UikCjPxn5ax3Pde+zZjaEMppUxv5EMz4g5GIJupLYRmKH5pN0YcYoRLY6w==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/types": "7.0.7", "ts-dedent": "^2.0.0" }, "funding": { @@ -3476,16 +3553,16 @@ } }, "node_modules/@storybook/addon-toolbars": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.0.2.tgz", - "integrity": "sha512-tAxZ2+nUYsJdT1sx3BrmoMAZFM19+OzWJY6qSnbEq5zoRgvGZaXGR6tLMKydDoHQBU9Ta9YHGo7N7u7h1C23yg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.0.7.tgz", + "integrity": "sha512-/NkYHhU1VAz5lXjWuV8+ADWB84HzktvZv4jfiKX7Zzu6JVzrBu7FotQSWh3pDqqVwCB50RClUGtcHmSSac9CAQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2" + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7" }, "funding": { "type": "opencollective", @@ -3505,18 +3582,18 @@ } }, "node_modules/@storybook/addon-viewport": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.0.2.tgz", - "integrity": "sha512-TaHJWIIazPM/TerRbka9RqjMPNpwaRsGRdVRBtVoVosy1FzsEjAdQSO7RBMe4G03m5CacSqdsDiJCblI2AXaew==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.0.7.tgz", + "integrity": "sha512-znqhd8JFEFoXcAdwYhz1CwrCpVAzhuSyUVBUNDsDs+mgBEfGth4D4abIdWWGcfP6+CmI5ebFHtk443cExZebag==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", "memoizerific": "^1.11.3", "prop-types": "^15.7.2" }, @@ -3538,22 +3615,22 @@ } }, "node_modules/@storybook/blocks": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.0.2.tgz", - "integrity": "sha512-JzHmU8jZLzeQ6bunzci8j/2Ji18GBTyhrPFLk5RjEbMNGWpGjvER/yR127tZOdbPguVNr4iVbRfGzd1wGHlrzA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.0.7.tgz", + "integrity": "sha512-ehR0hAFWNHHqmrmbwYPKhLpgbIBKtyMbeoGClTRSnrVBGONciYJdmxegkCTReUklCY+HBJjtlwNowT+7+5sSaw==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/csf": "^0.1.0", - "@storybook/docs-tools": "7.0.2", + "@storybook/docs-tools": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "@types/lodash": "^4.14.167", "color-convert": "^2.0.1", "dequal": "^2.0.2", @@ -3576,15 +3653,15 @@ } }, "node_modules/@storybook/builder-manager": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.0.2.tgz", - "integrity": "sha512-Oej/n8D7eaWgmWF7nN2hXLRM53lcYOdh6umSN8Mh/LcYUfxB+dvUBFzUjoLE0xjhW6xRinrKrENT5LcP/f/HBQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.0.7.tgz", + "integrity": "sha512-VI/0iEjAlzQDt1yKu8GXugNIz7t46IHIKgMNmltQ05KPypMgInUoMmbfP5AYOVddjLdSqjMLO7EK58pBLOInpw==", "dev": true, "dependencies": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.0.2", - "@storybook/manager": "7.0.2", - "@storybook/node-logger": "7.0.2", + "@storybook/core-common": "7.0.7", + "@storybook/manager": "7.0.7", + "@storybook/node-logger": "7.0.7", "@types/ejs": "^3.1.1", "@types/find-cache-dir": "^3.2.1", "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", @@ -3604,21 +3681,21 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.0.2.tgz", - "integrity": "sha512-G6CD2Gf2zwzRslvNvqgz4FeADVEA9XA4Mw6+NM6Twc+Wy/Ah482dvHS9ApSgirtGyBKjOfdHn1xQT4Z+kzbJnw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.0.7.tgz", + "integrity": "sha512-2wL6fsFWzij+R155urOLc7EjZtlVWf4FLfaSlLGAuZwRQU40N04YdMaHMp9tjd9Vdr5fxEDwTB51PnVWJMlsEw==", "dev": true, "dependencies": { - "@storybook/channel-postmessage": "7.0.2", - "@storybook/channel-websocket": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/core-common": "7.0.2", - "@storybook/csf-plugin": "7.0.2", + "@storybook/channel-postmessage": "7.0.7", + "@storybook/channel-websocket": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/core-common": "7.0.7", + "@storybook/csf-plugin": "7.0.7", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.0.2", - "@storybook/preview": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/node-logger": "7.0.7", + "@storybook/preview": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/types": "7.0.7", "browser-assert": "^1.2.1", "es-module-lexer": "^0.9.3", "express": "^4.17.3", @@ -3636,7 +3713,6 @@ }, "peerDependencies": { "@preact/preset-vite": "*", - "@storybook/mdx1-csf": ">=1.0.0-next.1", "typescript": ">= 4.3.x", "vite": "^3.0.0 || ^4.0.0", "vite-plugin-glimmerx": "*" @@ -3645,9 +3721,6 @@ "@preact/preset-vite": { "optional": true }, - "@storybook/mdx1-csf": { - "optional": true - }, "typescript": { "optional": true }, @@ -3657,14 +3730,14 @@ } }, "node_modules/@storybook/channel-postmessage": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.2.tgz", - "integrity": "sha512-SZ/KqnZcx10W9hJbrzBKcP9dmgaeTaXugUhcgw1IkmjKWdsKazqFZCPwQWZZKAmhO4wYbyYOhkz3wfSIeB4mFw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.7.tgz", + "integrity": "sha512-XMtYfcaE0UoY/V7K1cTu9PcWETD4iyWb/Yswc4F9VrPw0Ui4UwGS1j4iaAu8DC06yyoJs4XvxYFBMlCQmKja6A==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.0.3" @@ -3675,13 +3748,13 @@ } }, "node_modules/@storybook/channel-websocket": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-7.0.2.tgz", - "integrity": "sha512-YU3lFId6Nsi75ddA+3qfbnLfNUPswboYyx+SALhaLuXqz7zqfzX4ezMgxeS/h0gRlUJ7nf2/yJ5qie/kZaizjw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-7.0.7.tgz", + "integrity": "sha512-KDbLiQts4/dCow3qk5WJSPA6SlaX3iP9RhF0Fjj03hoG2TRskrvo+AkUiJr8gF6dpkPndfuCYUCRsO2Ml8B+AA==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", "@storybook/global": "^5.0.0", "telejson": "^7.0.3" }, @@ -3691,9 +3764,9 @@ } }, "node_modules/@storybook/channels": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.2.tgz", - "integrity": "sha512-qkI8mFy9c8mxN2f01etayKhCaauL6RAsxRzbX1/pKj6UqhHWqqUbtHwymrv4hG5qDYjV1e9pd7ae5eNF8Kui0g==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.7.tgz", + "integrity": "sha512-Om4ovBLNw8pVrBu83MpOKgAuGO9Dpr1Coh2qp8t64WRPkejX1mxOY9IgH723//zH3igx8LCkf9rvBvcrsyaScQ==", "dev": true, "funding": { "type": "opencollective", @@ -3701,21 +3774,21 @@ } }, "node_modules/@storybook/cli": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.0.2.tgz", - "integrity": "sha512-xMM2QdXNGg09wuXzAGroKrbsnaHSFPmtmefX1XGALhHuKVwxOoC2apWMpek6gY/9vh5EIRTog2Dvfd2BzNrT6Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.0.7.tgz", + "integrity": "sha512-koTkWr7wlaHF14T5moRP/tYM44+Jf4GEzQ/rqx/Jfn7EbNlVUOibdLJj4JnseMGRc7ZP6tKYku2n+B8g7hJX4w==", "dev": true, "dependencies": { "@babel/core": "^7.20.2", "@babel/preset-env": "^7.20.2", "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.0.2", - "@storybook/core-common": "7.0.2", - "@storybook/core-server": "7.0.2", - "@storybook/csf-tools": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/telemetry": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/codemod": "7.0.7", + "@storybook/core-common": "7.0.7", + "@storybook/core-server": "7.0.7", + "@storybook/csf-tools": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/telemetry": "7.0.7", + "@storybook/types": "7.0.7", "@types/semver": "^7.3.4", "boxen": "^5.1.2", "chalk": "^4.1.0", @@ -3827,6 +3900,26 @@ "ms": "2.0.0" } }, + "node_modules/@storybook/cli/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@storybook/cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -3900,15 +3993,6 @@ "node": ">=8.16.0" } }, - "node_modules/@storybook/cli/node_modules/puppeteer-core/node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, "node_modules/@storybook/cli/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -3921,30 +4005,10 @@ "rimraf": "bin.js" } }, - "node_modules/@storybook/cli/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@storybook/cli/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3968,6 +4032,15 @@ "node": ">=8" } }, + "node_modules/@storybook/cli/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, "node_modules/@storybook/cli/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -3975,9 +4048,9 @@ "dev": true }, "node_modules/@storybook/client-logger": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.2.tgz", - "integrity": "sha512-rv7W2BhzIQHbFpUM5/CP/acS6T5lTmaxT0MbZ9n+9h++9QQU/cFOdkZgSUbLVAb1AeUGoLsk0HYzcqPpV35Xsw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.7.tgz", + "integrity": "sha512-EclHjDs5HwHMKB4X2orn/KKA0DTIDmp4AXAUJGRfxb5ArpKEb7tXLHsgrRBlaoz1j5LAwKTmEyZOONh9G3etjg==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -3988,18 +4061,18 @@ } }, "node_modules/@storybook/codemod": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.0.2.tgz", - "integrity": "sha512-D9PdByxJlFiaDJcLkM+RN1DHCj4VfQIlSZkADOcNtI4o9H064oiMloWDGZiR1i1FCYMSXuWmW6tMsuCVebA+Nw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.0.7.tgz", + "integrity": "sha512-VlkDlkvfbzLe+NOmzs5zGrGb4jnaeAFZqpvIkXxevr6aGcOwgeelNv8gTmgBAcy+xbGW4Pp0XA2BlMweIvKEKA==", "dev": true, "dependencies": { "@babel/core": "~7.21.0", "@babel/preset-env": "~7.21.0", "@babel/types": "~7.21.2", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/csf-tools": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/types": "7.0.7", "cross-spawn": "^7.0.3", "globby": "^11.0.2", "jscodeshift": "^0.14.0", @@ -4013,16 +4086,16 @@ } }, "node_modules/@storybook/components": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.0.2.tgz", - "integrity": "sha512-Ee9pY6WlpricPUdYiyR0Ov8zgHkUt541yl1CZ6Ytaom2TA12cAnRjKewbLAgVPPhIE1LsMRhOPFYql0JMtnN4Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.0.7.tgz", + "integrity": "sha512-6PLs9LMkBuhH/w4bSJ72tYgICMbOOIHuoB/fQdVlzhsdnXL2fM/v4RVW2N7v+Oz3lYXp/JtV8V9Ub8h6eDQKXg==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", + "@storybook/client-logger": "7.0.7", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "memoizerific": "^1.11.3", "use-resize-observer": "^9.1.0", "util-deprecate": "^1.0.2" @@ -4037,13 +4110,13 @@ } }, "node_modules/@storybook/core-client": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.2.tgz", - "integrity": "sha512-tr6Uv41YD2O0xiUrtgujiY1QxuznhbyUI0BRsSh49e8cx3QoW7FgPy7IVZHgb17DXKZ/wY/hgdyTTB87H6IbLA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.7.tgz", + "integrity": "sha512-eydcpR28qV3A3BwR5V6wsixoI1BRLA0SzFiwH/1ajrgX13inv+gV97gHv47Ojf/+YAZ3HqdVaUKFsUfMKwKieA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", - "@storybook/preview-api": "7.0.2" + "@storybook/client-logger": "7.0.7", + "@storybook/preview-api": "7.0.7" }, "funding": { "type": "opencollective", @@ -4051,13 +4124,13 @@ } }, "node_modules/@storybook/core-common": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.2.tgz", - "integrity": "sha512-DayFPTCj695tnEKLuDlogclBim8mzdrbj9U1xzFm23BUReheGSGdLl2zrb3mP1l9Zj4xJ/Ctst1KN9SFbW84vw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.7.tgz", + "integrity": "sha512-c8T24wex9bnCYdZVZFNX4VV+wfhrp47OLzVONZDqxMhq6G//Bgv5zH4Awcx5UfWf/05VcP7KGF1VKj8ebRyEEA==", "dev": true, "dependencies": { - "@storybook/node-logger": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/node-logger": "7.0.7", + "@storybook/types": "7.0.7", "@types/node": "^16.0.0", "@types/pretty-hrtime": "^1.0.0", "chalk": "^4.1.0", @@ -4082,9 +4155,9 @@ } }, "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "16.18.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", - "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", + "version": "16.18.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.24.tgz", + "integrity": "sha512-zvSN2Esek1aeLdKDYuntKAYjti9Z2oT4I8bfkLLhIxHlv3dwZ5vvATxOc31820iYm4hQRCwjUgDpwSMFjfTUnw==", "dev": true }, "node_modules/@storybook/core-common/node_modules/ansi-styles": { @@ -4140,9 +4213,9 @@ } }, "node_modules/@storybook/core-events": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.2.tgz", - "integrity": "sha512-1DCHCwHRL3+rlvnVVc/BCfReP31XaT2WYgcLeGTmkX1E43Po1MkgcM7PnJPSaa9POvSqZ+6YLZv5Bs1SXbufow==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.7.tgz", + "integrity": "sha512-XNsR2RgaL2vBwuqsu+KA1DzGmB1UFfrAhpxhmyWTKDCniwtTLlaXgfKbqwcrOrPu/o1YswgIup/9UHepRHaf4A==", "dev": true, "funding": { "type": "opencollective", @@ -4150,25 +4223,25 @@ } }, "node_modules/@storybook/core-server": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.0.2.tgz", - "integrity": "sha512-7ipGws8YffVaiwkc+D0+MfZc/Sy52aKenG3nDJdK4Ajmp5LPAlelb/sxIhfRvoHDbDsy2FQNz++Mb55Yh03KkA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.0.7.tgz", + "integrity": "sha512-PB4zoClH7aKG4XeJhxx43iK9n/C9gctXubNN5DSN6thPm4UITOas+/q4N7AHbCPyRbcMyoW7M31KtpzZu4Fjew==", "dev": true, "dependencies": { "@aw-web-design/x-default-browser": "1.4.88", "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.0.2", - "@storybook/core-common": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/builder-manager": "7.0.7", + "@storybook/core-common": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.0.2", + "@storybook/csf-tools": "7.0.7", "@storybook/docs-mdx": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/telemetry": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/telemetry": "7.0.7", + "@storybook/types": "7.0.7", "@types/detect-port": "^1.3.0", "@types/node": "^16.0.0", "@types/node-fetch": "^2.5.7", @@ -4204,9 +4277,9 @@ } }, "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "16.18.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", - "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", + "version": "16.18.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.24.tgz", + "integrity": "sha512-zvSN2Esek1aeLdKDYuntKAYjti9Z2oT4I8bfkLLhIxHlv3dwZ5vvATxOc31820iYm4hQRCwjUgDpwSMFjfTUnw==", "dev": true }, "node_modules/@storybook/core-server/node_modules/ansi-styles": { @@ -4262,9 +4335,9 @@ } }, "node_modules/@storybook/core-server/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4304,12 +4377,12 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.0.2.tgz", - "integrity": "sha512-aGuo+G6G5IwSGkmc+OUA796sOfvJMaQj8QS/Zh5F0nL4ZlQvghHpXON8cRHHvmXHQqUo07KLiy7CZh2I2oq4iQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.0.7.tgz", + "integrity": "sha512-uhf2g077gXA6ZEMXIPQ0RnX+IoOTBJbj+6+VQfT7K5tvJeop1z0Fvk0FoknNXcUe7aUA0nzA/cUQ1v4vXqbY3Q==", "dev": true, "dependencies": { - "@storybook/csf-tools": "7.0.2", + "@storybook/csf-tools": "7.0.7", "unplugin": "^0.10.2" }, "funding": { @@ -4318,9 +4391,9 @@ } }, "node_modules/@storybook/csf-tools": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.0.2.tgz", - "integrity": "sha512-sOp355yQSpYiMqNSopmFYWZkPPRJdGgy4tpxGGLxpOZMygK3j1wQ/WQtl2Z0h61KP0S0dl6hrs0pHQz3A/eVrw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.0.7.tgz", + "integrity": "sha512-KbO5K2RS0oFm94eR49bAPvoyXY3Q6+ozvBek/F05RP7iAV790icQc59Xci9YDM1ONgb3afS+gSJGFBsE0h4pmg==", "dev": true, "dependencies": { "@babel/generator": "~7.21.1", @@ -4328,7 +4401,7 @@ "@babel/traverse": "~7.21.2", "@babel/types": "~7.21.2", "@storybook/csf": "^0.1.0", - "@storybook/types": "7.0.2", + "@storybook/types": "7.0.7", "fs-extra": "^11.1.0", "recast": "^0.23.1", "ts-dedent": "^2.0.0" @@ -4345,15 +4418,15 @@ "dev": true }, "node_modules/@storybook/docs-tools": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.2.tgz", - "integrity": "sha512-w4D5BURrYjLbLGG9VKAaKU2dSdukszxRE3HWkJyhQU9R1JHvS3n8ntcMqYPqRfoHCOeBLBxP0edDYcAfzGNDYQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.7.tgz", + "integrity": "sha512-VB4Qa33DYNxXALWcXyDid246r9Q6SGM+Q+pGWOuEJsxRxDmrUspXHaHG0CO1NIjMWfbqpOoz61vquZO0GZoAAg==", "dev": true, "dependencies": { "@babel/core": "^7.12.10", - "@storybook/core-common": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/core-common": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/types": "7.0.7", "@types/doctrine": "^0.0.3", "doctrine": "^3.0.0", "lodash": "^4.17.21" @@ -4370,9 +4443,9 @@ "dev": true }, "node_modules/@storybook/manager": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.0.2.tgz", - "integrity": "sha512-jsFsFKG0rPNYfuRm/WSXGMBy8vnALyFWU330ObDmfU0JID3SeLlVqAOZT1GlwI6vupYpWodsN6qPZKRmC8onRw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.0.7.tgz", + "integrity": "sha512-FhquwUpUOHsjZROf6E6kzUnJ6EmMeJ9b+HYg6yYPyIMYVMjAhnkRKbIj0phGx2lhgKFlmxik+3pgchK5SLdcZA==", "dev": true, "funding": { "type": "opencollective", @@ -4380,19 +4453,19 @@ } }, "node_modules/@storybook/manager-api": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.2.tgz", - "integrity": "sha512-PbLj9Rc5uCMPfMdaXv1wE3koA3+d0rmZ3BJI8jeq+mfZEvpvfI4OOpRioT1q04CkkVomFOVFTyO0Q/o6Rb5N7g==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.7.tgz", + "integrity": "sha512-QTd/P72peAhofKqK+8yzIO9iWAEfPn8WUGGveV2KGaTlSlgbr87RLHEKilcXMZcYhBWC9izFRmjKum9ROdskrQ==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/router": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -4423,9 +4496,9 @@ } }, "node_modules/@storybook/manager-api/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4450,9 +4523,9 @@ "dev": true }, "node_modules/@storybook/node-logger": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.2.tgz", - "integrity": "sha512-UENpXxB1yDqP7JXaODJo+pbGt5y3NFBNurBr4+pI4bMAC4ARjpgRE4wp6fxUKFPu9MAR10oCdcLEHkaVUAjYRg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.7.tgz", + "integrity": "sha512-5Y4LLgKeCStq1ktCKZ5eNPzQQSQ+CYZAlkEdzQ3Pp//0KXaZvVxEvGtaYhAymP2HatLpI8Oneo4lHrJioRfgww==", "dev": true, "dependencies": { "@types/npmlog": "^4.1.2", @@ -4518,9 +4591,9 @@ } }, "node_modules/@storybook/postinstall": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.0.2.tgz", - "integrity": "sha512-Hhiu3+N3ZDcbrhOCBJTDJbn/mC4l0v3ziyAP3yalq/2ZR9R5kfsEHHakKmswsKKV+ey0gNGijFTy3soU5oSs+A==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.0.7.tgz", + "integrity": "sha512-APcZ2KaR7z1aJje3pID4Ywmt1/aVcP3Sc4ltzNdH9mCkEsuq0fZHHQrYSa9Ya1IPRmSeLZ5/23q1iyqmGU3zoQ==", "dev": true, "funding": { "type": "opencollective", @@ -4528,9 +4601,9 @@ } }, "node_modules/@storybook/preview": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.0.2.tgz", - "integrity": "sha512-U7MZkDT9bBq7HggLAXmTO9gI4eqhYs26fZS0L6iTE/PCX4Wg2TJBJSq2X8jhDXRqJFOt8SrQ756+V5Vtwrh4Og==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.0.7.tgz", + "integrity": "sha512-uL3ZcFao6UvxiSxCIcXKFakxEr9Nn0lvu0zzC2yQCVepzA7a+GDr1cK5VbZ6Mez38CnOvBmb5pkCbgRqSf/oug==", "dev": true, "funding": { "type": "opencollective", @@ -4538,18 +4611,18 @@ } }, "node_modules/@storybook/preview-api": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.2.tgz", - "integrity": "sha512-QAlJM/r92+dQe/kB7MTTR9b/1mt9UJjxNjazGdEWipA/nw23kOF3o/hBcvKwBYkit4zGYsX70H+vuzW8hCo/lA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.7.tgz", + "integrity": "sha512-R5pmGTodpu6hbwEg2RM2ulWtW3d426YzsisHrZJ+FT9lecWauN1y9xHCz7HdNzEFhT8r4YOa24L9ZS3mosZ7hA==", "dev": true, "dependencies": { - "@storybook/channel-postmessage": "7.0.2", - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/channel-postmessage": "7.0.7", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.0.2", + "@storybook/types": "7.0.7", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -4565,9 +4638,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.2.tgz", - "integrity": "sha512-fMl0aV7mJ3wyQKvt6z+rZuiIiSd9YinS77IJ1ETHqVZ4SxWriOS0GFKP6sZflrlpShoZBh+zl1lDPG7ZZdrQGw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.7.tgz", + "integrity": "sha512-INGwFeu9M+RzpvktSKuwy8Rk/70mXGqxxsb9lPtq7phmETvfpNX7GnLJqiVazTaQiB1DkB0iAPUsK2MNbBu+Kw==", "dev": true, "funding": { "type": "opencollective", @@ -4579,12 +4652,12 @@ } }, "node_modules/@storybook/router": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.0.2.tgz", - "integrity": "sha512-ZB2vucfayZUrMLBlXju4v6CNOQQb0YKDLw5RoojdBxOsUFtnp5UiPOE+I8PQR63EBwnRjozeibV1XSM+GlQb5w==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.0.7.tgz", + "integrity": "sha512-/lM8/NHQKeshfnC3ayFuO8Y9TCSHnCAPRhIsVxvanBzcj+ILbCIyZ+TspvB3hT4MbX/Ez+JR8VrMbjXIGwmH8w==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", + "@storybook/client-logger": "7.0.7", "memoizerific": "^1.11.3", "qs": "^6.10.0" }, @@ -4598,13 +4671,13 @@ } }, "node_modules/@storybook/telemetry": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.0.2.tgz", - "integrity": "sha512-s2PIwI9nVYQBf3h40EFHLynYUfdqzRJMXyaCWJdVQuvdQfRkAn3CLXaubK+VdjC869z3ZfW20EMu3Mbgzcc0HA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.0.7.tgz", + "integrity": "sha512-Ka6pwWr3sWs3A/6WQ0wsoSYzXx3Mhr7eByNZZKuuCu9jnw3I8AbIOqQX2iOVzaQBLZsvXEeqvYY8iZ+GuRbbGQ==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", - "@storybook/core-common": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/core-common": "7.0.7", "chalk": "^4.1.0", "detect-package-manager": "^2.0.1", "fetch-retry": "^5.0.2", @@ -4671,13 +4744,13 @@ } }, "node_modules/@storybook/theming": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.2.tgz", - "integrity": "sha512-c9sE+QAZNbopPvLiJ6BMxBERfTaq1ATyIri97FBvTucuSotNXw7X5q+ip5/nrCOPZuvK2f5wF4DRyD2HnB/rIQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.7.tgz", + "integrity": "sha512-InTZe+Sgco1NsxgiG+cyUKWQe3GsjlIyU/o5qDdtOTXcZ64HzyBuAZlAequSddqfDeMDqxRFPc2w1J28MAUHxA==", "dev": true, "dependencies": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.0.2", + "@storybook/client-logger": "7.0.7", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" }, @@ -4691,12 +4764,12 @@ } }, "node_modules/@storybook/types": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.2.tgz", - "integrity": "sha512-0OCt/kAexa8MCcljxA+yZxGMn0n2U2Ync0KxotItqNbKBKVkaLQUls0+IXTWSCpC/QJvNZ049jxUHHanNi/96w==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.7.tgz", + "integrity": "sha512-v9piuwp8FvTiHXIOOi5lEyTEJKhnbcbhVxgJ3VFhhXYFd0DTz6Bst0XIIgkgs21ITb3xhkfPbCRUueMcbXO1MA==", "dev": true, "dependencies": { - "@storybook/channels": "7.0.2", + "@storybook/channels": "7.0.7", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", "file-system-cache": "^2.0.0" @@ -4707,18 +4780,18 @@ } }, "node_modules/@storybook/web-components": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.0.2.tgz", - "integrity": "sha512-qJc5EsNZci0yBOCH9YKuUoSEHvvfetFUsUWpLQa2pzHa648z0Qb8Z1OS/hYCq7PyJN/knb+00Pd8z3zNSw9SgA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.0.7.tgz", + "integrity": "sha512-bcBX1V6pleZ6ahAT01d1k7eiifIB/BlHqmi2BpQRWsPUVRpitUudKCmHN5YDga8o+/YoIumh+oBqtpedn+vADA==", "dev": true, "dependencies": { - "@storybook/client-logger": "7.0.2", - "@storybook/core-client": "7.0.2", - "@storybook/docs-tools": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/core-client": "7.0.7", + "@storybook/docs-tools": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/types": "7.0.7", "ts-dedent": "^2.0.0" }, "engines": { @@ -4733,15 +4806,15 @@ } }, "node_modules/@storybook/web-components-vite": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.0.2.tgz", - "integrity": "sha512-9c6wt+4yvOGN3d2FV3dBbtAeswjuIOS5InCQiMHLZEywjghg3SMre5yatKnO88eEk4XBJkamc6rHzSbETrc3sg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.0.7.tgz", + "integrity": "sha512-+49+cjf62c1YfZgPWyTO11l+UGs6+GR15zROTBNhuTPg5Guwa6nfi4k/0Ir/IMYXWs4V9HiU4ca4rNeMeMlPHw==", "dev": true, "dependencies": { - "@storybook/builder-vite": "7.0.2", - "@storybook/core-server": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/web-components": "7.0.2", + "@storybook/builder-vite": "7.0.7", + "@storybook/core-server": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/web-components": "7.0.7", "magic-string": "^0.27.0" }, "engines": { @@ -4836,6 +4909,11 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ZmI0sZGAUNXUfMWboWwi4LcfpoVUYldyN6Oe0oJ5cCsHDU/LlRq8nQKPXhYLOx36QYSW9bNIb1vvRrD6K7Llgw==" + }, "node_modules/@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -4853,9 +4931,9 @@ "dev": true }, "node_modules/@types/chai-dom": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-0.0.12.tgz", - "integrity": "sha512-4rE7sDw713cV61TYzQbMrPjC4DjNk3x4vk9nAVRNXcSD4p0/5lEEfm0OgoCz5eNuWUXNKA0YiKiH/JDTuKivkA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-1.11.0.tgz", + "integrity": "sha512-Aja99Mmnny+Sz+T2hBK3oEsrcy18yabplT0pGX/QwIke9jMJHdvHlV2f4Tmq5SqxTMYwt1Zjbisv/4r83EUIHw==", "dev": true, "dependencies": { "@types/chai": "*" @@ -4893,9 +4971,9 @@ "dev": true }, "node_modules/@types/convert-source-map": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-1.5.2.tgz", - "integrity": "sha512-tHs++ZeXer40kCF2JpE51Hg7t4HPa18B1b1Dzy96S0eCw8QKECNMYMfwa1edK/x8yCN0r4e6ewvLcc5CsVGkdg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-QUm4YOC/ENo0VjPVl2o8HGyTbHHQGDOw8PCg3rXBucYHKyZN/XjXRbPFAV1tB2FvM0/wyFoDct4cTIctzKrQFg==", "dev": true }, "node_modules/@types/cookie": { @@ -4950,9 +5028,9 @@ "dev": true }, "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "node_modules/@types/express": { @@ -5055,6 +5133,14 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jquery": { + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", + "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", + "dependencies": { + "@types/sizzle": "*" + } + }, "node_modules/@types/js-levenshtein": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz", @@ -5080,9 +5166,9 @@ "dev": true }, "node_modules/@types/koa": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.5.tgz", - "integrity": "sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA==", + "version": "2.13.6", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.6.tgz", + "integrity": "sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw==", "dev": true, "dependencies": { "@types/accepts": "*", @@ -5115,24 +5201,24 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", "dev": true }, "node_modules/@types/lodash-es": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", - "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", + "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", "dev": true, "dependencies": { "@types/lodash": "*" } }, "node_modules/@types/mdx": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.3.tgz", - "integrity": "sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.4.tgz", + "integrity": "sha512-qCYrNdpKwN6YO6FVnx+ulfqifKlE3lQGsNhvDaW9Oxzyob/cRLBJWow8GHBBD4NxQ7BVvtsATgLsX0vZAWmtrg==", "dev": true }, "node_modules/@types/mime": { @@ -5166,21 +5252,35 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.14.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.4.tgz", - "integrity": "sha512-VhCw7I7qO2X49+jaKcAUwi3rR+hbxT5VcYF493+Z5kMLI0DL568b7JI4IDJaxWFH0D/xwmGJNoXisyX+w7GH/g==", + "version": "18.16.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", + "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==", "dev": true }, "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.3.tgz", + "integrity": "sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==", "dev": true, "dependencies": { "@types/node": "*", "form-data": "^3.0.0" } }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", @@ -5224,9 +5324,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", - "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "version": "18.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.38.tgz", + "integrity": "sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -5241,9 +5341,9 @@ "dev": true }, "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", "dev": true }, "node_modules/@types/semver": { @@ -5272,9 +5372,9 @@ } }, "node_modules/@types/sinon": { - "version": "10.0.13", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", - "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==", + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.14.tgz", + "integrity": "sha512-mn72up6cjaMyMuaPaa/AwKf6WtsSRysQC7wxFkCm1XcOKXPM1z+5Y4H5wjIVBz4gdAkjvZxVVfjA6ba1nHr5WQ==", "dev": true, "dependencies": { "@types/sinonjs__fake-timers": "*" @@ -5296,6 +5396,11 @@ "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", "dev": true }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" + }, "node_modules/@types/through": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", @@ -5357,19 +5462,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz", - "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", + "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/type-utils": "5.54.0", - "@typescript-eslint/utils": "5.54.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/type-utils": "5.59.1", + "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -5403,9 +5508,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5424,14 +5529,14 @@ "dev": true }, "node_modules/@typescript-eslint/parser": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", - "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", + "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", "debug": "^4.3.4" }, "engines": { @@ -5450,121 +5555,14 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", - "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", - "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", - "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", - "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.57.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz", - "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", + "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/visitor-keys": "5.54.0" + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5575,13 +5573,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz", - "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", + "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.54.0", - "@typescript-eslint/utils": "5.54.0", + "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -5602,9 +5600,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz", - "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", + "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5615,13 +5613,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz", - "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", + "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/visitor-keys": "5.54.0", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5654,9 +5652,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5675,18 +5673,18 @@ "dev": true }, "node_modules/@typescript-eslint/utils": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz", - "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", + "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/typescript-estree": "5.54.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -5713,9 +5711,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5734,12 +5732,12 @@ "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz", - "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", + "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/types": "5.59.1", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -6528,9 +6526,9 @@ } }, "node_modules/@web/browser-logs": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.5.tgz", - "integrity": "sha512-Qxo1wY/L7yILQqg0jjAaueh+tzdORXnZtxQgWH23SsTCunz9iq9FvsZa8Q5XlpjnZ3vLIsFEuEsCMqFeohJnEg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.6.tgz", + "integrity": "sha512-CNjNVhd4FplRY8PPWIAt02vAowJAVcOoTNrR/NNb/o9pka7yI9qdjpWrWhEbPr2pOXonWb52AeAgdK66B8ZH7w==", "dev": true, "dependencies": { "errorstacks": "^2.2.0" @@ -6564,9 +6562,9 @@ } }, "node_modules/@web/config-loader/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -6585,19 +6583,19 @@ "dev": true }, "node_modules/@web/dev-server": { - "version": "0.1.35", - "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.35.tgz", - "integrity": "sha512-E7TSTSFdGPzhkiE3kIVt8i49gsiAYpJIZHzs1vJmVfdt8U4rsmhE+5roezxZo0hkEw4mNsqj9zCc4Dzqy/IFHg==", + "version": "0.1.38", + "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.38.tgz", + "integrity": "sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.11", "@types/command-line-args": "^5.0.0", "@web/config-loader": "^0.1.3", - "@web/dev-server-core": "^0.3.19", - "@web/dev-server-rollup": "^0.3.19", + "@web/dev-server-core": "^0.4.1", + "@web/dev-server-rollup": "^0.4.1", "camelcase": "^6.2.0", "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.1", + "command-line-usage": "^7.0.1", "debounce": "^1.2.0", "deepmerge": "^4.2.2", "ip": "^1.1.5", @@ -6614,20 +6612,20 @@ } }, "node_modules/@web/dev-server-core": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.19.tgz", - "integrity": "sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.4.1.tgz", + "integrity": "sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==", "dev": true, "dependencies": { "@types/koa": "^2.11.6", "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.2.0", + "@web/parse5-utils": "^1.3.1", "chokidar": "^3.4.3", "clone": "^2.1.2", "es-module-lexer": "^1.0.0", "get-stream": "^6.0.0", "is-stream": "^2.0.0", - "isbinaryfile": "^4.0.6", + "isbinaryfile": "^5.0.0", "koa": "^2.13.0", "koa-etag": "^4.0.0", "koa-send": "^5.0.1", @@ -6643,9 +6641,9 @@ } }, "node_modules/@web/dev-server-core/node_modules/es-module-lexer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.0.tgz", - "integrity": "sha512-2BMfqBDeVCcOlLaL1ZAfp+D868SczNpKArrTM3dhpd7dK/OVlogzY15qpUngt+LMTq5UC/csb9vVQAgupucSbA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", "dev": true }, "node_modules/@web/dev-server-core/node_modules/lru-cache": { @@ -6688,73 +6686,21 @@ "dev": true }, "node_modules/@web/dev-server-esbuild": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-0.3.3.tgz", - "integrity": "sha512-hB9C8X9NsFWUG2XKT3W+Xcw3IZ/VObf4LNbK14BTjApnNyZfV6hVhSlJfvhgOoJ4DxsImfhIB5+gMRKOG9NmBw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-0.3.6.tgz", + "integrity": "sha512-VDcZOzvmbg/z/8Q54hHqFwt9U4cacQJZxgS8YXAvyFuG85HAJ/Q55P7Tr++1NlRS8wQEos6QK2ERUWNjEVOhqQ==", "dev": true, "dependencies": { "@mdn/browser-compat-data": "^4.0.0", - "@web/dev-server-core": "^0.3.19", - "esbuild": "^0.12 || ^0.13 || ^0.14", + "@web/dev-server-core": "^0.4.1", + "esbuild": "^0.16 || ^0.17", "parse5": "^6.0.1", - "ua-parser-js": "^1.0.2" + "ua-parser-js": "^1.0.33" }, "engines": { "node": ">=10.0.0" } }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, "node_modules/@web/dev-server-import-maps": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@web/dev-server-import-maps/-/dev-server-import-maps-0.0.7.tgz", @@ -6772,6 +6718,92 @@ "node": ">=10.0.0" } }, + "node_modules/@web/dev-server-import-maps/node_modules/@web/dev-server-core": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.19.tgz", + "integrity": "sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA==", + "dev": true, + "dependencies": { + "@types/koa": "^2.11.6", + "@types/ws": "^7.4.0", + "@web/parse5-utils": "^1.2.0", + "chokidar": "^3.4.3", + "clone": "^2.1.2", + "es-module-lexer": "^1.0.0", + "get-stream": "^6.0.0", + "is-stream": "^2.0.0", + "isbinaryfile": "^4.0.6", + "koa": "^2.13.0", + "koa-etag": "^4.0.0", + "koa-send": "^5.0.1", + "koa-static": "^5.0.0", + "lru-cache": "^6.0.0", + "mime-types": "^2.1.27", + "parse5": "^6.0.1", + "picomatch": "^2.2.2", + "ws": "^7.4.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@web/dev-server-import-maps/node_modules/es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true + }, + "node_modules/@web/dev-server-import-maps/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@web/dev-server-import-maps/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@web/dev-server-import-maps/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@web/dev-server-import-maps/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@web/dev-server-rollup": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.3.21.tgz", @@ -6841,12 +6873,71 @@ "@types/node": "*" } }, + "node_modules/@web/dev-server-rollup/node_modules/@web/dev-server-core": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.19.tgz", + "integrity": "sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA==", + "dev": true, + "dependencies": { + "@types/koa": "^2.11.6", + "@types/ws": "^7.4.0", + "@web/parse5-utils": "^1.2.0", + "chokidar": "^3.4.3", + "clone": "^2.1.2", + "es-module-lexer": "^1.0.0", + "get-stream": "^6.0.0", + "is-stream": "^2.0.0", + "isbinaryfile": "^4.0.6", + "koa": "^2.13.0", + "koa-etag": "^4.0.0", + "koa-send": "^5.0.1", + "koa-static": "^5.0.0", + "lru-cache": "^6.0.0", + "mime-types": "^2.1.27", + "parse5": "^6.0.1", + "picomatch": "^2.2.2", + "ws": "^7.4.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@web/dev-server-rollup/node_modules/es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true + }, "node_modules/@web/dev-server-rollup/node_modules/estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, + "node_modules/@web/dev-server-rollup/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@web/dev-server-rollup/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@web/dev-server-rollup/node_modules/rollup": { "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", @@ -6862,16 +6953,133 @@ "fsevents": "~2.3.2" } }, + "node_modules/@web/dev-server-rollup/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@web/dev-server-rollup/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@web/dev-server/node_modules/@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^2.42.0" + } + }, + "node_modules/@web/dev-server/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@web/dev-server/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/@web/dev-server/node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@web/dev-server/node_modules/@web/dev-server-rollup": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.4.1.tgz", + "integrity": "sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==", + "dev": true, + "dependencies": { + "@rollup/plugin-node-resolve": "^13.0.4", + "@web/dev-server-core": "^0.4.1", + "nanocolors": "^0.2.1", + "parse5": "^6.0.1", + "rollup": "^2.67.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@web/dev-server/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, "node_modules/@web/dev-server/node_modules/ip": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", "dev": true }, + "node_modules/@web/dev-server/node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/@web/parse5-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.0.tgz", - "integrity": "sha512-Pgkx3ECc8EgXSlS5EyrgzSOoUbM6P8OKS471HLAyvOBcP1NCBn0to4RN/OaKASGq8qa3j+lPX9H14uA5AHEnQg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.1.tgz", + "integrity": "sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==", "dev": true, "dependencies": { "@types/parse5": "^6.0.1", @@ -6882,22 +7090,22 @@ } }, "node_modules/@web/test-runner": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.15.1.tgz", - "integrity": "sha512-61L4mvDSvs8Dp3TdKe7WHc8kxHndHlGheWiIFEMgbfetJua6MZ4jyPThISIHSEq3LdAv9key2aDIdmyzk0YJ6w==", + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.15.3.tgz", + "integrity": "sha512-unwBymuQpI8yc/129K9H0aIzLIIQFrr2/mhdcIWFeZjjw5X3TJh57p5NFOA76nhlBSjFHyu0U0FXw9uOzXUCuQ==", "dev": true, "dependencies": { - "@web/browser-logs": "^0.2.2", + "@web/browser-logs": "^0.2.6", "@web/config-loader": "^0.1.3", - "@web/dev-server": "^0.1.35", - "@web/test-runner-chrome": "^0.11.0", - "@web/test-runner-commands": "^0.6.3", - "@web/test-runner-core": "^0.10.27", + "@web/dev-server": "^0.1.38", + "@web/test-runner-chrome": "^0.12.1", + "@web/test-runner-commands": "^0.6.6", + "@web/test-runner-core": "^0.10.29", "@web/test-runner-mocha": "^0.7.5", "camelcase": "^6.2.0", "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.1", - "convert-source-map": "^1.7.0", + "command-line-usage": "^7.0.1", + "convert-source-map": "^2.0.0", "diff": "^5.0.0", "globby": "^11.0.1", "nanocolors": "^0.2.1", @@ -6913,27 +7121,27 @@ } }, "node_modules/@web/test-runner-chrome": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.11.0.tgz", - "integrity": "sha512-3Eq8C1XEGmfq7iwUvXy0xXfI/fbJNIq2ImDKTVdnwT4+5uTt1i8UFZxZ0PLdkWrhXVtiWI6zcZK/2VBzsGyHBA==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.12.1.tgz", + "integrity": "sha512-QxzinqYHelZQpMHAuc5TYyWVhtHUEGhL3m1p2U+mTTTWrZYX3D0s6Q0oL2+XYT1dsja5sd71h7yiBTb9ctkKOg==", "dev": true, "dependencies": { - "@web/test-runner-core": "^0.10.20", + "@web/test-runner-core": "^0.10.29", "@web/test-runner-coverage-v8": "^0.5.0", "chrome-launcher": "^0.15.0", - "puppeteer-core": "^13.1.3" + "puppeteer-core": "^19.8.1" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@web/test-runner-commands": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.6.5.tgz", - "integrity": "sha512-W+wLg10jEAJY9N6tNWqG1daKmAzxGmTbO/H9fFfcgOgdxdn+hHiR4r2/x1iylKbFLujHUQlnjNQeu2d6eDPFqg==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.6.6.tgz", + "integrity": "sha512-2DcK/+7f8QTicQpGFq/TmvKHDK/6Zald6rn1zqRlmj3pcH8fX6KHNVMU60Za9QgAKdorMBPfd8dJwWba5otzdw==", "dev": true, "dependencies": { - "@web/test-runner-core": "^0.10.27", + "@web/test-runner-core": "^0.10.29", "mkdirp": "^1.0.4" }, "engines": { @@ -6941,24 +7149,24 @@ } }, "node_modules/@web/test-runner-core": { - "version": "0.10.27", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.10.27.tgz", - "integrity": "sha512-ClV/hSxs4wDm/ANFfQOdRRFb/c0sYywC1QfUXG/nS4vTp3nnt7x7mjydtMGGLmvK9f6Zkubkc1aa+7ryfmVwNA==", + "version": "0.10.29", + "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.10.29.tgz", + "integrity": "sha512-0/ZALYaycEWswHhpyvl5yqo0uIfCmZe8q14nGPi1dMmNiqLcHjyFGnuIiLexI224AW74ljHcHllmDlXK9FUKGA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.11", "@types/babel__code-frame": "^7.0.2", "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^1.5.1", + "@types/convert-source-map": "^2.0.0", "@types/debounce": "^1.2.0", "@types/istanbul-lib-coverage": "^2.0.3", "@types/istanbul-reports": "^3.0.0", - "@web/browser-logs": "^0.2.1", - "@web/dev-server-core": "^0.3.18", + "@web/browser-logs": "^0.2.6", + "@web/dev-server-core": "^0.4.1", "chokidar": "^3.4.3", "cli-cursor": "^3.1.0", "co-body": "^6.1.0", - "convert-source-map": "^1.7.0", + "convert-source-map": "^2.0.0", "debounce": "^1.2.0", "dependency-graph": "^0.11.0", "globby": "^11.0.1", @@ -6977,6 +7185,12 @@ "node": ">=12.0.0" } }, + "node_modules/@web/test-runner-core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@web/test-runner-core/node_modules/ip": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", @@ -7031,10 +7245,16 @@ "node": ">=12.0.0" } }, + "node_modules/@web/test-runner/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@xmldom/xmldom": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.6.tgz", - "integrity": "sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.7.tgz", + "integrity": "sha512-sI1Ly2cODlWStkINzqGrZ8K6n+MTSbAeQnAipGyL+KZCXuHaRlj2gyyy8B/9MvsFFqN7XHryQnB2QwhzvJXovg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -7349,6 +7569,19 @@ "node": ">=6" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", @@ -7485,8 +7718,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { "version": "1.0.5", @@ -7501,9 +7733,9 @@ } }, "node_modules/axe-core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", - "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true, "engines": { "node": ">=4" @@ -7606,7 +7838,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -7727,6 +7958,21 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/body-parser/node_modules/raw-body": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", @@ -8038,9 +8284,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", "dev": true, "funding": [ { @@ -8050,6 +8296,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -8065,9 +8315,9 @@ } }, "node_modules/chai-a11y-axe": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/chai-a11y-axe/-/chai-a11y-axe-1.4.0.tgz", - "integrity": "sha512-m7J6DVAl1ePL2ifPKHmwQyHXdCZ+Qfv+qduh6ScqcDfBnJEzpV1K49TblujM45j1XciZOFeFNqMb2sShXMg/mw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/chai-a11y-axe/-/chai-a11y-axe-1.4.1.tgz", + "integrity": "sha512-H3eRQhLbN1bk8thQXjZVKHVPlFGYrrmQ+iR8TwS9ML0HLu0Pjb6c7rMcaRZb99SsWMrenqE+W0AZRApVxlaltg==", "dev": true, "dependencies": { "axe-core": "^4.3.3" @@ -8087,6 +8337,73 @@ "node": ">=4" } }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk-template/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk-template/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/change-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", @@ -8150,9 +8467,9 @@ } }, "node_modules/chrome-launcher": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.1.tgz", - "integrity": "sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "dependencies": { "@types/node": "*", @@ -8179,6 +8496,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/chromium-bidi": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.7.tgz", + "integrity": "sha512-6+mJuFXwTMU6I3vYLs6IL8A1DyQTPjCfIL971X0aMPVGRbGnNfl6i6Cl0NMbxi2bRYLGESt9T2ZIMRM5PAEcIQ==", + "dev": true, + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -8228,9 +8557,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz", + "integrity": "sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==", "dev": true, "engines": { "node": ">=6" @@ -8367,16 +8696,15 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -8400,45 +8728,45 @@ } }, "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", + "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", "dev": true, "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^3.0.0", + "typical": "^7.1.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.20.0" } }, "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12.17" } }, "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12.17" } }, "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { - "node": "^12.20.0 || >=14" + "node": ">=14" } }, "node_modules/commondir": { @@ -8636,9 +8964,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", - "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", + "version": "3.30.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz", + "integrity": "sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==", "dev": true, "dependencies": { "browserslist": "^4.21.5" @@ -8735,9 +9063,9 @@ } }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, "node_modules/debounce": { @@ -8800,15 +9128,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -8816,9 +9135,9 @@ "dev": true }, "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8918,7 +9237,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -9011,9 +9329,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", + "version": "0.0.1107588", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz", + "integrity": "sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg==", "dev": true }, "node_modules/diff": { @@ -9167,20 +9485,20 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.315", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.315.tgz", - "integrity": "sha512-ndBQYz3Eyy3rASjjQ9poMJGoAlsZ/aZnq6GBsGL4w/4sWIAwiUHVSsMuADbxa8WJw7pZ0oxLpGbtoDt4vRTdCg==", + "version": "1.4.371", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.371.tgz", + "integrity": "sha512-jlBzY4tFcJaiUjzhRTCWAqRvTO/fWzjA3Bls0mykzGZ7zvcMP7h05W6UcgzfT9Ca1SW2xyKDOFRyI0pQeRNZGw==", "dev": true }, "node_modules/element-internals-polyfill": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/element-internals-polyfill/-/element-internals-polyfill-1.2.3.tgz", - "integrity": "sha512-73KWRk5D3hYkaqK/XZtwTEabdwp5R6eo6vZvFMKpv995k1j8pV9FTeGhE8C/q6tN+wNQrRmj2BUMYHU884PGIA==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/element-internals-polyfill/-/element-internals-polyfill-1.3.1.tgz", + "integrity": "sha512-IeM6FjSEOg5IF5NEj9akC8OnMZEJfSkevSu12U4Ns6XvUdqvM7gxPvFJrVRW+hsQ1IG0cAfAs5pcMXTpdRxCSg==" }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", "dev": true }, "node_modules/encodeurl": { @@ -9202,9 +9520,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", + "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -9214,6 +9532,18 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", @@ -9242,18 +9572,18 @@ "dev": true }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -9261,8 +9591,8 @@ "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", @@ -9270,11 +9600,12 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-length": "^1.0.4", @@ -9361,9 +9692,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", - "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", + "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", "dev": true, "hasInstallScript": true, "bin": { @@ -9373,284 +9704,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.15", - "@esbuild/android-arm64": "0.17.15", - "@esbuild/android-x64": "0.17.15", - "@esbuild/darwin-arm64": "0.17.15", - "@esbuild/darwin-x64": "0.17.15", - "@esbuild/freebsd-arm64": "0.17.15", - "@esbuild/freebsd-x64": "0.17.15", - "@esbuild/linux-arm": "0.17.15", - "@esbuild/linux-arm64": "0.17.15", - "@esbuild/linux-ia32": "0.17.15", - "@esbuild/linux-loong64": "0.17.15", - "@esbuild/linux-mips64el": "0.17.15", - "@esbuild/linux-ppc64": "0.17.15", - "@esbuild/linux-riscv64": "0.17.15", - "@esbuild/linux-s390x": "0.17.15", - "@esbuild/linux-x64": "0.17.15", - "@esbuild/netbsd-x64": "0.17.15", - "@esbuild/openbsd-x64": "0.17.15", - "@esbuild/sunos-x64": "0.17.15", - "@esbuild/win32-arm64": "0.17.15", - "@esbuild/win32-ia32": "0.17.15", - "@esbuild/win32-x64": "0.17.15" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" + "@esbuild/android-arm": "0.17.18", + "@esbuild/android-arm64": "0.17.18", + "@esbuild/android-x64": "0.17.18", + "@esbuild/darwin-arm64": "0.17.18", + "@esbuild/darwin-x64": "0.17.18", + "@esbuild/freebsd-arm64": "0.17.18", + "@esbuild/freebsd-x64": "0.17.18", + "@esbuild/linux-arm": "0.17.18", + "@esbuild/linux-arm64": "0.17.18", + "@esbuild/linux-ia32": "0.17.18", + "@esbuild/linux-loong64": "0.17.18", + "@esbuild/linux-mips64el": "0.17.18", + "@esbuild/linux-ppc64": "0.17.18", + "@esbuild/linux-riscv64": "0.17.18", + "@esbuild/linux-s390x": "0.17.18", + "@esbuild/linux-x64": "0.17.18", + "@esbuild/netbsd-x64": "0.17.18", + "@esbuild/openbsd-x64": "0.17.18", + "@esbuild/sunos-x64": "0.17.18", + "@esbuild/win32-arm64": "0.17.18", + "@esbuild/win32-ia32": "0.17.18", + "@esbuild/win32-x64": "0.17.18" } }, "node_modules/esbuild-plugin-alias": { @@ -9671,70 +9746,6 @@ "esbuild": ">=0.12 <1" } }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -9760,13 +9771,15 @@ } }, "node_modules/eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -9776,10 +9789,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -9801,7 +9813,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -9849,18 +9860,19 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz", - "integrity": "sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", "dev": true, "dependencies": { "debug": "^4.3.4", - "enhanced-resolve": "^5.10.0", - "get-tsconfig": "^4.2.0", - "globby": "^13.1.2", - "is-core-module": "^2.10.0", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", - "synckit": "^0.8.4" + "synckit": "^0.8.5" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -9874,9 +9886,9 @@ } }, "node_modules/eslint-import-resolver-typescript/node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", @@ -9905,9 +9917,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -9981,9 +9993,9 @@ } }, "node_modules/eslint-plugin-lit": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.8.2.tgz", - "integrity": "sha512-4mOGcSRNEPMh7AN2F7Iy6no36nuFgyYOsnTRhFw1k8xyy1Zm6QOp788ywDvJqy+eelFbLPBhq20Qr55a887Dmw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.8.3.tgz", + "integrity": "sha512-wmeYfBnWPUChbdZagOhG519gaWz9Q7OGT/nCx3YVHuCCrW9q9u0p/IQueQeoaMojUqOSgM/22oSDOaBruYGqag==", "dev": true, "dependencies": { "parse5": "^6.0.1", @@ -9998,20 +10010,20 @@ } }, "node_modules/eslint-plugin-lit-a11y": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit-a11y/-/eslint-plugin-lit-a11y-2.3.0.tgz", - "integrity": "sha512-k6j7I6hGJmcojFHIotACgnNgggcK4fvYy+uTVrdseenyzp13yacSlaJtvC3k5kEAKoSIVK1fYiKbufYnvEFegQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-lit-a11y/-/eslint-plugin-lit-a11y-2.4.1.tgz", + "integrity": "sha512-UljRja/2cVrNtgnCDj5sCT3Larxda4mGqbsPhlksvECo0+KCD8EuUori/P6wFeFqk+pHlkIC3W200E5q85E3VQ==", "dev": true, "dependencies": { "aria-query": "^5.1.3", "axe-core": "^4.3.3", "axobject-query": "^2.2.0", "dom5": "^3.0.1", - "emoji-regex": "^9.2.0", + "emoji-regex": "^10.2.1", "eslint-plugin-lit": "^1.6.0", "eslint-rule-extender": "0.0.1", "language-tags": "^1.0.5", - "parse5": "^5.1.1", + "parse5": "^7.1.2", "parse5-htmlparser2-tree-adapter": "^6.0.1", "requireindex": "~1.2.0" }, @@ -10020,10 +10032,16 @@ } }, "node_modules/eslint-plugin-lit-a11y/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/eslint-plugin-local-rules": { "version": "1.3.2", @@ -10059,9 +10077,9 @@ } }, "node_modules/eslint-plugin-wc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-1.4.0.tgz", - "integrity": "sha512-AmoKhJyBNcS3I+dbS/JTmRSq4REUvQ/JJCeWJezlK8gqTsdr5JD+EAvHldH/tVvU+l6qR2Tykga5hTINP9zS8A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-1.5.0.tgz", + "integrity": "sha512-KFSfiHDol/LeV7U6IX8GdgpGf/s3wG8FTG120Rml/hGNB/DkCuGYQhlf0VgdBdf7gweem8Nlsh5o64HNdj+qPA==", "dev": true, "dependencies": { "is-valid-element-name": "^1.0.0", @@ -10097,40 +10115,16 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ansi-styles": { @@ -10183,9 +10177,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -10193,6 +10187,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { @@ -10277,14 +10274,14 @@ } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -10482,6 +10479,21 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -10652,9 +10664,9 @@ } }, "node_modules/file-system-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.0.2.tgz", - "integrity": "sha512-lp4BHO4CWqvRyx88Tt3quZic9ZMf4cJyquYq7UI8sH42Bm2ArlBBjKQAalZOo+UfaBassb7X123Lik5qZ/tSAA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.1.1.tgz", + "integrity": "sha512-vgZ1uDsK29DM4pptUOv47zdJO2tYM5M/ERyAE9Jk0QBN6e64Md+a+xJSOp68dCCDH4niFMVD8nC8n8A5ic0bmg==", "dev": true, "dependencies": { "fs-extra": "^11.1.0", @@ -10905,14 +10917,33 @@ "dev": true }, "node_modules/flow-parser": { - "version": "0.203.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.203.1.tgz", - "integrity": "sha512-Nw2M8MPP/Zb+yhvmPDEjzkCXLtgyWGKXZjAYOVftm+wIf3xd4FKa7nRI9v67rODs0WzxMbPc8IPs/7o/dyxo/Q==", + "version": "0.204.1", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.204.1.tgz", + "integrity": "sha512-PoeSF0VhSORn3hYzD/NxsQjXX1iLU0UZXzVwZXnRWjeVsedmvDo4epd7PtCQjxveGajmVlyVW35BOOOkqLqJpw==", "dev": true, "engines": { "node": ">=0.4.0" } }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -10944,10 +10975,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -10982,9 +11012,9 @@ "dev": true }, "node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -11189,9 +11219,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz", - "integrity": "sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", "dev": true, "funding": { "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" @@ -11409,9 +11439,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/grapheme-splitter": { @@ -12051,9 +12081,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -12205,9 +12235,9 @@ } }, "node_modules/is-node-process": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.0.1.tgz", - "integrity": "sha512-5IcdXuf++TTNt3oGl9EBdkvndXA8gmc4bz/Y+mdEpWh3Mcn/+kOw6hI7LD5CocqJWMzeb0I0ClndRVNdEPuJXQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true }, "node_modules/is-number": { @@ -12472,12 +12502,12 @@ "dev": true }, "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", "dev": true, "engines": { - "node": ">= 8.0.0" + "node": ">= 14.0.0" }, "funding": { "url": "https://github.com/sponsors/gjtorikian/" @@ -12818,9 +12848,9 @@ "dev": true }, "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true, "funding": { "type": "opencollective", @@ -13082,9 +13112,9 @@ } }, "node_modules/koa": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.1.tgz", - "integrity": "sha512-USJFyZgi2l0wDgqkfD27gL4YGno7TfUkcmOe6UOLFOVuN+J7FwnNu4Dydl4CUQzraM1lBAiGed0M9OVJoT0Kqw==", + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", + "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", "dev": true, "dependencies": { "accepts": "^1.3.5", @@ -13349,9 +13379,9 @@ "dev": true }, "node_modules/lit": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.0.tgz", - "integrity": "sha512-qSy2BAVA+OiWtNptP404egcC/izDdNRw6iHGIbUmkZtbMJvPKfNsaoKrNs8Zmsbjmv5ZX2tur1l9TfzkSWWT4g==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.2.tgz", + "integrity": "sha512-9QnZmG5mIKPRja96cpndMclLSi0Qrz2BXD6EbqNqCKMMjOWVm/BwAeXufFk2jqFsNmY07HOzU8X+8aTSVt3yrA==", "dependencies": { "@lit/reactive-element": "^1.6.0", "lit-element": "^3.3.0", @@ -13359,9 +13389,9 @@ } }, "node_modules/lit-element": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.0.tgz", - "integrity": "sha512-M3OIoblNS7LZdRxOIk8g0wyLEA/lRw/UGJ1TX+767OpkuDsRdSoxBIvewpWqCo7sMd9xt1XedUNZIr9jUO1X3g==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.1.tgz", + "integrity": "sha512-Gl+2409uXWbf7n6cCl7Kzasm7zjT9xmdwi2BhLNi70sRKAgRkqueDu5mSIH3hPYMM0/vqBCdPXod3NbGkRA2ww==", "dependencies": { "@lit-labs/ssr-dom-shim": "^1.1.0", "@lit/reactive-element": "^1.3.0", @@ -13369,9 +13399,9 @@ } }, "node_modules/lit-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.0.tgz", - "integrity": "sha512-/zPOl8EfeB3HHpTzINSpnWgvgQ8N07g/j272EOAIyB0Ys2RzBqTVT23i+JZuUlNbB2WHHeSsTCFi92NtWrtpqQ==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.2.tgz", + "integrity": "sha512-ZJCfKlA2XELu5tn7XuzOziGFGvf1SeQm+ngLWoJ8bXtSkRrrR3ms6SWy+gsdxeYwySLij5xAhdd2C3EX0ftxdQ==", "dependencies": { "@types/trusted-types": "^2.0.2" } @@ -13402,6 +13432,12 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, + "node_modules/lodash.assignwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", + "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==", + "dev": true + }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -13758,7 +13794,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -13767,7 +13802,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -13806,9 +13840,9 @@ } }, "node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, "engines": { "node": ">=8" @@ -13845,6 +13879,12 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/mitt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", + "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", + "dev": true + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -13884,9 +13924,9 @@ "dev": true }, "node_modules/msw": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/msw/-/msw-1.1.0.tgz", - "integrity": "sha512-oqMvUXm1bMbwvGpoXAQVz8vXXQyQyx52HBDg3EDOK+dFXkQHssgkXEG4LfMwwZyr2Qt18I/w04XPaY4BkFTkzA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/msw/-/msw-1.2.1.tgz", + "integrity": "sha512-bF7qWJQSmKn6bwGYVPXOxhexTCGD5oJSZg8yt8IBClxvo3Dx/1W0zqE1nX9BSWmzRsCKWfeGWcB/vpqV6aclpw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -13899,12 +13939,12 @@ "chokidar": "^3.4.2", "cookie": "^0.4.2", "graphql": "^15.0.0 || ^16.0.0", - "headers-polyfill": "^3.1.0", + "headers-polyfill": "^3.1.2", "inquirer": "^8.2.0", - "is-node-process": "^1.0.1", + "is-node-process": "^1.2.0", "js-levenshtein": "^1.1.6", "node-fetch": "^2.6.7", - "outvariant": "^1.3.0", + "outvariant": "^1.4.0", "path-to-regexp": "^6.2.0", "strict-event-emitter": "^0.4.3", "type-fest": "^2.19.0", @@ -13921,7 +13961,7 @@ "url": "https://opencollective.com/mswjs" }, "peerDependencies": { - "typescript": ">= 4.4.x <= 4.9.x" + "typescript": ">= 4.4.x <= 5.0.x" }, "peerDependenciesMeta": { "typescript": { @@ -14021,10 +14061,16 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14102,9 +14148,9 @@ } }, "node_modules/node-fetch-native": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.2.tgz", - "integrity": "sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.1.0.tgz", + "integrity": "sha512-nl5goFCig93JZ9FIV8GHT9xpNqXbxQUzkOmKIMKmncsBH9jhg7qKex8hirpymkBFmNQ114chEEG5lS4wgK2I+Q==", "dev": true }, "node_modules/node-fetch/node_modules/tr46": { @@ -14160,9 +14206,9 @@ } }, "node_modules/node-plop/node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", @@ -14178,6 +14224,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/node-plop/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, "node_modules/node-plop/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -14437,14 +14495,14 @@ } }, "node_modules/openapi-typescript-codegen": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.23.0.tgz", - "integrity": "sha512-gOJXy5g3H3HlLpVNN+USrNK2i2KYBmDczk9Xk34u6JorwrGiDJZUj+al4S+i9TXdfUQ/ZaLxE59Xf3wqkxGfqA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.24.0.tgz", + "integrity": "sha512-rSt8t1XbMWhv6Db7GUI24NNli7FU5kzHLxcE8BpzgGWRdWyWt9IB2YoLyPahxNrVA7yOaVgnXPkrcTDRMQtJYg==", "dev": true, "dependencies": { "camelcase": "^6.3.0", - "commander": "^9.3.0", - "fs-extra": "^10.1.0", + "commander": "^10.0.0", + "fs-extra": "^11.1.1", "handlebars": "^4.7.7", "json-schema-ref-parser": "^9.0.9" }, @@ -14452,18 +14510,12 @@ "openapi": "bin/index.js" } }, - "node_modules/openapi-typescript-codegen/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" } }, "node_modules/optionator": { @@ -14568,9 +14620,9 @@ } }, "node_modules/outvariant": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.3.0.tgz", - "integrity": "sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.0.tgz", + "integrity": "sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==", "dev": true }, "node_modules/p-limit": { @@ -14887,13 +14939,13 @@ } }, "node_modules/playwright": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.31.1.tgz", - "integrity": "sha512-zKJabsIA2rvOwJ12lGTqWv4HVJzlfw2JtUvO4hAr7J8UXQZ1qEPpX20E1vcz/9fotnTkwgqp3CVdIBwptBN3Fg==", + "version": "1.32.3", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.32.3.tgz", + "integrity": "sha512-h/ylpgoj6l/EjkfUDyx8cdOlfzC96itPpPe8BXacFkqpw/YsuxkpPyVbzEq4jw+bAJh5FLgh31Ljg2cR6HV3uw==", "dev": true, "hasInstallScript": true, "dependencies": { - "playwright-core": "1.31.1" + "playwright-core": "1.32.3" }, "bin": { "playwright": "cli.js" @@ -14903,9 +14955,9 @@ } }, "node_modules/playwright-core": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.31.1.tgz", - "integrity": "sha512-JTyX4kV3/LXsvpHkLzL2I36aCdml4zeE35x+G5aPc4bkLsiRiQshU5lWeVpHFAuC8xAcbI6FDcw/8z3q2xtJSQ==", + "version": "1.32.3", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.3.tgz", + "integrity": "sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==", "dev": true, "bin": { "playwright": "cli.js" @@ -14915,9 +14967,9 @@ } }, "node_modules/playwright-msw": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/playwright-msw/-/playwright-msw-2.2.0.tgz", - "integrity": "sha512-Uaf4riamSeAp2saQdnxros8zEYYCC0jXx+KtmlcOpkdZPX3cvrh6rYpHRwu/4UYIZg0BcnYItTFXEZ0tbd6Ztg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/playwright-msw/-/playwright-msw-2.2.1.tgz", + "integrity": "sha512-LjT68LWqzJX8boy4KbnPp5ACLf7WDpt6RUem0tQQcQKys+45KNlluzBx8HEl1HNiCBYV/XZw1aI1aD2giKXWRg==", "dev": true, "dependencies": { "@mswjs/cookies": "^0.2.2", @@ -14965,41 +15017,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/plop/node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/plop/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/plop/node_modules/chalk": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", @@ -15068,18 +15085,18 @@ } }, "node_modules/plop/node_modules/ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.0.tgz", + "integrity": "sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ==", "dev": true, "dependencies": { - "bl": "^5.0.0", "chalk": "^5.0.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.6.1", "is-interactive": "^2.0.0", "is-unicode-supported": "^1.1.0", "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", "strip-ansi": "^7.0.1", "wcwidth": "^1.0.1" }, @@ -15178,9 +15195,9 @@ } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "dev": true, "funding": [ { @@ -15190,10 +15207,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -15342,117 +15363,39 @@ } }, "node_modules/puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", + "version": "19.11.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.11.0.tgz", + "integrity": "sha512-UBlwpyTEKcaOt7bIWWhlhIXDlFbR1wVBcxpMibBhImwagkwDB8ld8ehT5dOdfKIcCHjxXzVEaMtgDKzfwcf7Rg==", "dev": true, "dependencies": { + "@puppeteer/browsers": "0.5.0", + "chromium-bidi": "0.4.7", "cross-fetch": "3.1.5", "debug": "4.3.4", - "devtools-protocol": "0.0.981744", + "devtools-protocol": "0.0.1107588", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", "tar-fs": "2.1.1", "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "ws": "8.13.0" }, "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/puppeteer-core/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/puppeteer-core/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/puppeteer-core/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/puppeteer-core/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/puppeteer-core/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "engines": { - "node": ">=10.0.0" + "node": ">=14.14.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "typescript": ">= 4.7.4" }, "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { + "typescript": { "optional": true } } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", "dev": true, "dependencies": { "side-channel": "^1.0.4" @@ -15693,9 +15636,9 @@ } }, "node_modules/readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -15755,15 +15698,6 @@ "node": ">= 10.13.0" } }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -15798,14 +15732,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -15814,18 +15748,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -15930,12 +15852,12 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -16085,9 +16007,9 @@ } }, "node_modules/rollup": { - "version": "3.20.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.7.tgz", - "integrity": "sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.0.tgz", + "integrity": "sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -16101,12 +16023,12 @@ } }, "node_modules/rollup-plugin-dts": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-5.2.0.tgz", - "integrity": "sha512-B68T/haEu2MKcz4kNUhXB8/h5sq4gpplHAJIYNHbh8cp4ZkvzDvNca/11KQdFrB9ZeKucegQIotzo5T0JUtM8w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-5.3.0.tgz", + "integrity": "sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==", "dev": true, "dependencies": { - "magic-string": "^0.29.0" + "magic-string": "^0.30.0" }, "engines": { "node": ">=v14" @@ -16119,13 +16041,13 @@ }, "peerDependencies": { "rollup": "^3.0.0", - "typescript": "^4.1" + "typescript": "^4.1 || ^5.0" } }, "node_modules/rollup-plugin-dts/node_modules/magic-string": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", - "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" @@ -16156,9 +16078,9 @@ } }, "node_modules/rollup-plugin-esbuild/node_modules/es-module-lexer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.0.tgz", - "integrity": "sha512-2BMfqBDeVCcOlLaL1ZAfp+D868SczNpKArrTM3dhpd7dK/OVlogzY15qpUngt+LMTq5UC/csb9vVQAgupucSbA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", "dev": true }, "node_modules/rollup-plugin-url": { @@ -16260,9 +16182,9 @@ } }, "node_modules/safe-stable-stringify": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz", - "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "dev": true, "engines": { "node": ">=10" @@ -16284,15 +16206,15 @@ } }, "node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -16451,9 +16373,9 @@ "dev": true }, "node_modules/set-cookie-parser": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", - "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", "dev": true }, "node_modules/setprototypeof": { @@ -16699,9 +16621,9 @@ } }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -16725,9 +16647,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "node_modules/sprintf-js": { @@ -16745,6 +16667,56 @@ "node": ">= 0.8" } }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stdin-discarder/node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/stdin-discarder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -16764,12 +16736,12 @@ "dev": true }, "node_modules/storybook": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.0.2.tgz", - "integrity": "sha512-/XBLhT9Vb14yNBcA9rlW15y+C6IsCA3kx5PKvK9kL10sKCi8invcY94UfCSisXe8HqsO3u6peumo2xpYucKMjw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.0.7.tgz", + "integrity": "sha512-MaFAhpPm/KsaoIQfGzapnRyXNh1VbS8l38BNZR5ZD97ejGkLukJ7TO4fFS87Hyy6whAXo6tTdtqeCByMQ9gRFA==", "dev": true, "dependencies": { - "@storybook/cli": "7.0.2" + "@storybook/cli": "7.0.7" }, "bin": { "sb": "index.js", @@ -16780,6 +16752,15 @@ "url": "https://opencollective.com/storybook" } }, + "node_modules/stream-read-all": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", + "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", @@ -16841,6 +16822,23 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", @@ -16958,36 +16956,42 @@ } }, "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", + "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", "dev": true, "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" + "@75lb/deep-merge": "^1.1.1", + "array-back": "^6.2.2", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.0", + "stream-read-all": "^3.0.1", + "typical": "^7.1.1", + "wordwrapjs": "^5.1.0" + }, + "bin": { + "table-layout": "bin/cli.js" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.17" } }, "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12.17" } }, "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12.17" } }, "node_modules/tapable": { @@ -17057,9 +17061,9 @@ "dev": true }, "node_modules/telejson": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.0.4.tgz", - "integrity": "sha512-J4QEuCnYGXAI9KSN7RXK0a0cOW2ONpjc4IQbInGZ6c3stvplLAYyZjTnScrRd8deXVjNCFV1wXcLC7SObDuQYA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.1.0.tgz", + "integrity": "sha512-jFJO4P5gPebZAERPkJsqMAQ0IMA1Hi0AoSfxpnUaV6j6R2SZqlpkbS20U6dEUtA3RUYt2Ak/mTlkQzHH9Rv/hA==", "dev": true, "dependencies": { "memoizerific": "^1.11.3" @@ -17518,9 +17522,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", - "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -17550,9 +17554,9 @@ } }, "node_modules/typescript-json-schema/node_modules/@types/node": { - "version": "16.18.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.16.tgz", - "integrity": "sha512-ZOzvDRWp8dCVBmgnkIqYCArgdFOO9YzocZp8Ra25N/RStKiWvMOXHMz+GjSeVNe5TstaTmTWPucGJkDw0XXJWA==", + "version": "16.18.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.24.tgz", + "integrity": "sha512-zvSN2Esek1aeLdKDYuntKAYjti9Z2oT4I8bfkLLhIxHlv3dwZ5vvATxOc31820iYm4hQRCwjUgDpwSMFjfTUnw==", "dev": true }, "node_modules/typescript-json-schema/node_modules/glob": { @@ -17598,9 +17602,9 @@ } }, "node_modules/ua-parser-js": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz", - "integrity": "sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ==", + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", "dev": true, "funding": [ { @@ -17800,9 +17804,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -17812,6 +17816,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -17819,7 +17827,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -17901,12 +17909,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/uuid-browser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz", - "integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==", - "dev": true - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -18338,9 +18340,9 @@ } }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "node_modules/which-typed-array": { @@ -18400,25 +18402,12 @@ "dev": true }, "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12.17" } }, "node_modules/wrap-ansi": { @@ -18473,9 +18462,9 @@ } }, "node_modules/ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true, "engines": { "node": ">=10.0.0" @@ -18583,19 +18572,34 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "router-slot-1.6.0": { - "extraneous": true } }, "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "@75lb/deep-merge": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", + "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "lodash.assignwith": "^4.2.0", + "typical": "^7.1.1" + }, + "dependencies": { + "typical": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", + "dev": true + } + } + }, + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, @@ -18638,9 +18642,9 @@ } }, "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "requires": { "@babel/highlight": "^7.18.6" @@ -18653,21 +18657,21 @@ "dev": true }, "@babel/core": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz", - "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.0", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-module-transforms": "^7.21.2", "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.0", + "@babel/parser": "^7.21.4", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -18676,28 +18680,15 @@ } }, "@babel/generator": { - "version": "7.21.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz", - "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "dev": true, "requires": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.21.4", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@babel/helper-annotate-as-pure": { @@ -18816,12 +18807,12 @@ } }, "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" } }, "@babel/helper-module-transforms": { @@ -18961,9 +18952,9 @@ } }, "@babel/parser": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -19898,19 +19889,19 @@ } }, "@babel/traverse": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz", - "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", "debug": "^4.1.0", "globals": "^11.1.0" } @@ -19967,168 +19958,183 @@ "dev": true }, "@esbuild/android-arm": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", - "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.18.tgz", + "integrity": "sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", - "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz", + "integrity": "sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", - "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.18.tgz", + "integrity": "sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", - "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz", + "integrity": "sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", - "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz", + "integrity": "sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", - "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz", + "integrity": "sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", - "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz", + "integrity": "sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", - "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz", + "integrity": "sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", - "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz", + "integrity": "sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", - "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz", + "integrity": "sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", - "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz", + "integrity": "sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", - "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz", + "integrity": "sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", - "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz", + "integrity": "sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", - "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz", + "integrity": "sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", - "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz", + "integrity": "sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", - "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz", + "integrity": "sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", - "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz", + "integrity": "sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", - "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz", + "integrity": "sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", - "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz", + "integrity": "sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", - "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz", + "integrity": "sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", - "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz", + "integrity": "sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", - "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz", + "integrity": "sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==", "dev": true, "optional": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true + }, "@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.1", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -20170,9 +20176,9 @@ } }, "@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", "dev": true }, "@esm-bundle/chai": { @@ -20408,13 +20414,14 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { @@ -20430,19 +20437,27 @@ "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } } }, "@jsdevtools/ono": { @@ -20497,9 +20512,9 @@ } }, "@mswjs/interceptors": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.8.tgz", - "integrity": "sha512-hjS5dy8u+Baa5r/SVAQyWZYQr8YZzpeGldNXJlZQBPjt7FQL7Acd1BnXJWmIhl62s5uh0WJNAcUMfAAcnqTchA==", + "version": "0.17.9", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.17.9.tgz", + "integrity": "sha512-4LVGt03RobMH/7ZrbHqRxQrS9cc2uh+iNKSj8UWr8M26A2i793ju+csaB5zaqYltqJmA2jUq4VeYfKmVqvsXQg==", "dev": true, "requires": { "@open-draft/until": "^1.0.3", @@ -20601,35 +20616,35 @@ } }, "@open-wc/semantic-dom-diff": { - "version": "0.19.7", - "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.19.7.tgz", - "integrity": "sha512-ahwHb7arQXXnkIGCrOsM895FJQrU47VWZryCsSSzl5nB3tJKcJ8yjzQ3D/yqZn6v8atqOz61vaY05aNsqoz3oA==", + "version": "0.19.9", + "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.19.9.tgz", + "integrity": "sha512-iUL0OPA6PeLQVEEJ/gsgkEiwOGgK4E1KS//zTB+u+OAh0NifNTfxDxIHQa7rEGvplaq2b2zztT2yyzOzj+MlAA==", "dev": true, "requires": { "@types/chai": "^4.3.1", - "@web/test-runner-commands": "^0.6.1" + "@web/test-runner-commands": "^0.6.5" } }, "@open-wc/testing": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@open-wc/testing/-/testing-3.1.7.tgz", - "integrity": "sha512-HCS2LuY6hXtEwjqmad+eanId5H7E+3mUi9Z3rjAhH+1DCJ53lUnjzWF1lbCYbREqrdCpmzZvW1t5R3e9gJZSCA==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@open-wc/testing/-/testing-3.1.8.tgz", + "integrity": "sha512-SpKhlSwCqUkVOOmdb9RanOQgqv4T32wzExkvuaVcUFcBeUdpwQsg1+WYpdv31Z4cRCkAhQ4A8OIpGphzqF8T7w==", "dev": true, "requires": { "@esm-bundle/chai": "^4.3.4-fix.0", "@open-wc/chai-dom-equals": "^0.12.36", "@open-wc/semantic-dom-diff": "^0.19.7", - "@open-wc/testing-helpers": "^2.1.4", + "@open-wc/testing-helpers": "^2.2.1", "@types/chai": "^4.2.11", - "@types/chai-dom": "^0.0.12", + "@types/chai-dom": "^1.11.0", "@types/sinon-chai": "^3.2.3", "chai-a11y-axe": "^1.3.2" } }, "@open-wc/testing-helpers": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@open-wc/testing-helpers/-/testing-helpers-2.1.4.tgz", - "integrity": "sha512-iZJxxKI9jRgnPczm8p2jpuvBZ3DHYSLrBmhDfzs7ol8vXMNt+HluzM1j1TSU95MFVGnfaspvvt9fMbXKA7cNcA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@open-wc/testing-helpers/-/testing-helpers-2.2.1.tgz", + "integrity": "sha512-8zuJK7tUQYuXRIC/cVcPbAPOhtBJCe3Jfpk7im7WK0DIAXH9Q/ycB+yu3R8g4BQ31f/FdLjIFRbPZzIU75kkRg==", "dev": true, "requires": { "@open-wc/scoped-elements": "^2.1.3", @@ -20637,6 +20652,19 @@ "lit-html": "^2.0.0" } }, + "@openid/appauth": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@openid/appauth/-/appauth-1.3.1.tgz", + "integrity": "sha512-e54kpi219wES2ijPzeHe1kMnT8VKH8YeTd1GAn9BzVBmutz3tBgcG1y8a4pziNr4vNjFnuD4W446Ua7ELnNDiA==", + "requires": { + "@types/base64-js": "^1.3.0", + "@types/jquery": "^3.5.5", + "base64-js": "^1.5.1", + "follow-redirects": "^1.13.3", + "form-data": "^4.0.0", + "opener": "^1.5.2" + } + }, "@pkgr/utils": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", @@ -20652,14 +20680,30 @@ } }, "@playwright/test": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.31.1.tgz", - "integrity": "sha512-IsytVZ+0QLDh1Hj83XatGp/GsI1CDJWbyDaBGbainsh0p2zC7F4toUocqowmjS6sQff2NGT3D9WbDj/3K2CJiA==", + "version": "1.32.3", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.32.3.tgz", + "integrity": "sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==", "dev": true, "requires": { "@types/node": "*", "fsevents": "2.3.2", - "playwright-core": "1.31.1" + "playwright-core": "1.32.3" + } + }, + "@puppeteer/browsers": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-0.5.0.tgz", + "integrity": "sha512-Uw6oB7VvmPRLE4iKsjuOh8zgDabhNX67dzo8U/BB0f9527qx+4eeUs+korU98OhG5C4ubg7ufBgVi63XYwS6TQ==", + "dev": true, + "requires": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" } }, "@rollup/plugin-json": { @@ -20672,15 +20716,15 @@ } }, "@rollup/plugin-node-resolve": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.1.tgz", - "integrity": "sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.0.2.tgz", + "integrity": "sha512-Y35fRGUjC3FaurG722uhUuG8YHOJRJQbI6/CkbRkdPotSpDj9NtIN85z1zrcyDcCQIW4qp5mgG72U+gJ0TAFEg==", "dev": true, "requires": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.0", + "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" } @@ -20703,40 +20747,40 @@ "dev": true }, "@storybook/addon-a11y": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.0.2.tgz", - "integrity": "sha512-PCJaLdp/3MypMYQufLIaKL4gzZjDgU8fTW45O7feXwiUZzFUVZamBwBw5BHcHAPsDOr5CmebGvJ9+l2gByWL/g==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.0.7.tgz", + "integrity": "sha512-juLmRgUh1quGoqHyG7Ttpvj/2nIyIhcuidDKXo5ot7IbJ/g80e4o2BFPbMUT1Qdq9TL/ahbNxeP7QjV0oRJKxQ==", "dev": true, "requires": { - "@storybook/addon-highlight": "7.0.2", - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/addon-highlight": "7.0.7", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "axe-core": "^4.2.0", "lodash": "^4.17.21", "react-resize-detector": "^7.1.2" } }, "@storybook/addon-actions": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.2.tgz", - "integrity": "sha512-rcj39u9MrmzsrDWYt1zsoVxrogZ1Amrv9xkEofEY/QKUr2R3xpHhTALveY9BKIlG1GoE8zLlLoP2k4nz3sNNwQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.0.7.tgz", + "integrity": "sha512-WxsnSjAvdf6NhUfTqcwV+FJmsJV56gh2cY4QnGfqfwO5zoBWTUYnhz57TgxSMhJY0kspyX9Q1Kc//r1d5lt1qA==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "dequal": "^2.0.2", "lodash": "^4.17.21", "polished": "^4.2.2", @@ -20744,69 +20788,69 @@ "react-inspector": "^6.0.0", "telejson": "^7.0.3", "ts-dedent": "^2.0.0", - "uuid-browser": "^3.1.0" + "uuid": "^9.0.0" } }, "@storybook/addon-backgrounds": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.2.tgz", - "integrity": "sha512-yRNHQ4PPRJ+HIORQPhDGxn5xolw1xW0ByQZoNRpMD+AMEyfUNFdWbCsRQAOWjNhawxVMHM7EeA2Exrb41zhEjA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.0.7.tgz", + "integrity": "sha512-DhT32K1+ti7MXY9oqt36b9jlg7iY68IP0ZQbR3gjShcsIXZpFqh18TQo0vwDY1ldqnBvkTk6Jd5vcxA8tfyshw==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "memoizerific": "^1.11.3", "ts-dedent": "^2.0.0" } }, "@storybook/addon-controls": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.0.2.tgz", - "integrity": "sha512-dMpRtj5cmfC9vEMve5ncvbWCEC+WD9YuzJ+grdc48E/Hd//p+O2FE6klSkrz5FAjrc+rHINixdyssekpEL6nYQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.0.7.tgz", + "integrity": "sha512-/QEzleKoWRQ3i7KB32QvqDGcGMw4kG2BxEf0d+ymxd2SjoeL6kX2eHE0b4OxFPXiWUyTfXBFwmcI2Re3fRUJnQ==", "dev": true, "requires": { - "@storybook/blocks": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-common": "7.0.2", - "@storybook/manager-api": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/blocks": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-common": "7.0.7", + "@storybook/manager-api": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" } }, "@storybook/addon-docs": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.0.2.tgz", - "integrity": "sha512-q3rDWoZEym6Lkmhqc/HBNfLDAmTY8l0WINGUZo/nF98eP5iu4B7Nk7V6BRGYGQt6Y6ZyIQ8WKH0e/eJww2zIog==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.0.7.tgz", + "integrity": "sha512-5PT7aiTD6QPH+4CZLcv4PiUgWucD9JNGHVMRbQMEyFW6qbs87dHmu1m1uXIvx3BF5h3mTo4FHNAf8IQIq5HH9w==", "dev": true, "requires": { "@babel/core": "^7.20.2", "@babel/plugin-transform-react-jsx": "^7.19.0", "@jest/transform": "^29.3.1", "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/csf-plugin": "7.0.2", - "@storybook/csf-tools": "7.0.2", + "@storybook/blocks": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/csf-plugin": "7.0.7", + "@storybook/csf-tools": "7.0.7", "@storybook/global": "^5.0.0", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.0.2", - "@storybook/postinstall": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/react-dom-shim": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/node-logger": "7.0.7", + "@storybook/postinstall": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/react-dom-shim": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "fs-extra": "^11.1.0", "remark-external-links": "^8.0.0", "remark-slug": "^6.0.0", @@ -20814,134 +20858,134 @@ } }, "@storybook/addon-essentials": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.0.2.tgz", - "integrity": "sha512-LAsWsXa/Pp2B4Ve2WVgc990FtsiHpFDRsq7S3V7xRrZP8DYRbtJIVdszPMDS5uKC+yzbswFEXz08lqbGvq8zgQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.0.7.tgz", + "integrity": "sha512-uNx0BvN1XP7cNnk/L4oiFQlEB/KABqOeIyI8/mhfIyTvvwo9uAYIQAyiwWuz9MFmofCNm7CgLNOUaEwNDkM4CA==", "dev": true, "requires": { - "@storybook/addon-actions": "7.0.2", - "@storybook/addon-backgrounds": "7.0.2", - "@storybook/addon-controls": "7.0.2", - "@storybook/addon-docs": "7.0.2", - "@storybook/addon-highlight": "7.0.2", - "@storybook/addon-measure": "7.0.2", - "@storybook/addon-outline": "7.0.2", - "@storybook/addon-toolbars": "7.0.2", - "@storybook/addon-viewport": "7.0.2", - "@storybook/core-common": "7.0.2", - "@storybook/manager-api": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/preview-api": "7.0.2", + "@storybook/addon-actions": "7.0.7", + "@storybook/addon-backgrounds": "7.0.7", + "@storybook/addon-controls": "7.0.7", + "@storybook/addon-docs": "7.0.7", + "@storybook/addon-highlight": "7.0.7", + "@storybook/addon-measure": "7.0.7", + "@storybook/addon-outline": "7.0.7", + "@storybook/addon-toolbars": "7.0.7", + "@storybook/addon-viewport": "7.0.7", + "@storybook/core-common": "7.0.7", + "@storybook/manager-api": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/preview-api": "7.0.7", "ts-dedent": "^2.0.0" } }, "@storybook/addon-highlight": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.0.2.tgz", - "integrity": "sha512-9BkL1OOanguuy73S6nLK0isUb045tOkFONd/PQldOJ0PV3agCvKxKHyzlBz7Hsba8KZhY5jQs+nVW2NiREyGYg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.0.7.tgz", + "integrity": "sha512-expme2GzzCXX7/lL7UjCDi1Tfj+4LeNsAdWiurVLH7glK7yKPPeXXkIldbLP/XjJv4NKlqCwnNRHQx0vDLlE6g==", "dev": true, "requires": { - "@storybook/core-events": "7.0.2", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.0.2" + "@storybook/preview-api": "7.0.7" } }, "@storybook/addon-links": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.0.2.tgz", - "integrity": "sha512-lPtfy2MqrcI9YjupBM2eRKGPdFKVPCz7WgO/JQQakGugORJTEGCyJrNJNtWY9jDenv8ynLZ40OxtPBZi54Sr6Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.0.7.tgz", + "integrity": "sha512-DEjDxjHb3mT8Sdnx4In5Ev9gJ/XdjlHOq4iuy0wnMyrCV4wnzTQnIeSCx8nkrXFb314zc33JPnCcrb5pQoD5GQ==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/router": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/router": "7.0.7", + "@storybook/types": "7.0.7", "prop-types": "^15.7.2", "ts-dedent": "^2.0.0" } }, "@storybook/addon-measure": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.0.2.tgz", - "integrity": "sha512-cf/d5MXpHAjyUiDIVfc8pLn79CPHgnryDmNNlSiP2zEFKcivrRWiu8Rmrad8pGqLkuAh+PXLKCGn9uiqDvg7QQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.0.7.tgz", + "integrity": "sha512-lb4wEIvIVF+ePx1sC+n9rDI0+49sRa6MWbcvZ+BhbAoCeGcX7uACQFdW6HyXolmBuZASsTnzVQ4KqzzvY1dSWw==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/types": "7.0.2" + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/types": "7.0.7" } }, "@storybook/addon-outline": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.0.2.tgz", - "integrity": "sha512-thVISO4NM22xlETisBvAPvz2yFD3qLGOjgzBmj8l8r9Rv0IEdwdPrwm5j0WTv8OtbhC4A8lPpvMsn5FhY5mDXg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.0.7.tgz", + "integrity": "sha512-AxbNZ4N1fXBTeMYM9tFudfW+Gzq7UikCjPxn5ax3Pde+zZjaEMppUxv5EMz4g5GIJupLYRmKH5pN0YcYoRLY6w==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/types": "7.0.7", "ts-dedent": "^2.0.0" } }, "@storybook/addon-toolbars": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.0.2.tgz", - "integrity": "sha512-tAxZ2+nUYsJdT1sx3BrmoMAZFM19+OzWJY6qSnbEq5zoRgvGZaXGR6tLMKydDoHQBU9Ta9YHGo7N7u7h1C23yg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.0.7.tgz", + "integrity": "sha512-/NkYHhU1VAz5lXjWuV8+ADWB84HzktvZv4jfiKX7Zzu6JVzrBu7FotQSWh3pDqqVwCB50RClUGtcHmSSac9CAQ==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2" + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7" } }, "@storybook/addon-viewport": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.0.2.tgz", - "integrity": "sha512-TaHJWIIazPM/TerRbka9RqjMPNpwaRsGRdVRBtVoVosy1FzsEjAdQSO7RBMe4G03m5CacSqdsDiJCblI2AXaew==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.0.7.tgz", + "integrity": "sha512-znqhd8JFEFoXcAdwYhz1CwrCpVAzhuSyUVBUNDsDs+mgBEfGth4D4abIdWWGcfP6+CmI5ebFHtk443cExZebag==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", "memoizerific": "^1.11.3", "prop-types": "^15.7.2" } }, "@storybook/blocks": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.0.2.tgz", - "integrity": "sha512-JzHmU8jZLzeQ6bunzci8j/2Ji18GBTyhrPFLk5RjEbMNGWpGjvER/yR127tZOdbPguVNr4iVbRfGzd1wGHlrzA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.0.7.tgz", + "integrity": "sha512-ehR0hAFWNHHqmrmbwYPKhLpgbIBKtyMbeoGClTRSnrVBGONciYJdmxegkCTReUklCY+HBJjtlwNowT+7+5sSaw==", "dev": true, "requires": { - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/components": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/components": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/csf": "^0.1.0", - "@storybook/docs-tools": "7.0.2", + "@storybook/docs-tools": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "@types/lodash": "^4.14.167", "color-convert": "^2.0.1", "dequal": "^2.0.2", @@ -20956,15 +21000,15 @@ } }, "@storybook/builder-manager": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.0.2.tgz", - "integrity": "sha512-Oej/n8D7eaWgmWF7nN2hXLRM53lcYOdh6umSN8Mh/LcYUfxB+dvUBFzUjoLE0xjhW6xRinrKrENT5LcP/f/HBQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.0.7.tgz", + "integrity": "sha512-VI/0iEjAlzQDt1yKu8GXugNIz7t46IHIKgMNmltQ05KPypMgInUoMmbfP5AYOVddjLdSqjMLO7EK58pBLOInpw==", "dev": true, "requires": { "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.0.2", - "@storybook/manager": "7.0.2", - "@storybook/node-logger": "7.0.2", + "@storybook/core-common": "7.0.7", + "@storybook/manager": "7.0.7", + "@storybook/node-logger": "7.0.7", "@types/ejs": "^3.1.1", "@types/find-cache-dir": "^3.2.1", "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", @@ -20980,21 +21024,21 @@ } }, "@storybook/builder-vite": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.0.2.tgz", - "integrity": "sha512-G6CD2Gf2zwzRslvNvqgz4FeADVEA9XA4Mw6+NM6Twc+Wy/Ah482dvHS9ApSgirtGyBKjOfdHn1xQT4Z+kzbJnw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-7.0.7.tgz", + "integrity": "sha512-2wL6fsFWzij+R155urOLc7EjZtlVWf4FLfaSlLGAuZwRQU40N04YdMaHMp9tjd9Vdr5fxEDwTB51PnVWJMlsEw==", "dev": true, "requires": { - "@storybook/channel-postmessage": "7.0.2", - "@storybook/channel-websocket": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/core-common": "7.0.2", - "@storybook/csf-plugin": "7.0.2", + "@storybook/channel-postmessage": "7.0.7", + "@storybook/channel-websocket": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/core-common": "7.0.7", + "@storybook/csf-plugin": "7.0.7", "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.0.2", - "@storybook/preview": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/node-logger": "7.0.7", + "@storybook/preview": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/types": "7.0.7", "browser-assert": "^1.2.1", "es-module-lexer": "^0.9.3", "express": "^4.17.3", @@ -21008,53 +21052,53 @@ } }, "@storybook/channel-postmessage": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.2.tgz", - "integrity": "sha512-SZ/KqnZcx10W9hJbrzBKcP9dmgaeTaXugUhcgw1IkmjKWdsKazqFZCPwQWZZKAmhO4wYbyYOhkz3wfSIeB4mFw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-7.0.7.tgz", + "integrity": "sha512-XMtYfcaE0UoY/V7K1cTu9PcWETD4iyWb/Yswc4F9VrPw0Ui4UwGS1j4iaAu8DC06yyoJs4XvxYFBMlCQmKja6A==", "dev": true, "requires": { - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/global": "^5.0.0", "qs": "^6.10.0", "telejson": "^7.0.3" } }, "@storybook/channel-websocket": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-7.0.2.tgz", - "integrity": "sha512-YU3lFId6Nsi75ddA+3qfbnLfNUPswboYyx+SALhaLuXqz7zqfzX4ezMgxeS/h0gRlUJ7nf2/yJ5qie/kZaizjw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/channel-websocket/-/channel-websocket-7.0.7.tgz", + "integrity": "sha512-KDbLiQts4/dCow3qk5WJSPA6SlaX3iP9RhF0Fjj03hoG2TRskrvo+AkUiJr8gF6dpkPndfuCYUCRsO2Ml8B+AA==", "dev": true, "requires": { - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", "@storybook/global": "^5.0.0", "telejson": "^7.0.3" } }, "@storybook/channels": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.2.tgz", - "integrity": "sha512-qkI8mFy9c8mxN2f01etayKhCaauL6RAsxRzbX1/pKj6UqhHWqqUbtHwymrv4hG5qDYjV1e9pd7ae5eNF8Kui0g==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.0.7.tgz", + "integrity": "sha512-Om4ovBLNw8pVrBu83MpOKgAuGO9Dpr1Coh2qp8t64WRPkejX1mxOY9IgH723//zH3igx8LCkf9rvBvcrsyaScQ==", "dev": true }, "@storybook/cli": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.0.2.tgz", - "integrity": "sha512-xMM2QdXNGg09wuXzAGroKrbsnaHSFPmtmefX1XGALhHuKVwxOoC2apWMpek6gY/9vh5EIRTog2Dvfd2BzNrT6Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.0.7.tgz", + "integrity": "sha512-koTkWr7wlaHF14T5moRP/tYM44+Jf4GEzQ/rqx/Jfn7EbNlVUOibdLJj4JnseMGRc7ZP6tKYku2n+B8g7hJX4w==", "dev": true, "requires": { "@babel/core": "^7.20.2", "@babel/preset-env": "^7.20.2", "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.0.2", - "@storybook/core-common": "7.0.2", - "@storybook/core-server": "7.0.2", - "@storybook/csf-tools": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/telemetry": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/codemod": "7.0.7", + "@storybook/core-common": "7.0.7", + "@storybook/core-server": "7.0.7", + "@storybook/csf-tools": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/telemetry": "7.0.7", + "@storybook/types": "7.0.7", "@types/semver": "^7.3.4", "boxen": "^5.1.2", "chalk": "^4.1.0", @@ -21139,6 +21183,20 @@ } } }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -21195,17 +21253,6 @@ "proxy-from-env": "^1.0.0", "rimraf": "^2.6.1", "ws": "^6.1.0" - }, - "dependencies": { - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - } } }, "rimraf": { @@ -21215,28 +21262,12 @@ "dev": true, "requires": { "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21251,6 +21282,15 @@ "has-flag": "^4.0.0" } }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -21260,27 +21300,27 @@ } }, "@storybook/client-logger": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.2.tgz", - "integrity": "sha512-rv7W2BhzIQHbFpUM5/CP/acS6T5lTmaxT0MbZ9n+9h++9QQU/cFOdkZgSUbLVAb1AeUGoLsk0HYzcqPpV35Xsw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.0.7.tgz", + "integrity": "sha512-EclHjDs5HwHMKB4X2orn/KKA0DTIDmp4AXAUJGRfxb5ArpKEb7tXLHsgrRBlaoz1j5LAwKTmEyZOONh9G3etjg==", "dev": true, "requires": { "@storybook/global": "^5.0.0" } }, "@storybook/codemod": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.0.2.tgz", - "integrity": "sha512-D9PdByxJlFiaDJcLkM+RN1DHCj4VfQIlSZkADOcNtI4o9H064oiMloWDGZiR1i1FCYMSXuWmW6tMsuCVebA+Nw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.0.7.tgz", + "integrity": "sha512-VlkDlkvfbzLe+NOmzs5zGrGb4jnaeAFZqpvIkXxevr6aGcOwgeelNv8gTmgBAcy+xbGW4Pp0XA2BlMweIvKEKA==", "dev": true, "requires": { "@babel/core": "~7.21.0", "@babel/preset-env": "~7.21.0", "@babel/types": "~7.21.2", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/csf-tools": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/types": "7.0.7", "cross-spawn": "^7.0.3", "globby": "^11.0.2", "jscodeshift": "^0.14.0", @@ -21290,39 +21330,39 @@ } }, "@storybook/components": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.0.2.tgz", - "integrity": "sha512-Ee9pY6WlpricPUdYiyR0Ov8zgHkUt541yl1CZ6Ytaom2TA12cAnRjKewbLAgVPPhIE1LsMRhOPFYql0JMtnN4Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.0.7.tgz", + "integrity": "sha512-6PLs9LMkBuhH/w4bSJ72tYgICMbOOIHuoB/fQdVlzhsdnXL2fM/v4RVW2N7v+Oz3lYXp/JtV8V9Ub8h6eDQKXg==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", + "@storybook/client-logger": "7.0.7", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "memoizerific": "^1.11.3", "use-resize-observer": "^9.1.0", "util-deprecate": "^1.0.2" } }, "@storybook/core-client": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.2.tgz", - "integrity": "sha512-tr6Uv41YD2O0xiUrtgujiY1QxuznhbyUI0BRsSh49e8cx3QoW7FgPy7IVZHgb17DXKZ/wY/hgdyTTB87H6IbLA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.0.7.tgz", + "integrity": "sha512-eydcpR28qV3A3BwR5V6wsixoI1BRLA0SzFiwH/1ajrgX13inv+gV97gHv47Ojf/+YAZ3HqdVaUKFsUfMKwKieA==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", - "@storybook/preview-api": "7.0.2" + "@storybook/client-logger": "7.0.7", + "@storybook/preview-api": "7.0.7" } }, "@storybook/core-common": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.2.tgz", - "integrity": "sha512-DayFPTCj695tnEKLuDlogclBim8mzdrbj9U1xzFm23BUReheGSGdLl2zrb3mP1l9Zj4xJ/Ctst1KN9SFbW84vw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.0.7.tgz", + "integrity": "sha512-c8T24wex9bnCYdZVZFNX4VV+wfhrp47OLzVONZDqxMhq6G//Bgv5zH4Awcx5UfWf/05VcP7KGF1VKj8ebRyEEA==", "dev": true, "requires": { - "@storybook/node-logger": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/node-logger": "7.0.7", + "@storybook/types": "7.0.7", "@types/node": "^16.0.0", "@types/pretty-hrtime": "^1.0.0", "chalk": "^4.1.0", @@ -21343,9 +21383,9 @@ }, "dependencies": { "@types/node": { - "version": "16.18.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", - "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", + "version": "16.18.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.24.tgz", + "integrity": "sha512-zvSN2Esek1aeLdKDYuntKAYjti9Z2oT4I8bfkLLhIxHlv3dwZ5vvATxOc31820iYm4hQRCwjUgDpwSMFjfTUnw==", "dev": true }, "ansi-styles": { @@ -21385,31 +21425,31 @@ } }, "@storybook/core-events": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.2.tgz", - "integrity": "sha512-1DCHCwHRL3+rlvnVVc/BCfReP31XaT2WYgcLeGTmkX1E43Po1MkgcM7PnJPSaa9POvSqZ+6YLZv5Bs1SXbufow==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.0.7.tgz", + "integrity": "sha512-XNsR2RgaL2vBwuqsu+KA1DzGmB1UFfrAhpxhmyWTKDCniwtTLlaXgfKbqwcrOrPu/o1YswgIup/9UHepRHaf4A==", "dev": true }, "@storybook/core-server": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.0.2.tgz", - "integrity": "sha512-7ipGws8YffVaiwkc+D0+MfZc/Sy52aKenG3nDJdK4Ajmp5LPAlelb/sxIhfRvoHDbDsy2FQNz++Mb55Yh03KkA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.0.7.tgz", + "integrity": "sha512-PB4zoClH7aKG4XeJhxx43iK9n/C9gctXubNN5DSN6thPm4UITOas+/q4N7AHbCPyRbcMyoW7M31KtpzZu4Fjew==", "dev": true, "requires": { "@aw-web-design/x-default-browser": "1.4.88", "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.0.2", - "@storybook/core-common": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/builder-manager": "7.0.7", + "@storybook/core-common": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/csf": "^0.1.0", - "@storybook/csf-tools": "7.0.2", + "@storybook/csf-tools": "7.0.7", "@storybook/docs-mdx": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/manager": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/telemetry": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/telemetry": "7.0.7", + "@storybook/types": "7.0.7", "@types/detect-port": "^1.3.0", "@types/node": "^16.0.0", "@types/node-fetch": "^2.5.7", @@ -21441,9 +21481,9 @@ }, "dependencies": { "@types/node": { - "version": "16.18.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.23.tgz", - "integrity": "sha512-XAMpaw1s1+6zM+jn2tmw8MyaRDIJfXxqmIQIS0HfoGYPuf7dUWeiUKopwq13KFX9lEp1+THGtlaaYx39Nxr58g==", + "version": "16.18.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.24.tgz", + "integrity": "sha512-zvSN2Esek1aeLdKDYuntKAYjti9Z2oT4I8bfkLLhIxHlv3dwZ5vvATxOc31820iYm4hQRCwjUgDpwSMFjfTUnw==", "dev": true }, "ansi-styles": { @@ -21481,9 +21521,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21516,19 +21556,19 @@ } }, "@storybook/csf-plugin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.0.2.tgz", - "integrity": "sha512-aGuo+G6G5IwSGkmc+OUA796sOfvJMaQj8QS/Zh5F0nL4ZlQvghHpXON8cRHHvmXHQqUo07KLiy7CZh2I2oq4iQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.0.7.tgz", + "integrity": "sha512-uhf2g077gXA6ZEMXIPQ0RnX+IoOTBJbj+6+VQfT7K5tvJeop1z0Fvk0FoknNXcUe7aUA0nzA/cUQ1v4vXqbY3Q==", "dev": true, "requires": { - "@storybook/csf-tools": "7.0.2", + "@storybook/csf-tools": "7.0.7", "unplugin": "^0.10.2" } }, "@storybook/csf-tools": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.0.2.tgz", - "integrity": "sha512-sOp355yQSpYiMqNSopmFYWZkPPRJdGgy4tpxGGLxpOZMygK3j1wQ/WQtl2Z0h61KP0S0dl6hrs0pHQz3A/eVrw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.0.7.tgz", + "integrity": "sha512-KbO5K2RS0oFm94eR49bAPvoyXY3Q6+ozvBek/F05RP7iAV790icQc59Xci9YDM1ONgb3afS+gSJGFBsE0h4pmg==", "dev": true, "requires": { "@babel/generator": "~7.21.1", @@ -21536,7 +21576,7 @@ "@babel/traverse": "~7.21.2", "@babel/types": "~7.21.2", "@storybook/csf": "^0.1.0", - "@storybook/types": "7.0.2", + "@storybook/types": "7.0.7", "fs-extra": "^11.1.0", "recast": "^0.23.1", "ts-dedent": "^2.0.0" @@ -21549,15 +21589,15 @@ "dev": true }, "@storybook/docs-tools": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.2.tgz", - "integrity": "sha512-w4D5BURrYjLbLGG9VKAaKU2dSdukszxRE3HWkJyhQU9R1JHvS3n8ntcMqYPqRfoHCOeBLBxP0edDYcAfzGNDYQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.0.7.tgz", + "integrity": "sha512-VB4Qa33DYNxXALWcXyDid246r9Q6SGM+Q+pGWOuEJsxRxDmrUspXHaHG0CO1NIjMWfbqpOoz61vquZO0GZoAAg==", "dev": true, "requires": { "@babel/core": "^7.12.10", - "@storybook/core-common": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/core-common": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/types": "7.0.7", "@types/doctrine": "^0.0.3", "doctrine": "^3.0.0", "lodash": "^4.17.21" @@ -21570,25 +21610,25 @@ "dev": true }, "@storybook/manager": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.0.2.tgz", - "integrity": "sha512-jsFsFKG0rPNYfuRm/WSXGMBy8vnALyFWU330ObDmfU0JID3SeLlVqAOZT1GlwI6vupYpWodsN6qPZKRmC8onRw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.0.7.tgz", + "integrity": "sha512-FhquwUpUOHsjZROf6E6kzUnJ6EmMeJ9b+HYg6yYPyIMYVMjAhnkRKbIj0phGx2lhgKFlmxik+3pgchK5SLdcZA==", "dev": true }, "@storybook/manager-api": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.2.tgz", - "integrity": "sha512-PbLj9Rc5uCMPfMdaXv1wE3koA3+d0rmZ3BJI8jeq+mfZEvpvfI4OOpRioT1q04CkkVomFOVFTyO0Q/o6Rb5N7g==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.0.7.tgz", + "integrity": "sha512-QTd/P72peAhofKqK+8yzIO9iWAEfPn8WUGGveV2KGaTlSlgbr87RLHEKilcXMZcYhBWC9izFRmjKum9ROdskrQ==", "dev": true, "requires": { - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/router": "7.0.2", - "@storybook/theming": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/router": "7.0.7", + "@storybook/theming": "7.0.7", + "@storybook/types": "7.0.7", "dequal": "^2.0.2", "lodash": "^4.17.21", "memoizerific": "^1.11.3", @@ -21608,9 +21648,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21631,9 +21671,9 @@ "dev": true }, "@storybook/node-logger": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.2.tgz", - "integrity": "sha512-UENpXxB1yDqP7JXaODJo+pbGt5y3NFBNurBr4+pI4bMAC4ARjpgRE4wp6fxUKFPu9MAR10oCdcLEHkaVUAjYRg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.0.7.tgz", + "integrity": "sha512-5Y4LLgKeCStq1ktCKZ5eNPzQQSQ+CYZAlkEdzQ3Pp//0KXaZvVxEvGtaYhAymP2HatLpI8Oneo4lHrJioRfgww==", "dev": true, "requires": { "@types/npmlog": "^4.1.2", @@ -21679,30 +21719,30 @@ } }, "@storybook/postinstall": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.0.2.tgz", - "integrity": "sha512-Hhiu3+N3ZDcbrhOCBJTDJbn/mC4l0v3ziyAP3yalq/2ZR9R5kfsEHHakKmswsKKV+ey0gNGijFTy3soU5oSs+A==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.0.7.tgz", + "integrity": "sha512-APcZ2KaR7z1aJje3pID4Ywmt1/aVcP3Sc4ltzNdH9mCkEsuq0fZHHQrYSa9Ya1IPRmSeLZ5/23q1iyqmGU3zoQ==", "dev": true }, "@storybook/preview": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.0.2.tgz", - "integrity": "sha512-U7MZkDT9bBq7HggLAXmTO9gI4eqhYs26fZS0L6iTE/PCX4Wg2TJBJSq2X8jhDXRqJFOt8SrQ756+V5Vtwrh4Og==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.0.7.tgz", + "integrity": "sha512-uL3ZcFao6UvxiSxCIcXKFakxEr9Nn0lvu0zzC2yQCVepzA7a+GDr1cK5VbZ6Mez38CnOvBmb5pkCbgRqSf/oug==", "dev": true }, "@storybook/preview-api": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.2.tgz", - "integrity": "sha512-QAlJM/r92+dQe/kB7MTTR9b/1mt9UJjxNjazGdEWipA/nw23kOF3o/hBcvKwBYkit4zGYsX70H+vuzW8hCo/lA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.0.7.tgz", + "integrity": "sha512-R5pmGTodpu6hbwEg2RM2ulWtW3d426YzsisHrZJ+FT9lecWauN1y9xHCz7HdNzEFhT8r4YOa24L9ZS3mosZ7hA==", "dev": true, "requires": { - "@storybook/channel-postmessage": "7.0.2", - "@storybook/channels": "7.0.2", - "@storybook/client-logger": "7.0.2", - "@storybook/core-events": "7.0.2", + "@storybook/channel-postmessage": "7.0.7", + "@storybook/channels": "7.0.7", + "@storybook/client-logger": "7.0.7", + "@storybook/core-events": "7.0.7", "@storybook/csf": "^0.1.0", "@storybook/global": "^5.0.0", - "@storybook/types": "7.0.2", + "@storybook/types": "7.0.7", "@types/qs": "^6.9.5", "dequal": "^2.0.2", "lodash": "^4.17.21", @@ -21714,30 +21754,30 @@ } }, "@storybook/react-dom-shim": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.2.tgz", - "integrity": "sha512-fMl0aV7mJ3wyQKvt6z+rZuiIiSd9YinS77IJ1ETHqVZ4SxWriOS0GFKP6sZflrlpShoZBh+zl1lDPG7ZZdrQGw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.0.7.tgz", + "integrity": "sha512-INGwFeu9M+RzpvktSKuwy8Rk/70mXGqxxsb9lPtq7phmETvfpNX7GnLJqiVazTaQiB1DkB0iAPUsK2MNbBu+Kw==", "dev": true }, "@storybook/router": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.0.2.tgz", - "integrity": "sha512-ZB2vucfayZUrMLBlXju4v6CNOQQb0YKDLw5RoojdBxOsUFtnp5UiPOE+I8PQR63EBwnRjozeibV1XSM+GlQb5w==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.0.7.tgz", + "integrity": "sha512-/lM8/NHQKeshfnC3ayFuO8Y9TCSHnCAPRhIsVxvanBzcj+ILbCIyZ+TspvB3hT4MbX/Ez+JR8VrMbjXIGwmH8w==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", + "@storybook/client-logger": "7.0.7", "memoizerific": "^1.11.3", "qs": "^6.10.0" } }, "@storybook/telemetry": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.0.2.tgz", - "integrity": "sha512-s2PIwI9nVYQBf3h40EFHLynYUfdqzRJMXyaCWJdVQuvdQfRkAn3CLXaubK+VdjC869z3ZfW20EMu3Mbgzcc0HA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.0.7.tgz", + "integrity": "sha512-Ka6pwWr3sWs3A/6WQ0wsoSYzXx3Mhr7eByNZZKuuCu9jnw3I8AbIOqQX2iOVzaQBLZsvXEeqvYY8iZ+GuRbbGQ==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", - "@storybook/core-common": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/core-common": "7.0.7", "chalk": "^4.1.0", "detect-package-manager": "^2.0.1", "fetch-retry": "^5.0.2", @@ -21784,55 +21824,55 @@ } }, "@storybook/theming": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.2.tgz", - "integrity": "sha512-c9sE+QAZNbopPvLiJ6BMxBERfTaq1ATyIri97FBvTucuSotNXw7X5q+ip5/nrCOPZuvK2f5wF4DRyD2HnB/rIQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.0.7.tgz", + "integrity": "sha512-InTZe+Sgco1NsxgiG+cyUKWQe3GsjlIyU/o5qDdtOTXcZ64HzyBuAZlAequSddqfDeMDqxRFPc2w1J28MAUHxA==", "dev": true, "requires": { "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.0.2", + "@storybook/client-logger": "7.0.7", "@storybook/global": "^5.0.0", "memoizerific": "^1.11.3" } }, "@storybook/types": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.2.tgz", - "integrity": "sha512-0OCt/kAexa8MCcljxA+yZxGMn0n2U2Ync0KxotItqNbKBKVkaLQUls0+IXTWSCpC/QJvNZ049jxUHHanNi/96w==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.0.7.tgz", + "integrity": "sha512-v9piuwp8FvTiHXIOOi5lEyTEJKhnbcbhVxgJ3VFhhXYFd0DTz6Bst0XIIgkgs21ITb3xhkfPbCRUueMcbXO1MA==", "dev": true, "requires": { - "@storybook/channels": "7.0.2", + "@storybook/channels": "7.0.7", "@types/babel__core": "^7.0.0", "@types/express": "^4.7.0", "file-system-cache": "^2.0.0" } }, "@storybook/web-components": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.0.2.tgz", - "integrity": "sha512-qJc5EsNZci0yBOCH9YKuUoSEHvvfetFUsUWpLQa2pzHa648z0Qb8Z1OS/hYCq7PyJN/knb+00Pd8z3zNSw9SgA==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.0.7.tgz", + "integrity": "sha512-bcBX1V6pleZ6ahAT01d1k7eiifIB/BlHqmi2BpQRWsPUVRpitUudKCmHN5YDga8o+/YoIumh+oBqtpedn+vADA==", "dev": true, "requires": { - "@storybook/client-logger": "7.0.2", - "@storybook/core-client": "7.0.2", - "@storybook/docs-tools": "7.0.2", + "@storybook/client-logger": "7.0.7", + "@storybook/core-client": "7.0.7", + "@storybook/docs-tools": "7.0.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.0.2", - "@storybook/preview-api": "7.0.2", - "@storybook/types": "7.0.2", + "@storybook/manager-api": "7.0.7", + "@storybook/preview-api": "7.0.7", + "@storybook/types": "7.0.7", "ts-dedent": "^2.0.0" } }, "@storybook/web-components-vite": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.0.2.tgz", - "integrity": "sha512-9c6wt+4yvOGN3d2FV3dBbtAeswjuIOS5InCQiMHLZEywjghg3SMre5yatKnO88eEk4XBJkamc6rHzSbETrc3sg==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-7.0.7.tgz", + "integrity": "sha512-+49+cjf62c1YfZgPWyTO11l+UGs6+GR15zROTBNhuTPg5Guwa6nfi4k/0Ir/IMYXWs4V9HiU4ca4rNeMeMlPHw==", "dev": true, "requires": { - "@storybook/builder-vite": "7.0.2", - "@storybook/core-server": "7.0.2", - "@storybook/node-logger": "7.0.2", - "@storybook/web-components": "7.0.2", + "@storybook/builder-vite": "7.0.7", + "@storybook/core-server": "7.0.7", + "@storybook/node-logger": "7.0.7", + "@storybook/web-components": "7.0.7", "magic-string": "^0.27.0" } }, @@ -21916,6 +21956,11 @@ "@babel/types": "^7.3.0" } }, + "@types/base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ZmI0sZGAUNXUfMWboWwi4LcfpoVUYldyN6Oe0oJ5cCsHDU/LlRq8nQKPXhYLOx36QYSW9bNIb1vvRrD6K7Llgw==" + }, "@types/body-parser": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", @@ -21933,9 +21978,9 @@ "dev": true }, "@types/chai-dom": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-0.0.12.tgz", - "integrity": "sha512-4rE7sDw713cV61TYzQbMrPjC4DjNk3x4vk9nAVRNXcSD4p0/5lEEfm0OgoCz5eNuWUXNKA0YiKiH/JDTuKivkA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-1.11.0.tgz", + "integrity": "sha512-Aja99Mmnny+Sz+T2hBK3oEsrcy18yabplT0pGX/QwIke9jMJHdvHlV2f4Tmq5SqxTMYwt1Zjbisv/4r83EUIHw==", "dev": true, "requires": { "@types/chai": "*" @@ -21973,9 +22018,9 @@ "dev": true }, "@types/convert-source-map": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-1.5.2.tgz", - "integrity": "sha512-tHs++ZeXer40kCF2JpE51Hg7t4HPa18B1b1Dzy96S0eCw8QKECNMYMfwa1edK/x8yCN0r4e6ewvLcc5CsVGkdg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-QUm4YOC/ENo0VjPVl2o8HGyTbHHQGDOw8PCg3rXBucYHKyZN/XjXRbPFAV1tB2FvM0/wyFoDct4cTIctzKrQFg==", "dev": true }, "@types/cookie": { @@ -22030,9 +22075,9 @@ "dev": true }, "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "@types/express": { @@ -22135,6 +22180,14 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jquery": { + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", + "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", + "requires": { + "@types/sizzle": "*" + } + }, "@types/js-levenshtein": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz", @@ -22160,9 +22213,9 @@ "dev": true }, "@types/koa": { - "version": "2.13.5", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.5.tgz", - "integrity": "sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA==", + "version": "2.13.6", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.6.tgz", + "integrity": "sha512-diYUfp/GqfWBAiwxHtYJ/FQYIXhlEhlyaU7lB/bWQrx4Il9lCET5UwpFy3StOAohfsxxvEQ11qIJgT1j2tfBvw==", "dev": true, "requires": { "@types/accepts": "*", @@ -22195,24 +22248,24 @@ } }, "@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", "dev": true }, "@types/lodash-es": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz", - "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==", + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.7.tgz", + "integrity": "sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==", "dev": true, "requires": { "@types/lodash": "*" } }, "@types/mdx": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.3.tgz", - "integrity": "sha512-IgHxcT3RC8LzFLhKwP3gbMPeaK7BM9eBH46OdapPA7yvuIUJ8H6zHZV53J8hGZcTSnt95jANt+rTBNUUc22ACQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.4.tgz", + "integrity": "sha512-qCYrNdpKwN6YO6FVnx+ulfqifKlE3lQGsNhvDaW9Oxzyob/cRLBJWow8GHBBD4NxQ7BVvtsATgLsX0vZAWmtrg==", "dev": true }, "@types/mime": { @@ -22246,19 +22299,32 @@ "dev": true }, "@types/node": { - "version": "18.14.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.4.tgz", - "integrity": "sha512-VhCw7I7qO2X49+jaKcAUwi3rR+hbxT5VcYF493+Z5kMLI0DL568b7JI4IDJaxWFH0D/xwmGJNoXisyX+w7GH/g==", + "version": "18.16.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", + "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==", "dev": true }, "@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.3.tgz", + "integrity": "sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==", "dev": true, "requires": { "@types/node": "*", "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "@types/normalize-package-data": { @@ -22304,9 +22370,9 @@ "dev": true }, "@types/react": { - "version": "18.0.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", - "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "version": "18.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.38.tgz", + "integrity": "sha512-ExsidLLSzYj4cvaQjGnQCk4HFfVT9+EZ9XZsQ8Hsrcn8QNgXtpZ3m9vSIC2MWtx7jHictK6wYhQgGh6ic58oOw==", "dev": true, "requires": { "@types/prop-types": "*", @@ -22321,9 +22387,9 @@ "dev": true }, "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", "dev": true }, "@types/semver": { @@ -22352,9 +22418,9 @@ } }, "@types/sinon": { - "version": "10.0.13", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", - "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==", + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.14.tgz", + "integrity": "sha512-mn72up6cjaMyMuaPaa/AwKf6WtsSRysQC7wxFkCm1XcOKXPM1z+5Y4H5wjIVBz4gdAkjvZxVVfjA6ba1nHr5WQ==", "dev": true, "requires": { "@types/sinonjs__fake-timers": "*" @@ -22376,6 +22442,11 @@ "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", "dev": true }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" + }, "@types/through": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", @@ -22437,19 +22508,19 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.54.0.tgz", - "integrity": "sha512-+hSN9BdSr629RF02d7mMtXhAJvDTyCbprNYJKrXETlul/Aml6YZwd90XioVbjejQeHbb3R8Dg0CkRgoJDxo8aw==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", + "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/type-utils": "5.54.0", - "@typescript-eslint/utils": "5.54.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/type-utils": "5.59.1", + "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -22464,9 +22535,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22481,120 +22552,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.0.tgz", - "integrity": "sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", + "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.57.0", - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/typescript-estree": "5.57.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", "debug": "^4.3.4" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz", - "integrity": "sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0" - } - }, - "@typescript-eslint/types": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.0.tgz", - "integrity": "sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz", - "integrity": "sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.0", - "@typescript-eslint/visitor-keys": "5.57.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.57.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz", - "integrity": "sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } } }, "@typescript-eslint/scope-manager": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.54.0.tgz", - "integrity": "sha512-VTPYNZ7vaWtYna9M4oD42zENOBrb+ZYyCNdFs949GcN8Miwn37b8b7eMj+EZaq7VK9fx0Jd+JhmkhjFhvnovhg==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", + "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/visitor-keys": "5.54.0" + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1" } }, "@typescript-eslint/type-utils": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.54.0.tgz", - "integrity": "sha512-WI+WMJ8+oS+LyflqsD4nlXMsVdzTMYTxl16myXPaCXnSgc7LWwMsjxQFZCK/rVmTZ3FN71Ct78ehO9bRC7erYQ==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", + "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.54.0", - "@typescript-eslint/utils": "5.54.0", + "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/utils": "5.59.1", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.54.0.tgz", - "integrity": "sha512-nExy+fDCBEgqblasfeE3aQ3NuafBUxZxgxXcYfzYRZFHdVvk5q60KhCSkG0noHgHRo/xQ/BOzURLZAafFpTkmQ==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", + "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.54.0.tgz", - "integrity": "sha512-X2rJG97Wj/VRo5YxJ8Qx26Zqf0RRKsVHd4sav8NElhbZzhpBI8jU54i6hfo9eheumj4oO4dcRN1B/zIVEqR/MQ==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", + "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/visitor-keys": "5.54.0", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -22612,9 +22616,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22629,18 +22633,18 @@ } }, "@typescript-eslint/utils": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.54.0.tgz", - "integrity": "sha512-cuwm8D/Z/7AuyAeJ+T0r4WZmlnlxQ8wt7C7fLpFlKMR+dY6QO79Cq1WpJhvZbMA4ZeZGHiRWnht7ZJ8qkdAunw==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", + "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.54.0", - "@typescript-eslint/types": "5.54.0", - "@typescript-eslint/typescript-estree": "5.54.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "dependencies": { @@ -22654,9 +22658,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -22671,12 +22675,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.54.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.54.0.tgz", - "integrity": "sha512-xu4wT7aRCakGINTLGeyGqDn+78BwFlggwBjnHa1ar/KaGagnmwLYmlrXIrgAaQ3AE1Vd6nLfKASm7LrFHNbKGA==", + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", + "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.54.0", + "@typescript-eslint/types": "5.59.1", "eslint-visitor-keys": "^3.3.0" } }, @@ -23458,9 +23462,9 @@ } }, "@web/browser-logs": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.5.tgz", - "integrity": "sha512-Qxo1wY/L7yILQqg0jjAaueh+tzdORXnZtxQgWH23SsTCunz9iq9FvsZa8Q5XlpjnZ3vLIsFEuEsCMqFeohJnEg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.6.tgz", + "integrity": "sha512-CNjNVhd4FplRY8PPWIAt02vAowJAVcOoTNrR/NNb/o9pka7yI9qdjpWrWhEbPr2pOXonWb52AeAgdK66B8ZH7w==", "dev": true, "requires": { "errorstacks": "^2.2.0" @@ -23485,9 +23489,9 @@ } }, "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -23502,19 +23506,19 @@ } }, "@web/dev-server": { - "version": "0.1.35", - "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.35.tgz", - "integrity": "sha512-E7TSTSFdGPzhkiE3kIVt8i49gsiAYpJIZHzs1vJmVfdt8U4rsmhE+5roezxZo0hkEw4mNsqj9zCc4Dzqy/IFHg==", + "version": "0.1.38", + "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.38.tgz", + "integrity": "sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==", "dev": true, "requires": { "@babel/code-frame": "^7.12.11", "@types/command-line-args": "^5.0.0", "@web/config-loader": "^0.1.3", - "@web/dev-server-core": "^0.3.19", - "@web/dev-server-rollup": "^0.3.19", + "@web/dev-server-core": "^0.4.1", + "@web/dev-server-rollup": "^0.4.1", "camelcase": "^6.2.0", "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.1", + "command-line-usage": "^7.0.1", "debounce": "^1.2.0", "deepmerge": "^4.2.2", "ip": "^1.1.5", @@ -23523,29 +23527,98 @@ "portfinder": "^1.0.32" }, "dependencies": { + "@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@web/dev-server-rollup": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.4.1.tgz", + "integrity": "sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==", + "dev": true, + "requires": { + "@rollup/plugin-node-resolve": "^13.0.4", + "@web/dev-server-core": "^0.4.1", + "nanocolors": "^0.2.1", + "parse5": "^6.0.1", + "rollup": "^2.67.0", + "whatwg-url": "^11.0.0" + } + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, "ip": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", "dev": true + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } } } }, "@web/dev-server-core": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.19.tgz", - "integrity": "sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.4.1.tgz", + "integrity": "sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==", "dev": true, "requires": { "@types/koa": "^2.11.6", "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.2.0", + "@web/parse5-utils": "^1.3.1", "chokidar": "^3.4.3", "clone": "^2.1.2", "es-module-lexer": "^1.0.0", "get-stream": "^6.0.0", "is-stream": "^2.0.0", - "isbinaryfile": "^4.0.6", + "isbinaryfile": "^5.0.0", "koa": "^2.13.0", "koa-etag": "^4.0.0", "koa-send": "^5.0.1", @@ -23558,9 +23631,9 @@ }, "dependencies": { "es-module-lexer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.0.tgz", - "integrity": "sha512-2BMfqBDeVCcOlLaL1ZAfp+D868SczNpKArrTM3dhpd7dK/OVlogzY15qpUngt+LMTq5UC/csb9vVQAgupucSbA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", "dev": true }, "lru-cache": { @@ -23587,54 +23660,16 @@ } }, "@web/dev-server-esbuild": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-0.3.3.tgz", - "integrity": "sha512-hB9C8X9NsFWUG2XKT3W+Xcw3IZ/VObf4LNbK14BTjApnNyZfV6hVhSlJfvhgOoJ4DxsImfhIB5+gMRKOG9NmBw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-0.3.6.tgz", + "integrity": "sha512-VDcZOzvmbg/z/8Q54hHqFwt9U4cacQJZxgS8YXAvyFuG85HAJ/Q55P7Tr++1NlRS8wQEos6QK2ERUWNjEVOhqQ==", "dev": true, "requires": { "@mdn/browser-compat-data": "^4.0.0", - "@web/dev-server-core": "^0.3.19", - "esbuild": "^0.12 || ^0.13 || ^0.14", + "@web/dev-server-core": "^0.4.1", + "esbuild": "^0.16 || ^0.17", "parse5": "^6.0.1", - "ua-parser-js": "^1.0.2" - }, - "dependencies": { - "@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "requires": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - } + "ua-parser-js": "^1.0.33" } }, "@web/dev-server-import-maps": { @@ -23649,6 +23684,67 @@ "@web/parse5-utils": "^1.3.0", "parse5": "^6.0.1", "picomatch": "^2.2.2" + }, + "dependencies": { + "@web/dev-server-core": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.19.tgz", + "integrity": "sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA==", + "dev": true, + "requires": { + "@types/koa": "^2.11.6", + "@types/ws": "^7.4.0", + "@web/parse5-utils": "^1.2.0", + "chokidar": "^3.4.3", + "clone": "^2.1.2", + "es-module-lexer": "^1.0.0", + "get-stream": "^6.0.0", + "is-stream": "^2.0.0", + "isbinaryfile": "^4.0.6", + "koa": "^2.13.0", + "koa-etag": "^4.0.0", + "koa-send": "^5.0.1", + "koa-static": "^5.0.0", + "lru-cache": "^6.0.0", + "mime-types": "^2.1.27", + "parse5": "^6.0.1", + "picomatch": "^2.2.2", + "ws": "^7.4.2" + } + }, + "es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "@web/dev-server-rollup": { @@ -23705,12 +23801,59 @@ "@types/node": "*" } }, + "@web/dev-server-core": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.19.tgz", + "integrity": "sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA==", + "dev": true, + "requires": { + "@types/koa": "^2.11.6", + "@types/ws": "^7.4.0", + "@web/parse5-utils": "^1.2.0", + "chokidar": "^3.4.3", + "clone": "^2.1.2", + "es-module-lexer": "^1.0.0", + "get-stream": "^6.0.0", + "is-stream": "^2.0.0", + "isbinaryfile": "^4.0.6", + "koa": "^2.13.0", + "koa-etag": "^4.0.0", + "koa-send": "^5.0.1", + "koa-static": "^5.0.0", + "lru-cache": "^6.0.0", + "mime-types": "^2.1.27", + "parse5": "^6.0.1", + "picomatch": "^2.2.2", + "ws": "^7.4.2" + } + }, + "es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true + }, "estree-walker": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "rollup": { "version": "2.79.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", @@ -23719,13 +23862,25 @@ "requires": { "fsevents": "~2.3.2" } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "@web/parse5-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.0.tgz", - "integrity": "sha512-Pgkx3ECc8EgXSlS5EyrgzSOoUbM6P8OKS471HLAyvOBcP1NCBn0to4RN/OaKASGq8qa3j+lPX9H14uA5AHEnQg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.1.tgz", + "integrity": "sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==", "dev": true, "requires": { "@types/parse5": "^6.0.1", @@ -23733,70 +23888,78 @@ } }, "@web/test-runner": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.15.1.tgz", - "integrity": "sha512-61L4mvDSvs8Dp3TdKe7WHc8kxHndHlGheWiIFEMgbfetJua6MZ4jyPThISIHSEq3LdAv9key2aDIdmyzk0YJ6w==", + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.15.3.tgz", + "integrity": "sha512-unwBymuQpI8yc/129K9H0aIzLIIQFrr2/mhdcIWFeZjjw5X3TJh57p5NFOA76nhlBSjFHyu0U0FXw9uOzXUCuQ==", "dev": true, "requires": { - "@web/browser-logs": "^0.2.2", + "@web/browser-logs": "^0.2.6", "@web/config-loader": "^0.1.3", - "@web/dev-server": "^0.1.35", - "@web/test-runner-chrome": "^0.11.0", - "@web/test-runner-commands": "^0.6.3", - "@web/test-runner-core": "^0.10.27", + "@web/dev-server": "^0.1.38", + "@web/test-runner-chrome": "^0.12.1", + "@web/test-runner-commands": "^0.6.6", + "@web/test-runner-core": "^0.10.29", "@web/test-runner-mocha": "^0.7.5", "camelcase": "^6.2.0", "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.1", - "convert-source-map": "^1.7.0", + "command-line-usage": "^7.0.1", + "convert-source-map": "^2.0.0", "diff": "^5.0.0", "globby": "^11.0.1", "nanocolors": "^0.2.1", "portfinder": "^1.0.32", "source-map": "^0.7.3" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + } } }, "@web/test-runner-chrome": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.11.0.tgz", - "integrity": "sha512-3Eq8C1XEGmfq7iwUvXy0xXfI/fbJNIq2ImDKTVdnwT4+5uTt1i8UFZxZ0PLdkWrhXVtiWI6zcZK/2VBzsGyHBA==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.12.1.tgz", + "integrity": "sha512-QxzinqYHelZQpMHAuc5TYyWVhtHUEGhL3m1p2U+mTTTWrZYX3D0s6Q0oL2+XYT1dsja5sd71h7yiBTb9ctkKOg==", "dev": true, "requires": { - "@web/test-runner-core": "^0.10.20", + "@web/test-runner-core": "^0.10.29", "@web/test-runner-coverage-v8": "^0.5.0", "chrome-launcher": "^0.15.0", - "puppeteer-core": "^13.1.3" + "puppeteer-core": "^19.8.1" } }, "@web/test-runner-commands": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.6.5.tgz", - "integrity": "sha512-W+wLg10jEAJY9N6tNWqG1daKmAzxGmTbO/H9fFfcgOgdxdn+hHiR4r2/x1iylKbFLujHUQlnjNQeu2d6eDPFqg==", + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.6.6.tgz", + "integrity": "sha512-2DcK/+7f8QTicQpGFq/TmvKHDK/6Zald6rn1zqRlmj3pcH8fX6KHNVMU60Za9QgAKdorMBPfd8dJwWba5otzdw==", "dev": true, "requires": { - "@web/test-runner-core": "^0.10.27", + "@web/test-runner-core": "^0.10.29", "mkdirp": "^1.0.4" } }, "@web/test-runner-core": { - "version": "0.10.27", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.10.27.tgz", - "integrity": "sha512-ClV/hSxs4wDm/ANFfQOdRRFb/c0sYywC1QfUXG/nS4vTp3nnt7x7mjydtMGGLmvK9f6Zkubkc1aa+7ryfmVwNA==", + "version": "0.10.29", + "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.10.29.tgz", + "integrity": "sha512-0/ZALYaycEWswHhpyvl5yqo0uIfCmZe8q14nGPi1dMmNiqLcHjyFGnuIiLexI224AW74ljHcHllmDlXK9FUKGA==", "dev": true, "requires": { "@babel/code-frame": "^7.12.11", "@types/babel__code-frame": "^7.0.2", "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^1.5.1", + "@types/convert-source-map": "^2.0.0", "@types/debounce": "^1.2.0", "@types/istanbul-lib-coverage": "^2.0.3", "@types/istanbul-reports": "^3.0.0", - "@web/browser-logs": "^0.2.1", - "@web/dev-server-core": "^0.3.18", + "@web/browser-logs": "^0.2.6", + "@web/dev-server-core": "^0.4.1", "chokidar": "^3.4.3", "cli-cursor": "^3.1.0", "co-body": "^6.1.0", - "convert-source-map": "^1.7.0", + "convert-source-map": "^2.0.0", "debounce": "^1.2.0", "dependency-graph": "^0.11.0", "globby": "^11.0.1", @@ -23812,6 +23975,12 @@ "source-map": "^0.7.3" }, "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "ip": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", @@ -23862,9 +24031,9 @@ } }, "@xmldom/xmldom": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.6.tgz", - "integrity": "sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.7.tgz", + "integrity": "sha512-sI1Ly2cODlWStkINzqGrZ8K6n+MTSbAeQnAipGyL+KZCXuHaRlj2gyyy8B/9MvsFFqN7XHryQnB2QwhzvJXovg==", "dev": true }, "@yarnpkg/esbuild-plugin-pnp": { @@ -24106,6 +24275,16 @@ "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, "array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", @@ -24209,8 +24388,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "available-typed-arrays": { "version": "1.0.5", @@ -24219,9 +24397,9 @@ "dev": true }, "axe-core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", - "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "dev": true }, "axobject-query": { @@ -24298,8 +24476,7 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "better-opn": { "version": "2.1.1", @@ -24386,6 +24563,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, "raw-body": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", @@ -24605,9 +24791,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001458", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001458.tgz", - "integrity": "sha512-lQ1VlUUq5q9ro9X+5gOEyH7i3vm+AYVT1WDCVB69XOZ17KZRhnZ9J0Sqz7wTHQaLBJccNCHq8/Ww5LlOIZbB0w==", + "version": "1.0.30001481", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001481.tgz", + "integrity": "sha512-KCqHwRnaa1InZBtqXzP98LPg0ajCVujMKjqKDhZEthIpAsJl/YEIa3YvXjGXPVqzZVguccuu7ga9KOE1J9rKPQ==", "dev": true }, "capital-case": { @@ -24622,9 +24808,9 @@ } }, "chai-a11y-axe": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/chai-a11y-axe/-/chai-a11y-axe-1.4.0.tgz", - "integrity": "sha512-m7J6DVAl1ePL2ifPKHmwQyHXdCZ+Qfv+qduh6ScqcDfBnJEzpV1K49TblujM45j1XciZOFeFNqMb2sShXMg/mw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/chai-a11y-axe/-/chai-a11y-axe-1.4.1.tgz", + "integrity": "sha512-H3eRQhLbN1bk8thQXjZVKHVPlFGYrrmQ+iR8TwS9ML0HLu0Pjb6c7rMcaRZb99SsWMrenqE+W0AZRApVxlaltg==", "dev": true, "requires": { "axe-core": "^4.3.3" @@ -24641,6 +24827,51 @@ "supports-color": "^5.3.0" } }, + "chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dev": true, + "requires": { + "chalk": "^4.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "change-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", @@ -24690,9 +24921,9 @@ "dev": true }, "chrome-launcher": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.1.tgz", - "integrity": "sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "dev": true, "requires": { "@types/node": "*", @@ -24709,6 +24940,15 @@ } } }, + "chromium-bidi": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.7.tgz", + "integrity": "sha512-6+mJuFXwTMU6I3vYLs6IL8A1DyQTPjCfIL971X0aMPVGRbGnNfl6i6Cl0NMbxi2bRYLGESt9T2ZIMRM5PAEcIQ==", + "dev": true, + "requires": { + "mitt": "3.0.0" + } + }, "ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -24737,9 +24977,9 @@ } }, "cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz", + "integrity": "sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==", "dev": true }, "cli-table3": { @@ -24842,16 +25082,15 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -24869,35 +25108,35 @@ } }, "command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", + "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", "dev": true, "requires": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^3.0.0", + "typical": "^7.1.1" }, "dependencies": { "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "dev": true }, "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", "dev": true } } }, "commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true }, "commondir": { @@ -25066,9 +25305,9 @@ } }, "core-js-compat": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", - "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", + "version": "3.30.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz", + "integrity": "sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==", "dev": true, "requires": { "browserslist": "^4.21.5" @@ -25146,9 +25385,9 @@ "dev": true }, "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, "debounce": { @@ -25197,12 +25436,6 @@ "which-typed-array": "^1.1.9" } }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -25210,9 +25443,9 @@ "dev": true }, "deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, "default-browser-id": { @@ -25283,8 +25516,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "delegates": { "version": "1.0.0", @@ -25348,9 +25580,9 @@ } }, "devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", + "version": "0.0.1107588", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz", + "integrity": "sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg==", "dev": true }, "diff": { @@ -25487,20 +25719,20 @@ } }, "electron-to-chromium": { - "version": "1.4.315", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.315.tgz", - "integrity": "sha512-ndBQYz3Eyy3rASjjQ9poMJGoAlsZ/aZnq6GBsGL4w/4sWIAwiUHVSsMuADbxa8WJw7pZ0oxLpGbtoDt4vRTdCg==", + "version": "1.4.371", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.371.tgz", + "integrity": "sha512-jlBzY4tFcJaiUjzhRTCWAqRvTO/fWzjA3Bls0mykzGZ7zvcMP7h05W6UcgzfT9Ca1SW2xyKDOFRyI0pQeRNZGw==", "dev": true }, "element-internals-polyfill": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/element-internals-polyfill/-/element-internals-polyfill-1.2.3.tgz", - "integrity": "sha512-73KWRk5D3hYkaqK/XZtwTEabdwp5R6eo6vZvFMKpv995k1j8pV9FTeGhE8C/q6tN+wNQrRmj2BUMYHU884PGIA==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/element-internals-polyfill/-/element-internals-polyfill-1.3.1.tgz", + "integrity": "sha512-IeM6FjSEOg5IF5NEj9akC8OnMZEJfSkevSu12U4Ns6XvUdqvM7gxPvFJrVRW+hsQ1IG0cAfAs5pcMXTpdRxCSg==" }, "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", "dev": true }, "encodeurl": { @@ -25519,15 +25751,21 @@ } }, "enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz", + "integrity": "sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, "envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", @@ -25550,18 +25788,18 @@ "dev": true }, "es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, "requires": { + "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -25569,8 +25807,8 @@ "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", @@ -25578,11 +25816,12 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-length": "^1.0.4", @@ -25651,147 +25890,35 @@ "dev": true }, "esbuild": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", - "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", + "version": "0.17.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.18.tgz", + "integrity": "sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==", "dev": true, "requires": { - "@esbuild/android-arm": "0.17.15", - "@esbuild/android-arm64": "0.17.15", - "@esbuild/android-x64": "0.17.15", - "@esbuild/darwin-arm64": "0.17.15", - "@esbuild/darwin-x64": "0.17.15", - "@esbuild/freebsd-arm64": "0.17.15", - "@esbuild/freebsd-x64": "0.17.15", - "@esbuild/linux-arm": "0.17.15", - "@esbuild/linux-arm64": "0.17.15", - "@esbuild/linux-ia32": "0.17.15", - "@esbuild/linux-loong64": "0.17.15", - "@esbuild/linux-mips64el": "0.17.15", - "@esbuild/linux-ppc64": "0.17.15", - "@esbuild/linux-riscv64": "0.17.15", - "@esbuild/linux-s390x": "0.17.15", - "@esbuild/linux-x64": "0.17.15", - "@esbuild/netbsd-x64": "0.17.15", - "@esbuild/openbsd-x64": "0.17.15", - "@esbuild/sunos-x64": "0.17.15", - "@esbuild/win32-arm64": "0.17.15", - "@esbuild/win32-ia32": "0.17.15", - "@esbuild/win32-x64": "0.17.15" + "@esbuild/android-arm": "0.17.18", + "@esbuild/android-arm64": "0.17.18", + "@esbuild/android-x64": "0.17.18", + "@esbuild/darwin-arm64": "0.17.18", + "@esbuild/darwin-x64": "0.17.18", + "@esbuild/freebsd-arm64": "0.17.18", + "@esbuild/freebsd-x64": "0.17.18", + "@esbuild/linux-arm": "0.17.18", + "@esbuild/linux-arm64": "0.17.18", + "@esbuild/linux-ia32": "0.17.18", + "@esbuild/linux-loong64": "0.17.18", + "@esbuild/linux-mips64el": "0.17.18", + "@esbuild/linux-ppc64": "0.17.18", + "@esbuild/linux-riscv64": "0.17.18", + "@esbuild/linux-s390x": "0.17.18", + "@esbuild/linux-x64": "0.17.18", + "@esbuild/netbsd-x64": "0.17.18", + "@esbuild/openbsd-x64": "0.17.18", + "@esbuild/sunos-x64": "0.17.18", + "@esbuild/win32-arm64": "0.17.18", + "@esbuild/win32-ia32": "0.17.18", + "@esbuild/win32-x64": "0.17.18" } }, - "esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "dev": true, - "optional": true - }, "esbuild-plugin-alias": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz", @@ -25807,34 +25934,6 @@ "debug": "^4.3.4" } }, - "esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "dev": true, - "optional": true - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -25854,13 +25953,15 @@ "dev": true }, "eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", "dev": true, "requires": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -25870,10 +25971,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -25895,7 +25995,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -25933,9 +26032,9 @@ "dev": true }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -26027,24 +26126,25 @@ } }, "eslint-import-resolver-typescript": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz", - "integrity": "sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", "dev": true, "requires": { "debug": "^4.3.4", - "enhanced-resolve": "^5.10.0", - "get-tsconfig": "^4.2.0", - "globby": "^13.1.2", - "is-core-module": "^2.10.0", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", - "synckit": "^0.8.4" + "synckit": "^0.8.5" }, "dependencies": { "globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, "requires": { "dir-glob": "^3.0.1", @@ -26063,9 +26163,9 @@ } }, "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "requires": { "debug": "^3.2.7" @@ -26126,9 +26226,9 @@ } }, "eslint-plugin-lit": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.8.2.tgz", - "integrity": "sha512-4mOGcSRNEPMh7AN2F7Iy6no36nuFgyYOsnTRhFw1k8xyy1Zm6QOp788ywDvJqy+eelFbLPBhq20Qr55a887Dmw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.8.3.tgz", + "integrity": "sha512-wmeYfBnWPUChbdZagOhG519gaWz9Q7OGT/nCx3YVHuCCrW9q9u0p/IQueQeoaMojUqOSgM/22oSDOaBruYGqag==", "dev": true, "requires": { "parse5": "^6.0.1", @@ -26137,29 +26237,32 @@ } }, "eslint-plugin-lit-a11y": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit-a11y/-/eslint-plugin-lit-a11y-2.3.0.tgz", - "integrity": "sha512-k6j7I6hGJmcojFHIotACgnNgggcK4fvYy+uTVrdseenyzp13yacSlaJtvC3k5kEAKoSIVK1fYiKbufYnvEFegQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-lit-a11y/-/eslint-plugin-lit-a11y-2.4.1.tgz", + "integrity": "sha512-UljRja/2cVrNtgnCDj5sCT3Larxda4mGqbsPhlksvECo0+KCD8EuUori/P6wFeFqk+pHlkIC3W200E5q85E3VQ==", "dev": true, "requires": { "aria-query": "^5.1.3", "axe-core": "^4.3.3", "axobject-query": "^2.2.0", "dom5": "^3.0.1", - "emoji-regex": "^9.2.0", + "emoji-regex": "^10.2.1", "eslint-plugin-lit": "^1.6.0", "eslint-rule-extender": "0.0.1", "language-tags": "^1.0.5", - "parse5": "^5.1.1", + "parse5": "^7.1.2", "parse5-htmlparser2-tree-adapter": "^6.0.1", "requireindex": "~1.2.0" }, "dependencies": { "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } } } }, @@ -26193,9 +26296,9 @@ } }, "eslint-plugin-wc": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-1.4.0.tgz", - "integrity": "sha512-AmoKhJyBNcS3I+dbS/JTmRSq4REUvQ/JJCeWJezlK8gqTsdr5JD+EAvHldH/tVvU+l6qR2Tykga5hTINP9zS8A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-1.5.0.tgz", + "integrity": "sha512-KFSfiHDol/LeV7U6IX8GdgpGf/s3wG8FTG120Rml/hGNB/DkCuGYQhlf0VgdBdf7gweem8Nlsh5o64HNdj+qPA==", "dev": true, "requires": { "is-valid-element-name": "^1.0.0", @@ -26218,38 +26321,21 @@ "estraverse": "^4.1.1" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.0" } }, "esprima": { @@ -26402,6 +26488,15 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -26533,9 +26628,9 @@ } }, "file-system-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.0.2.tgz", - "integrity": "sha512-lp4BHO4CWqvRyx88Tt3quZic9ZMf4cJyquYq7UI8sH42Bm2ArlBBjKQAalZOo+UfaBassb7X123Lik5qZ/tSAA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.1.1.tgz", + "integrity": "sha512-vgZ1uDsK29DM4pptUOv47zdJO2tYM5M/ERyAE9Jk0QBN6e64Md+a+xJSOp68dCCDH4niFMVD8nC8n8A5ic0bmg==", "dev": true, "requires": { "fs-extra": "^11.1.0", @@ -26738,11 +26833,16 @@ "dev": true }, "flow-parser": { - "version": "0.203.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.203.1.tgz", - "integrity": "sha512-Nw2M8MPP/Zb+yhvmPDEjzkCXLtgyWGKXZjAYOVftm+wIf3xd4FKa7nRI9v67rODs0WzxMbPc8IPs/7o/dyxo/Q==", + "version": "0.204.1", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.204.1.tgz", + "integrity": "sha512-PoeSF0VhSORn3hYzD/NxsQjXX1iLU0UZXzVwZXnRWjeVsedmvDo4epd7PtCQjxveGajmVlyVW35BOOOkqLqJpw==", "dev": true }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -26768,10 +26868,9 @@ } }, "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -26797,9 +26896,9 @@ "dev": true }, "fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "requires": { "graceful-fs": "^4.2.0", @@ -26945,9 +27044,9 @@ } }, "get-tsconfig": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz", - "integrity": "sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", "dev": true }, "giget": { @@ -27114,9 +27213,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "grapheme-splitter": { @@ -27586,9 +27685,9 @@ "dev": true }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", "dev": true, "requires": { "has": "^1.0.3" @@ -27686,9 +27785,9 @@ "dev": true }, "is-node-process": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.0.1.tgz", - "integrity": "sha512-5IcdXuf++TTNt3oGl9EBdkvndXA8gmc4bz/Y+mdEpWh3Mcn/+kOw6hI7LD5CocqJWMzeb0I0ClndRVNdEPuJXQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true }, "is-number": { @@ -27872,9 +27971,9 @@ "dev": true }, "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", + "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", "dev": true }, "isexe": { @@ -28128,9 +28227,9 @@ "dev": true }, "js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true }, "js-tokens": { @@ -28327,9 +28426,9 @@ "dev": true }, "koa": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.1.tgz", - "integrity": "sha512-USJFyZgi2l0wDgqkfD27gL4YGno7TfUkcmOe6UOLFOVuN+J7FwnNu4Dydl4CUQzraM1lBAiGed0M9OVJoT0Kqw==", + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", + "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", "dev": true, "requires": { "accepts": "^1.3.5", @@ -28562,9 +28661,9 @@ "dev": true }, "lit": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.0.tgz", - "integrity": "sha512-qSy2BAVA+OiWtNptP404egcC/izDdNRw6iHGIbUmkZtbMJvPKfNsaoKrNs8Zmsbjmv5ZX2tur1l9TfzkSWWT4g==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.2.tgz", + "integrity": "sha512-9QnZmG5mIKPRja96cpndMclLSi0Qrz2BXD6EbqNqCKMMjOWVm/BwAeXufFk2jqFsNmY07HOzU8X+8aTSVt3yrA==", "requires": { "@lit/reactive-element": "^1.6.0", "lit-element": "^3.3.0", @@ -28572,9 +28671,9 @@ } }, "lit-element": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.0.tgz", - "integrity": "sha512-M3OIoblNS7LZdRxOIk8g0wyLEA/lRw/UGJ1TX+767OpkuDsRdSoxBIvewpWqCo7sMd9xt1XedUNZIr9jUO1X3g==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.1.tgz", + "integrity": "sha512-Gl+2409uXWbf7n6cCl7Kzasm7zjT9xmdwi2BhLNi70sRKAgRkqueDu5mSIH3hPYMM0/vqBCdPXod3NbGkRA2ww==", "requires": { "@lit-labs/ssr-dom-shim": "^1.1.0", "@lit/reactive-element": "^1.3.0", @@ -28582,9 +28681,9 @@ } }, "lit-html": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.0.tgz", - "integrity": "sha512-/zPOl8EfeB3HHpTzINSpnWgvgQ8N07g/j272EOAIyB0Ys2RzBqTVT23i+JZuUlNbB2WHHeSsTCFi92NtWrtpqQ==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.2.tgz", + "integrity": "sha512-ZJCfKlA2XELu5tn7XuzOziGFGvf1SeQm+ngLWoJ8bXtSkRrrR3ms6SWy+gsdxeYwySLij5xAhdd2C3EX0ftxdQ==", "requires": { "@types/trusted-types": "^2.0.2" } @@ -28609,6 +28708,12 @@ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, + "lodash.assignwith": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", + "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==", + "dev": true + }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -28879,14 +28984,12 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "requires": { "mime-db": "1.52.0" } @@ -28913,9 +29016,9 @@ "dev": true }, "minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true }, "minizlib": { @@ -28945,6 +29048,12 @@ } } }, + "mitt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", + "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", + "dev": true + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -28975,9 +29084,9 @@ "dev": true }, "msw": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/msw/-/msw-1.1.0.tgz", - "integrity": "sha512-oqMvUXm1bMbwvGpoXAQVz8vXXQyQyx52HBDg3EDOK+dFXkQHssgkXEG4LfMwwZyr2Qt18I/w04XPaY4BkFTkzA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/msw/-/msw-1.2.1.tgz", + "integrity": "sha512-bF7qWJQSmKn6bwGYVPXOxhexTCGD5oJSZg8yt8IBClxvo3Dx/1W0zqE1nX9BSWmzRsCKWfeGWcB/vpqV6aclpw==", "dev": true, "requires": { "@mswjs/cookies": "^0.2.2", @@ -28989,12 +29098,12 @@ "chokidar": "^3.4.2", "cookie": "^0.4.2", "graphql": "^15.0.0 || ^16.0.0", - "headers-polyfill": "^3.1.0", + "headers-polyfill": "^3.1.2", "inquirer": "^8.2.0", - "is-node-process": "^1.0.1", + "is-node-process": "^1.2.0", "js-levenshtein": "^1.1.6", "node-fetch": "^2.6.7", - "outvariant": "^1.3.0", + "outvariant": "^1.4.0", "path-to-regexp": "^6.2.0", "strict-event-emitter": "^0.4.3", "type-fest": "^2.19.0", @@ -29071,9 +29180,9 @@ "dev": true }, "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true }, "natural-compare": { @@ -29153,9 +29262,9 @@ } }, "node-fetch-native": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.2.tgz", - "integrity": "sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.1.0.tgz", + "integrity": "sha512-nl5goFCig93JZ9FIV8GHT9xpNqXbxQUzkOmKIMKmncsBH9jhg7qKex8hirpymkBFmNQ114chEEG5lS4wgK2I+Q==", "dev": true }, "node-int64": { @@ -29186,9 +29295,9 @@ }, "dependencies": { "globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, "requires": { "dir-glob": "^3.0.1", @@ -29198,6 +29307,12 @@ "slash": "^4.0.0" } }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true + }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -29392,31 +29507,23 @@ } }, "openapi-typescript-codegen": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.23.0.tgz", - "integrity": "sha512-gOJXy5g3H3HlLpVNN+USrNK2i2KYBmDczk9Xk34u6JorwrGiDJZUj+al4S+i9TXdfUQ/ZaLxE59Xf3wqkxGfqA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.24.0.tgz", + "integrity": "sha512-rSt8t1XbMWhv6Db7GUI24NNli7FU5kzHLxcE8BpzgGWRdWyWt9IB2YoLyPahxNrVA7yOaVgnXPkrcTDRMQtJYg==", "dev": true, "requires": { "camelcase": "^6.3.0", - "commander": "^9.3.0", - "fs-extra": "^10.1.0", + "commander": "^10.0.0", + "fs-extra": "^11.1.1", "handlebars": "^4.7.7", "json-schema-ref-parser": "^9.0.9" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - } } }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -29491,9 +29598,9 @@ "dev": true }, "outvariant": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.3.0.tgz", - "integrity": "sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.0.tgz", + "integrity": "sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==", "dev": true }, "p-limit": { @@ -29738,24 +29845,24 @@ } }, "playwright": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.31.1.tgz", - "integrity": "sha512-zKJabsIA2rvOwJ12lGTqWv4HVJzlfw2JtUvO4hAr7J8UXQZ1qEPpX20E1vcz/9fotnTkwgqp3CVdIBwptBN3Fg==", + "version": "1.32.3", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.32.3.tgz", + "integrity": "sha512-h/ylpgoj6l/EjkfUDyx8cdOlfzC96itPpPe8BXacFkqpw/YsuxkpPyVbzEq4jw+bAJh5FLgh31Ljg2cR6HV3uw==", "dev": true, "requires": { - "playwright-core": "1.31.1" + "playwright-core": "1.32.3" } }, "playwright-core": { - "version": "1.31.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.31.1.tgz", - "integrity": "sha512-JTyX4kV3/LXsvpHkLzL2I36aCdml4zeE35x+G5aPc4bkLsiRiQshU5lWeVpHFAuC8xAcbI6FDcw/8z3q2xtJSQ==", + "version": "1.32.3", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.3.tgz", + "integrity": "sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==", "dev": true }, "playwright-msw": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/playwright-msw/-/playwright-msw-2.2.0.tgz", - "integrity": "sha512-Uaf4riamSeAp2saQdnxros8zEYYCC0jXx+KtmlcOpkdZPX3cvrh6rYpHRwu/4UYIZg0BcnYItTFXEZ0tbd6Ztg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/playwright-msw/-/playwright-msw-2.2.1.tgz", + "integrity": "sha512-LjT68LWqzJX8boy4KbnPp5ACLf7WDpt6RUem0tQQcQKys+45KNlluzBx8HEl1HNiCBYV/XZw1aI1aD2giKXWRg==", "dev": true, "requires": { "@mswjs/cookies": "^0.2.2", @@ -29784,27 +29891,6 @@ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, - "bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "chalk": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", @@ -29843,18 +29929,18 @@ } }, "ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.0.tgz", + "integrity": "sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ==", "dev": true, "requires": { - "bl": "^5.0.0", "chalk": "^5.0.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.6.1", "is-interactive": "^2.0.0", "is-unicode-supported": "^1.1.0", "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", "strip-ansi": "^7.0.1", "wcwidth": "^1.0.1" } @@ -29930,12 +30016,12 @@ } }, "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "dev": true, "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } @@ -30053,83 +30139,28 @@ "dev": true }, "puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", + "version": "19.11.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.11.0.tgz", + "integrity": "sha512-UBlwpyTEKcaOt7bIWWhlhIXDlFbR1wVBcxpMibBhImwagkwDB8ld8ehT5dOdfKIcCHjxXzVEaMtgDKzfwcf7Rg==", "dev": true, "requires": { + "@puppeteer/browsers": "0.5.0", + "chromium-bidi": "0.4.7", "cross-fetch": "3.1.5", "debug": "4.3.4", - "devtools-protocol": "0.0.981744", + "devtools-protocol": "0.0.1107588", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", "tar-fs": "2.1.1", "unbzip2-stream": "1.4.3", - "ws": "8.5.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true - } + "ws": "8.13.0" } }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -30296,9 +30327,9 @@ } }, "readable-stream": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", - "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -30345,12 +30376,6 @@ "resolve": "^1.20.0" } }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true - }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -30382,22 +30407,16 @@ } }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -30478,12 +30497,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -30594,28 +30613,28 @@ } }, "rollup": { - "version": "3.20.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.7.tgz", - "integrity": "sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.0.tgz", + "integrity": "sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ==", "dev": true, "requires": { "fsevents": "~2.3.2" } }, "rollup-plugin-dts": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-5.2.0.tgz", - "integrity": "sha512-B68T/haEu2MKcz4kNUhXB8/h5sq4gpplHAJIYNHbh8cp4ZkvzDvNca/11KQdFrB9ZeKucegQIotzo5T0JUtM8w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-5.3.0.tgz", + "integrity": "sha512-8FXp0ZkyZj1iU5klkIJYLjIq/YZSwBoERu33QBDxm/1yw5UU4txrEtcmMkrq+ZiKu3Q4qvPCNqc3ovX6rjqzbQ==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "magic-string": "^0.29.0" + "magic-string": "^0.30.0" }, "dependencies": { "magic-string": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", - "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", "dev": true, "requires": { "@jridgewell/sourcemap-codec": "^1.4.13" @@ -30637,9 +30656,9 @@ }, "dependencies": { "es-module-lexer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.0.tgz", - "integrity": "sha512-2BMfqBDeVCcOlLaL1ZAfp+D868SczNpKArrTM3dhpd7dK/OVlogzY15qpUngt+LMTq5UC/csb9vVQAgupucSbA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", "dev": true } } @@ -30716,9 +30735,9 @@ } }, "safe-stable-stringify": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz", - "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "dev": true }, "safer-buffer": { @@ -30737,15 +30756,15 @@ } }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "dependencies": { "ajv": { @@ -30883,9 +30902,9 @@ "dev": true }, "set-cookie-parser": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", - "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", "dev": true }, "setprototypeof": { @@ -31075,9 +31094,9 @@ "dev": true }, "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -31101,9 +31120,9 @@ } }, "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "sprintf-js": { @@ -31118,6 +31137,38 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true }, + "stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "requires": { + "bl": "^5.0.0" + }, + "dependencies": { + "bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "requires": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + } + } + }, "stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -31134,14 +31185,20 @@ "dev": true }, "storybook": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.0.2.tgz", - "integrity": "sha512-/XBLhT9Vb14yNBcA9rlW15y+C6IsCA3kx5PKvK9kL10sKCi8invcY94UfCSisXe8HqsO3u6peumo2xpYucKMjw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.0.7.tgz", + "integrity": "sha512-MaFAhpPm/KsaoIQfGzapnRyXNh1VbS8l38BNZR5ZD97ejGkLukJ7TO4fFS87Hyy6whAXo6tTdtqeCByMQ9gRFA==", "dev": true, "requires": { - "@storybook/cli": "7.0.2" + "@storybook/cli": "7.0.7" } }, + "stream-read-all": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", + "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", + "dev": true + }, "stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", @@ -31190,6 +31247,17 @@ } } }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", @@ -31271,27 +31339,30 @@ } }, "table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", + "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", "dev": true, "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" + "@75lb/deep-merge": "^1.1.1", + "array-back": "^6.2.2", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.0", + "stream-read-all": "^3.0.1", + "typical": "^7.1.1", + "wordwrapjs": "^5.1.0" }, "dependencies": { "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", "dev": true }, "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", + "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", "dev": true } } @@ -31358,9 +31429,9 @@ } }, "telejson": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.0.4.tgz", - "integrity": "sha512-J4QEuCnYGXAI9KSN7RXK0a0cOW2ONpjc4IQbInGZ6c3stvplLAYyZjTnScrRd8deXVjNCFV1wXcLC7SObDuQYA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.1.0.tgz", + "integrity": "sha512-jFJO4P5gPebZAERPkJsqMAQ0IMA1Hi0AoSfxpnUaV6j6R2SZqlpkbS20U6dEUtA3RUYt2Ak/mTlkQzHH9Rv/hA==", "dev": true, "requires": { "memoizerific": "^1.11.3" @@ -31713,9 +31784,9 @@ "dev": true }, "typescript": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.3.tgz", - "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true }, "typescript-json-schema": { @@ -31735,9 +31806,9 @@ }, "dependencies": { "@types/node": { - "version": "16.18.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.16.tgz", - "integrity": "sha512-ZOzvDRWp8dCVBmgnkIqYCArgdFOO9YzocZp8Ra25N/RStKiWvMOXHMz+GjSeVNe5TstaTmTWPucGJkDw0XXJWA==", + "version": "16.18.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.24.tgz", + "integrity": "sha512-zvSN2Esek1aeLdKDYuntKAYjti9Z2oT4I8bfkLLhIxHlv3dwZ5vvATxOc31820iYm4hQRCwjUgDpwSMFjfTUnw==", "dev": true }, "glob": { @@ -31769,9 +31840,9 @@ "dev": true }, "ua-parser-js": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.33.tgz", - "integrity": "sha512-RqshF7TPTE0XLYAqmjlu5cLLuGdKrNu9O1KLA/qp39QtbZwuzwv1dT46DZSopoUMsYgXpB3Cv8a03FI8b74oFQ==", + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", "dev": true }, "uglify-js": { @@ -31910,9 +31981,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -31985,12 +32056,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" }, - "uuid-browser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz", - "integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==", - "dev": true - }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -32295,9 +32360,9 @@ } }, "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, "which-typed-array": { @@ -32345,22 +32410,10 @@ "dev": true }, "wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "dependencies": { - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", + "dev": true }, "wrap-ansi": { "version": "7.0.0", @@ -32401,9 +32454,9 @@ } }, "ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true }, "xtend": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index de0234b252..ddca66df84 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -43,8 +43,8 @@ "lint:fix": "npm run lint -- --fix", "format": "prettier 'src/**/*.ts'", "format:fix": "npm run format -- --write", - "generate:api": "openapi --input https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v13/dev/src/Umbraco.Cms.Api.Management/OpenApi.json --output libs/backend-api/src --postfix Resource --useOptions", - "generate:api-dev": "openapi --input http://localhost:11000/umbraco/swagger/v1/swagger.json --output libs/backend-api/src --postfix Resource --useOptions", + "generate:api": "openapi --input https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v13/dev/src/Umbraco.Cms.Api.Management/OpenApi.json --output libs/backend-api/src --postfixServices Resource --useOptions", + "generate:api-dev": "openapi --input http://localhost:11000/umbraco/swagger/v1/swagger.json --output libs/backend-api/src --postfixServices Resource --useOptions", "generate:jsonschema": "typescript-json-schema --required --include \"./libs/extensions-registry/*.ts\" --out dist/libs/umbraco-package-schema.json tsconfig.json UmbracoPackage", "storybook": "npm run wc-analyze && storybook dev -p 6006", "storybook:build": "npm run wc-analyze && storybook build", @@ -61,6 +61,7 @@ "npm": ">=9.5 < 10" }, "dependencies": { + "@openid/appauth": "^1.3.1", "@umbraco-ui/uui": "^1.2.1", "@umbraco-ui/uui-css": "^1.2.1", "element-internals-polyfill": "^1.1.19", @@ -108,7 +109,7 @@ "eslint-plugin-wc": "^1.4.0", "msw": "^1.1.0", "msw-storybook-addon": "^1.8.0", - "openapi-typescript-codegen": "^0.23.0", + "openapi-typescript-codegen": "^0.24.0", "playwright-msw": "^2.1.0", "plop": "^3.1.1", "prettier": "2.8.4", diff --git a/src/Umbraco.Web.UI.Client/public/mockServiceWorker.js b/src/Umbraco.Web.UI.Client/public/mockServiceWorker.js index e915a1eb08..87e0f31b81 100644 --- a/src/Umbraco.Web.UI.Client/public/mockServiceWorker.js +++ b/src/Umbraco.Web.UI.Client/public/mockServiceWorker.js @@ -2,7 +2,7 @@ /* tslint:disable */ /** - * Mock Service Worker (1.1.0). + * Mock Service Worker (1.2.1). * @see https://github.com/mswjs/msw * - Please do NOT modify this file. * - Please do NOT serve this file on production. diff --git a/src/Umbraco.Web.UI.Client/public/umbraco_background.jpg b/src/Umbraco.Web.UI.Client/public/umbraco_background.jpg new file mode 100644 index 0000000000..412cd17865 Binary files /dev/null and b/src/Umbraco.Web.UI.Client/public/umbraco_background.jpg differ diff --git a/src/Umbraco.Web.UI.Client/src/app.ts b/src/Umbraco.Web.UI.Client/src/app.ts index a4c473067b..6449a08b26 100644 --- a/src/Umbraco.Web.UI.Client/src/app.ts +++ b/src/Umbraco.Web.UI.Client/src/app.ts @@ -12,22 +12,36 @@ import { UUIIconRegistryEssential } from '@umbraco-ui/uui'; import { css, html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; +import { UmbAuthFlow } from './core/auth/auth-flow'; import { UmbIconStore } from './core/stores/icon/icon.store'; -import type { Guard, IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbErrorElement } from './error/error.element'; +import type { Guard, UmbRoute } from '@umbraco-cms/backoffice/router'; import { pathWithoutBasePath } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import { UMB_SERVER_URL, tryExecute } from '@umbraco-cms/backoffice/resources'; import { OpenAPI, RuntimeLevelModel, ServerResource } from '@umbraco-cms/backoffice/backend-api'; import { contextData, umbDebugContextEventType } from '@umbraco-cms/backoffice/context-api'; @customElement('umb-app') export class UmbAppElement extends UmbLitElement { - - + /** + * The base URL of the configured Umbraco server. + * + * @attr + * @remarks This is the base URL of the Umbraco server, not the base URL of the backoffice. + */ @property({ type: String }) - private umbracoUrl?: string; + private serverUrl = import.meta.env.VITE_UMBRACO_API_URL ?? ''; - private _routes: IRoute[] = [ + /** + * The base path of the backoffice. + * + * @attr + */ + @property({ type: String }) + private backofficePath = '/umbraco'; + + private _routes: UmbRoute[] = [ { path: 'install', component: () => import('./installer/installer.element'), @@ -35,7 +49,7 @@ export class UmbAppElement extends UmbLitElement { { path: 'upgrade', component: () => import('./upgrader/upgrader.element'), - guards: [this.#isAuthorizedGuard('/upgrade')], + guards: [this.#isAuthorizedGuard()], }, { path: '**', @@ -44,28 +58,71 @@ export class UmbAppElement extends UmbLitElement { }, ]; + #authFlow: UmbAuthFlow; #umbIconRegistry = new UmbIconStore(); #uuiIconRegistry = new UUIIconRegistryEssential(); #runtimeLevel = RuntimeLevelModel.UNKNOWN; + #isMocking = import.meta.env.VITE_UMBRACO_USE_MSW === 'on'; constructor() { super(); + + // TODO: get all mocking logic out of this element. The app element doesn't need to know who is serving the data. + OpenAPI.BASE = this.#isMocking ? '' : this.serverUrl; + + this.#authFlow = new UmbAuthFlow( + OpenAPI.BASE !== '' ? OpenAPI.BASE : window.location.origin, + `${window.location.origin}${this.backofficePath}` + ); + + this.provideContext(UMB_SERVER_URL, OpenAPI.BASE); + + this._setup(); + this.#umbIconRegistry.attach(this); this.#uuiIconRegistry.attach(this); } - connectedCallback() { - super.connectedCallback(); + private async _setup() { + // Try to initialise the auth flow and get the runtime status + try { + // Get the current runtime level + await this.#setInitStatus(); - OpenAPI.BASE = - import.meta.env.VITE_UMBRACO_USE_MSW === 'on' - ? '' - : this.umbracoUrl ?? import.meta.env.VITE_UMBRACO_API_URL ?? ''; - OpenAPI.WITH_CREDENTIALS = true; + // If we are not mocking, we need to initialise the connection to the Umbraco authentication server + if (!this.#isMocking) { + // Get service configuration from authentication server + await this.#authFlow.setInitialState(); - this.provideContext('UMBRACOBASE', OpenAPI.BASE); - this.#setInitStatus(); + // Instruct all requests to use the auth flow to get and use the access_token for all subsequent requests + OpenAPI.TOKEN = () => this.#authFlow.performWithFreshTokens(); + OpenAPI.WITH_CREDENTIALS = true; + } + // Initialise the router + this.#redirect(); + } catch (error) { + // If the auth flow fails, there is most likely something wrong with the connection to the backend server + // and we should redirect to the error page + let errorMsg = + 'An error occured while trying to initialise the connection to the Umbraco server (check console for details)'; + + // Get the type of the error and check http status codes + if (error instanceof Error) { + // If the error is a "TypeError" it means that the server is not reachable + if (error.name === 'TypeError') { + errorMsg = 'The Umbraco server is unreachable (check console for details)'; + } + } + + // Log the error + console.error(errorMsg, error); + + // Redirect to the error page + this.#errorPage(errorMsg, error); + } + + // TODO: wrap all debugging logic in a separate class // Listen for the debug event from the component this.addEventListener(umbDebugContextEventType, (event: any) => { // Once we got to the outter most component @@ -90,9 +147,11 @@ export class UmbAppElement extends UmbLitElement { } async #setInitStatus() { - const { data } = await tryExecuteAndNotify(this, ServerResource.getServerStatus()); + const { data, error } = await tryExecute(ServerResource.getServerStatus()); + if (error) { + throw error; + } this.#runtimeLevel = data?.serverStatus ?? RuntimeLevelModel.UNKNOWN; - this.#redirect(); } #redirect() { @@ -105,49 +164,75 @@ export class UmbAppElement extends UmbLitElement { history.replaceState(null, '', 'upgrade'); break; + case RuntimeLevelModel.BOOT_FAILED: + this.#errorPage('The Umbraco server failed to boot'); + break; + case RuntimeLevelModel.RUN: { const pathname = pathWithoutBasePath({ start: true, end: false }); // If we are on the installer or upgrade page, redirect to the root // but if not, keep the current path but replace state anyway to initialize the router - const finalPath = pathname === '/install' || pathname === '/upgrade' ? '/' : location.href; + let currentRoute = location.href; + const savedRoute = sessionStorage.getItem('umb:auth:redirect'); + if (savedRoute) { + sessionStorage.removeItem('umb:auth:redirect'); + currentRoute = savedRoute; + } + const finalPath = pathname === '/install' || pathname === '/upgrade' ? '/' : currentRoute; history.replaceState(null, '', finalPath); break; } default: - throw new Error(`Unsupported runtime level: ${this.#runtimeLevel}`); + // Redirect to the error page + this.#errorPage(`Unsupported runtime level: ${this.#runtimeLevel}`); } } #isAuthorized(): boolean { - return true; // TODO: Return true for now, until new login page is up and running - //return sessionStorage.getItem('is-authenticated') === 'true'; + return this.#isMocking ? true : this.#authFlow.loggedIn(); } - #isAuthorizedGuard(redirectTo?: string): Guard { + #isAuthorizedGuard(): Guard { return () => { if (this.#isAuthorized()) { return true; } - let returnPath = `${OpenAPI.BASE}/umbraco/login`; + // Save location.href so we can redirect to it after login + window.sessionStorage.setItem('umb:auth:redirect', location.href); - if (redirectTo) { - returnPath += `?redirectTo=${redirectTo}`; - } + // Make a request to the auth server to start the auth flow + this.#authFlow.makeAuthorizationRequest(); - // Redirect user completely to login page - location.href = returnPath; + // Return false to prevent the route from being rendered return false; }; } + #errorPage(errorMsg: string, error?: unknown) { + // Redirect to the error page + this._routes = [ + { + path: '**', + component: () => import('./error/error.element'), + setup: (component) => { + (component as UmbErrorElement).errorMessage = errorMsg; + (component as UmbErrorElement).error = error; + }, + }, + ]; + + // Re-render the router + this.requestUpdate(); + } + render() { return html``; } - + static styles = css` :host { overflow: hidden; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts index c08a7c54f0..1f8f5ff006 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/backoffice.element.ts @@ -24,12 +24,11 @@ const CORE_PACKAGES = [ import('./packages/umbraco-package'), import('./search/umbraco-package'), import('./templating/umbraco-package'), + import('./umbraco-news/umbraco-package'), ]; @defineElement('umb-backoffice') export class UmbBackofficeElement extends UmbLitElement { - - constructor() { super(); this.provideContext(UMB_MODAL_CONTEXT_TOKEN, new UmbModalContext(this)); @@ -48,7 +47,7 @@ export class UmbBackofficeElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/manifests.ts index e059b11888..ea839b7115 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/manifests.ts @@ -15,20 +15,6 @@ const dashboards: Array = [ sections: ['Umb.Section.Content'], }, }, - { - type: 'dashboard', - alias: 'Umb.Dashboard.Welcome', - name: 'Welcome Dashboard', - loader: () => import('../../documents/dashboards/welcome/dashboard-welcome.element'), - weight: 20, - meta: { - label: 'Welcome', - pathname: 'welcome', - }, - conditions: { - sections: ['Umb.Section.Content'], - }, - }, ]; export const manifests = [...dashboards]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/welcome/dashboard-welcome.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/welcome/dashboard-welcome.stories.ts deleted file mode 100644 index 20d0abcacb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/welcome/dashboard-welcome.stories.ts +++ /dev/null @@ -1,16 +0,0 @@ -import './dashboard-welcome.element'; - -import { Meta, Story } from '@storybook/web-components'; -import { html } from 'lit'; - -import type { UmbDashboardWelcomeElement } from './dashboard-welcome.element'; - -export default { - title: 'Dashboards/Welcome', - component: 'umb-dashboard-welcome', - id: 'umb-dashboard-welcome', -} as Meta; - -export const AAAOverview: Story = () => - html` `; -AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/workspace/manifests.ts index 50af2c386e..edc306f9d3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/workspace/manifests.ts @@ -1,7 +1,7 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -14,7 +14,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceEditorViews: Array = []; const workspaceActions: Array = []; -export const manifests = [workspace, ...workspaceViews, ...workspaceActions]; +export const manifests = [workspace, ...workspaceEditorViews, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts index f811da6aae..f8a451d8b8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/modals/allowed-document-types/allowed-document-types-modal.element.ts @@ -12,8 +12,6 @@ export class UmbAllowedDocumentTypesModalElement extends UmbModalBaseElement< UmbAllowedDocumentTypesModalData, UmbAllowedDocumentTypesModalResult > { - - #documentTypeRepository = new UmbDocumentTypeRepository(this); @state() @@ -60,7 +58,7 @@ export class UmbAllowedDocumentTypesModalElement extends UmbModalBaseElement< `; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts index 14656bb826..72e2b8d47d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/document-type.repository.ts @@ -3,13 +3,9 @@ import { UmbDocumentTypeServerDataSource } from './sources/document-type.server. import { UmbDocumentTypeTreeStore, UMB_DOCUMENT_TYPE_TREE_STORE_CONTEXT_TOKEN } from './document-type.tree.store'; import { UmbDocumentTypeStore, UMB_DOCUMENT_TYPE_STORE_CONTEXT_TOKEN } from './document-type.store'; import type { UmbTreeDataSource, UmbTreeRepository, UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { - ProblemDetailsModel, - DocumentTypeResponseModel, - FolderTreeItemResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; +import { DocumentTypeResponseModel, FolderTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; type ItemType = DocumentTypeResponseModel; @@ -68,8 +64,7 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, U await this.#init; if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { data: undefined, error }; + throw new Error('Parent id is missing'); } const { data, error } = await this.#treeSource.getChildrenOf(parentId); @@ -85,8 +80,7 @@ export class UmbDocumentTypeRepository implements UmbTreeRepository, U await this.#init; if (!ids) { - const error: ProblemDetailsModel = { title: 'Ids are missing' }; - return { data: undefined, error }; + throw new Error('Ids are missing'); } const { data, error } = await this.#treeSource.getItems(ids); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts index 5915dc9907..f8f99c484a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.server.data.ts @@ -1,10 +1,6 @@ -import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; -import { - DocumentTypeResource, - ProblemDetailsModel, - DocumentTypeResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbDataSource } from '@umbraco-cms/backoffice/repository'; +import { DocumentTypeResource, DocumentTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -13,7 +9,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @class UmbDocumentTypeServerDataSource * @implements {RepositoryDetailDataSource} */ -export class UmbDocumentTypeServerDataSource implements UmbDataSource { +export class UmbDocumentTypeServerDataSource implements UmbDataSource { #host: UmbControllerHostElement; /** @@ -33,8 +29,7 @@ export class UmbDocumentTypeServerDataSource implements UmbDataSource res.json()) ); - */ } /** @@ -166,21 +148,14 @@ export class UmbDocumentTypeServerDataSource implements UmbDataSource res.json()) + ); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.tree.server.data.ts index 33869d807f..93061d3d91 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/repository/sources/document-type.tree.server.data.ts @@ -1,6 +1,6 @@ import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; -import { ProblemDetailsModel, DocumentTypeResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { DocumentTypeResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -67,8 +67,7 @@ export class UmbDocumentTypeTreeServerDataSource implements UmbTreeDataSource { */ async getChildrenOf(parentId: string | null) { if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { error }; + throw new Error('Parent id is missing'); } return tryExecuteAndNotify( @@ -87,8 +86,7 @@ export class UmbDocumentTypeTreeServerDataSource implements UmbTreeDataSource { */ async getItems(ids: Array) { if (ids) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { error }; + throw new Error('Ids are missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-editor.element.ts index 21c13cfe67..5ce19e0fe8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace-editor.element.ts @@ -83,7 +83,7 @@ export class UmbDocumentTypeWorkspaceEditorElement extends UmbLitElement { render() { return html` - + - + `; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts index 9545be917d..778677df4f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbWorkspaceContext } from '../../../shared/components/workspace/workspace-context/workspace-context'; import { UmbDocumentTypeRepository } from '../repository/document-type.repository'; -import { UmbWorkspacePropertyStructureManager } from '../../../shared/components/workspace/workspace-context/workspace-structure-manager.class'; +import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; import { UmbEntityWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; import type { ContentTypeCompositionModel, @@ -23,7 +23,6 @@ export class UmbDocumentTypeWorkspaceContext readonly description; readonly icon; - // TODO: Consider if each of these should go the view it self, but only if its used in that one view, otherwise make then go here. readonly allowedAsRoot; readonly variesByCulture; readonly variesBySegment; @@ -41,7 +40,7 @@ export class UmbDocumentTypeWorkspaceContext constructor(host: UmbControllerHostElement) { super(host, new UmbDocumentTypeRepository(host)); - this.structure = new UmbWorkspacePropertyStructureManager(this.host, this.repository); + this.structure = new UmbContentTypePropertyStructureManager(this.host, this.repository); // General for content types: this.data = this.structure.rootDocumentType; @@ -62,10 +61,6 @@ export class UmbDocumentTypeWorkspaceContext this.cleanup = this.structure.rootDocumentTypeObservablePart((data) => data?.defaultTemplateId); } - public setPropertyValue(alias: string, value: unknown) { - throw new Error('setPropertyValue is not implemented for UmbDocumentTypeWorkspaceContext'); - } - getData() { return this.structure.getRootDocumentType() || {}; } @@ -114,7 +109,6 @@ export class UmbDocumentTypeWorkspaceContext // Document type specific: setAllowedTemplateIds(allowedTemplateIds: Array) { - console.log('setAllowedTemplateIds', allowedTemplateIds); this.structure.updateRootDocumentType({ allowedTemplateIds }); } setDefaultTemplateId(defaultTemplateId: string) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts index a54e6895cd..2493a26cd1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/document-type-workspace.element.ts @@ -3,18 +3,16 @@ import { html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbDocumentTypeWorkspaceContext } from './document-type-workspace.context'; import { UmbDocumentTypeWorkspaceEditorElement } from './document-type-workspace-editor.element'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-document-type-workspace') export class UmbDocumentTypeWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbDocumentTypeWorkspaceContext(this); #element = new UmbDocumentTypeWorkspaceEditorElement(); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'edit/:id', component: () => this.#element, @@ -28,7 +26,7 @@ export class UmbDocumentTypeWorkspaceElement extends UmbLitElement { render() { return html` `; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/manifests.ts index 37e4baa850..7a0b1fa4f7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/manifests.ts @@ -2,7 +2,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -15,9 +15,9 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = [ +const workspaceEditorViews: Array = [ { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.DocumentType.Design', name: 'Document Type Workspace Design View', loader: () => import('./views/design/document-type-workspace-view-edit.element'), @@ -32,7 +32,7 @@ const workspaceViews: Array = [ }, }, { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.DocumentType.Structure', name: 'Document Type Workspace Structure View', loader: () => import('./views/structure/document-type-workspace-view-structure.element'), @@ -47,7 +47,7 @@ const workspaceViews: Array = [ }, }, { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.DocumentType.Permissions', name: 'Document Type Workspace Permissions View', loader: () => import('./views/details/document-type-workspace-view-details.element'), @@ -62,7 +62,7 @@ const workspaceViews: Array = [ }, }, { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.DocumentType.Templates', name: 'Document Type Workspace Templates View', loader: () => import('./views/templates/document-type-workspace-view-templates.element'), @@ -95,4 +95,4 @@ const workspaceActions: Array = [ }, ]; -export const manifests = [workspace, ...workspaceViews, ...workspaceActions]; +export const manifests = [workspace, ...workspaceEditorViews, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts index 10e37d583a..54ca9f9749 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-properties.element.ts @@ -3,13 +3,17 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; import { ifDefined } from 'lit/directives/if-defined.js'; -import { UmbWorkspacePropertyStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-property-structure-helper.class'; -import { PropertyContainerTypes } from '../../../../../shared/components/workspace/workspace-context/workspace-structure-manager.class'; +import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context'; +import { UmbContentTypePropertyStructureHelper, PropertyContainerTypes } from '@umbraco-cms/backoffice/content-type'; import { UmbSorterController, UmbSorterConfig } from '@umbraco-cms/backoffice/sorter'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { DocumentTypePropertyTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { + DocumentTypePropertyTypeResponseModel, + PropertyTypeResponseModelBaseModel, +} from '@umbraco-cms/backoffice/backend-api'; import { UMB_MODAL_CONTEXT_TOKEN, UMB_PROPERTY_SETTINGS_MODAL } from '@umbraco-cms/backoffice/modal'; import './document-type-workspace-view-edit-property.element'; +import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; const SORTER_CONFIG: UmbSorterConfig = { compareElementToModel: (element: HTMLElement, model: DocumentTypePropertyTypeResponseModel) => { @@ -75,16 +79,21 @@ export class UmbDocumentTypeWorkspaceViewEditPropertiesElement extends UmbLitEle this._propertyStructureHelper.setContainerType(value); } - _propertyStructureHelper = new UmbWorkspacePropertyStructureHelper(this); + _propertyStructureHelper = new UmbContentTypePropertyStructureHelper(this); @state() - _propertyStructure: Array = []; + _propertyStructure: Array = []; #modalContext?: typeof UMB_MODAL_CONTEXT_TOKEN.TYPE; constructor() { super(); + this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { + this._propertyStructureHelper.setStructureManager( + (workspaceContext as UmbDocumentTypeWorkspaceContext).structure + ); + }); this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => (this.#modalContext = instance)); this.observe(this._propertyStructureHelper.propertyStructure, (propertyStructure) => { this._propertyStructure = propertyStructure; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts index 2cf704ca93..cf7f2a26d7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit-tab.element.ts @@ -2,15 +2,15 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; -import { UmbWorkspaceContainerStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-container-structure-helper.class'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { PropertyTypeContainerResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import './document-type-workspace-view-edit-properties.element'; +import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context'; @customElement('umb-document-type-workspace-view-edit-tab') export class UmbDocumentTypeWorkspaceViewEditTabElement extends UmbLitElement { - - private _ownerTabId?: string | undefined; @property({ type: String }) @@ -46,7 +46,7 @@ export class UmbDocumentTypeWorkspaceViewEditTabElement extends UmbLitElement { this._groupStructureHelper.setIsRoot(value); } - _groupStructureHelper = new UmbWorkspaceContainerStructureHelper(this); + _groupStructureHelper = new UmbContentTypeContainerStructureHelper(this); @state() _groups: Array = []; @@ -57,6 +57,9 @@ export class UmbDocumentTypeWorkspaceViewEditTabElement extends UmbLitElement { constructor() { super(); + this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (context) => { + this._groupStructureHelper.setStructureManager((context as UmbDocumentTypeWorkspaceContext).structure); + }); this.observe(this._groupStructureHelper.containers, (groups) => { this._groups = groups; }); @@ -95,7 +98,7 @@ export class UmbDocumentTypeWorkspaceViewEditTabElement extends UmbLitElement { Add Group `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts index e819b0cf9d..e2e78545f9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/design/document-type-workspace-view-edit.element.ts @@ -3,23 +3,25 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context'; -import { UmbWorkspaceContainerStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-container-structure-helper.class'; import type { UmbDocumentTypeWorkspaceViewEditTabElement } from './document-type-workspace-view-edit-tab.element'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { PropertyTypeContainerResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-document-type-workspace-view-edit') -export class UmbDocumentTypeWorkspaceViewEditElement extends UmbLitElement { - - +export class UmbDocumentTypeWorkspaceViewEditElement + extends UmbLitElement + implements UmbWorkspaceEditorViewExtensionElement +{ //private _hasRootProperties = false; private _hasRootGroups = false; @state() - private _routes: IRoute[] = []; + private _routes: UmbRoute[] = []; @state() _tabs: Array = []; @@ -32,7 +34,7 @@ export class UmbDocumentTypeWorkspaceViewEditElement extends UmbLitElement { private _workspaceContext?: UmbDocumentTypeWorkspaceContext; - private _tabsStructureHelper = new UmbWorkspaceContainerStructureHelper(this); + private _tabsStructureHelper = new UmbContentTypeContainerStructureHelper(this); constructor() { super(); @@ -48,6 +50,7 @@ export class UmbDocumentTypeWorkspaceViewEditElement extends UmbLitElement { this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { this._workspaceContext = workspaceContext as UmbDocumentTypeWorkspaceContext; + this._tabsStructureHelper.setStructureManager((workspaceContext as UmbDocumentTypeWorkspaceContext).structure); this._observeRootGroups(); }); } @@ -66,7 +69,7 @@ export class UmbDocumentTypeWorkspaceViewEditElement extends UmbLitElement { } private _createRoutes() { - const routes: IRoute[] = []; + const routes: UmbRoute[] = []; if (this._tabs.length > 0) { this._tabs?.forEach((tab) => { @@ -197,7 +200,7 @@ export class UmbDocumentTypeWorkspaceViewEditElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/details/document-type-workspace-view-details.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/details/document-type-workspace-view-details.element.ts index b81255e9c4..49befb5e2e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/details/document-type-workspace-view-details.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/details/document-type-workspace-view-details.element.ts @@ -5,9 +5,13 @@ import type { UUIToggleElement } from '@umbraco-ui/uui'; import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-document-type-workspace-view-details') -export class UmbDocumentTypeWorkspaceViewDetailsElement extends UmbLitElement { +export class UmbDocumentTypeWorkspaceViewDetailsElement + extends UmbLitElement + implements UmbWorkspaceEditorViewExtensionElement +{ #workspaceContext?: UmbDocumentTypeWorkspaceContext; @state() diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts index a5a0e97b64..ae722f1530 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/structure/document-type-workspace-view-structure.element.ts @@ -6,9 +6,13 @@ import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.c import type { UmbInputDocumentTypePickerElement } from '../../../../../../backoffice/shared/components/input-document-type-picker/input-document-type-picker.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-document-type-workspace-view-structure') -export class UmbDocumentTypeWorkspaceViewStructureElement extends UmbLitElement { +export class UmbDocumentTypeWorkspaceViewStructureElement + extends UmbLitElement + implements UmbWorkspaceEditorViewExtensionElement +{ #workspaceContext?: UmbDocumentTypeWorkspaceContext; @state() diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts index 6c549d0db5..ffc8c93c8f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-types/workspace/views/templates/document-type-workspace-view-templates.element.ts @@ -5,9 +5,13 @@ import { UmbDocumentTypeWorkspaceContext } from '../../document-type-workspace.c import type { UmbInputTemplateElement } from '../../../../../../backoffice/shared/components/input-template/input-template.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-document-type-workspace-view-templates') -export class UmbDocumentTypeWorkspaceViewTemplatesElement extends UmbLitElement { +export class UmbDocumentTypeWorkspaceViewTemplatesElement + extends UmbLitElement + implements UmbWorkspaceEditorViewExtensionElement +{ #workspaceContext?: UmbDocumentTypeWorkspaceContext; @state() diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/document-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/document-table-collection-view.element.ts index 4fc874eaf6..e47a509665 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/document-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/collection/views/table/document-table-collection-view.element.ts @@ -1,10 +1,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { - UmbCollectionContext, - UMB_COLLECTION_CONTEXT_TOKEN, -} from '../../../../../shared/collection/collection.context'; + import { UmbTableColumn, UmbTableConfig, @@ -14,6 +11,7 @@ import { UmbTableOrderedEvent, UmbTableSelectedEvent, } from '../../../../../shared/components/table'; +import { UMB_COLLECTION_CONTEXT_TOKEN, UmbCollectionContext } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DocumentTreeItemResponseModel, EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -23,8 +21,6 @@ type EntityType = DocumentTreeItemResponseModel; @customElement('umb-document-table-collection-view') export class UmbDocumentTableCollectionViewElement extends UmbLitElement { - - @state() private _items?: Array; @@ -55,7 +51,7 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { @state() private _selection: Array = []; - private _collectionContext?: UmbCollectionContext; + private _collectionContext?: UmbCollectionContext; constructor() { super(); @@ -68,7 +64,7 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { private _observeCollectionContext() { if (!this._collectionContext) return; - this.observe(this._collectionContext.data, (items) => { + this.observe(this._collectionContext.items, (items) => { this._items = items; this._createTableItems(this._items); }); @@ -134,7 +130,7 @@ export class UmbDocumentTableCollectionViewElement extends UmbLitElement { @ordered="${this._handleOrdering}"> `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.element.ts index 6be6cb96b8..f56e5a3eb6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-picker/document-picker-modal.element.ts @@ -11,6 +11,8 @@ export class UmbDocumentPickerModalElement extends UmbModalBaseElement< UmbDocumentPickerModalData, UmbDocumentPickerModalResult > { + + @state() _selection: Array = []; @@ -40,7 +42,7 @@ export class UmbDocumentPickerModalElement extends UmbModalBaseElement< render() { return html` - +
@@ -54,7 +56,7 @@ export class UmbDocumentPickerModalElement extends UmbModalBaseElement< -
+ `; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-type-picker/document-type-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-type-picker/document-type-picker-modal.element.ts index cfc526eb20..32a32bb1f0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-type-picker/document-type-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/modals/document-type-picker/document-type-picker-modal.element.ts @@ -11,7 +11,7 @@ export class UmbDocumentTypePickerModalElement extends UmbModalBaseElement< UmbDocumentTypePickerModalData, UmbDocumentTypePickerModalResult > { - + @state() _selection: Array = []; @@ -42,7 +42,7 @@ export class UmbDocumentTypePickerModalElement extends UmbModalBaseElement< render() { return html` - +
@@ -56,10 +56,10 @@ export class UmbDocumentTypePickerModalElement extends UmbModalBaseElement< -
+ `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts index cde51f788c..019ee03128 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.repository.ts @@ -6,7 +6,6 @@ import type { UmbTreeDataSource, UmbTreeRepository, UmbDetailRepository } from ' import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { - ProblemDetailsModel, DocumentResponseModel, CreateDocumentRequestModel, UpdateDocumentRequestModel, @@ -69,8 +68,7 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDe await this.#init; if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { data: undefined, error }; + throw new Error('Parent id is missing'); } const { data, error } = await this.#treeSource.getChildrenOf(parentId); @@ -86,8 +84,7 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDe await this.#init; if (!ids) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { data: undefined, error }; + throw new Error('Ids are missing'); } const { data, error } = await this.#treeSource.getItems(ids); @@ -124,9 +121,9 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDe // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } + const { data, error } = await this.#detailDataSource.get(id); if (data) { @@ -136,6 +133,12 @@ export class UmbDocumentRepository implements UmbTreeRepository, UmbDe return { data, error }; } + async byId(id: string) { + if (!id) throw new Error('Id is missing'); + await this.#init; + return this.#store!.byId(id); + } + // Could potentially be general methods: async create(item: CreateDocumentRequestModel & { id: string }) { await this.#init; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts index b1f023bd78..0165c8b111 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/document.store.ts @@ -30,11 +30,11 @@ export class UmbDocumentStore extends UmbStoreBase { } /** - * Append a document to the store - * @param {DocumentModel} document + * Retrieve a document from the store + * @param {string} id * @memberof UmbDocumentStore */ - byKey(id: DocumentResponseModel['id']) { + byId(id: DocumentResponseModel['id']) { return this._data.getObservablePart((x) => x.find((y) => y.id === id)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts index 00aca296d9..cf29bf3fc7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.server.data.ts @@ -1,14 +1,13 @@ -import { v4 as uuidv4 } from 'uuid'; -import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { UmbDataSource } from '@umbraco-cms/backoffice/repository'; import { DocumentResource, - ProblemDetailsModel, DocumentResponseModel, ContentStateModel, CreateDocumentRequestModel, UpdateDocumentRequestModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -18,7 +17,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RepositoryDetailDataSource} */ export class UmbDocumentServerDataSource - implements UmbDataSource + implements UmbDataSource { #host: UmbControllerHostElement; @@ -39,8 +38,7 @@ export class UmbDocumentServerDataSource */ async get(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } return tryExecuteAndNotify( @@ -61,7 +59,7 @@ export class UmbDocumentServerDataSource const data: DocumentResponseModel = { urls: [], templateId: null, - id: uuidv4(), + id: UmbId.new(), contentTypeId: documentTypeId, values: [], variants: [ @@ -113,8 +111,7 @@ export class UmbDocumentServerDataSource */ async trash(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } // TODO: use resources when end point is ready: @@ -138,28 +135,18 @@ export class UmbDocumentServerDataSource */ async delete(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } - let problemDetails: ProblemDetailsModel | undefined = undefined; - - try { - await fetch('/umbraco/management/api/v1/document/trash', { + return tryExecuteAndNotify( + this.#host, + fetch('/umbraco/management/api/v1/document/trash', { method: 'POST', body: JSON.stringify([id]), headers: { 'Content-Type': 'application/json', }, - }); - } catch (error) { - problemDetails = { title: 'Delete document Failed' }; - } - - return { error: problemDetails }; - - /* TODO: use resources when end point is ready: - return tryExecuteAndNotify(this.#host); - */ + }).then((res) => res.json()) + ); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts index 9d09c3bcc3..74320f4691 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/document.tree.server.data.ts @@ -1,6 +1,6 @@ import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; -import { ProblemDetailsModel, DocumentResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { DocumentResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -67,8 +67,7 @@ export class UmbDocumentTreeServerDataSource implements UmbTreeDataSource { */ async getChildrenOf(parentId: string | null) { if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { error }; + throw new Error('Parent id is missing'); } return tryExecuteAndNotify( @@ -87,8 +86,7 @@ export class UmbDocumentTreeServerDataSource implements UmbTreeDataSource { */ async getItems(ids: Array) { if (!ids) { - const error: ProblemDetailsModel = { title: 'Ids are missing' }; - return { error }; + throw new Error('Ids are missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts index 8cbe1ec6d5..b73f71a4a6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/repository/sources/index.ts @@ -1,7 +1,7 @@ import type { DocumentResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbDataSource, DataSourceResponse } from '@umbraco-cms/backoffice/repository'; -export interface UmbDocumentDataSource extends UmbDataSource { +export interface UmbDocumentDataSource extends UmbDataSource { createScaffold(documentTypeKey: string): Promise>; trash(id: string): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.element.ts index ad11c5badb..49619ed1b9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/tree/tree-item/document-tree-item.element.ts @@ -4,11 +4,10 @@ import { customElement, property } from 'lit/decorators.js'; import { UmbDocumentTreeItemContext } from './document-tree-item.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DocumentTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbTreeItemExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-document-tree-item') -export class UmbDocumentTreeItemElement extends UmbLitElement { - - +export class UmbDocumentTreeItemElement extends UmbLitElement implements UmbTreeItemExtensionElement { private _item?: DocumentTreeItemResponseModel; @property({ type: Object, attribute: false }) public get item() { @@ -45,7 +44,7 @@ export class UmbDocumentTreeItemElement extends UmbLitElement { #renderLabel() { return html` ${this.item?.name} `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-editor.element.ts index defdf43afb..952a1ea2ee 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-editor.element.ts @@ -5,7 +5,7 @@ import { UmbVariantId } from '../../../shared/variants/variant-id.class'; import { ActiveVariant } from '../../../shared/components/workspace/workspace-context/workspace-split-view-manager.class'; import { UmbDocumentWorkspaceContext } from './document-workspace.context'; import { UmbDocumentWorkspaceSplitViewElement } from './document-workspace-split-view.element'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import type { UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import '../../../shared/components/workspace/workspace-variant/workspace-variant.element'; @@ -21,7 +21,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { _unique?: string; @state() - _routes?: Array; + _routes?: Array; @state() _availableVariants: Array = []; @@ -67,7 +67,7 @@ export class UmbDocumentWorkspaceEditorElement extends UmbLitElement { if (!this._availableVariants || this._availableVariants.length === 0) return; // Generate split view routes for all available routes - const routes: Array = []; + const routes: Array = []; // Split view routes: this._availableVariants.forEach((variantA) => { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-split-view.element.ts index 1f32d29b73..0d14660b1e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace-split-view.element.ts @@ -53,9 +53,9 @@ export class UmbDocumentWorkspaceSplitViewElement extends UmbLitElement { )} - + - ` + ` : nothing; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts index 3b38145096..7bffb71342 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.context.ts @@ -3,8 +3,8 @@ import { UmbDocumentRepository } from '../repository/document.repository'; import { UmbDocumentTypeRepository } from '../../document-types/repository/document-type.repository'; import { UmbWorkspaceVariableEntityContextInterface } from '../../../shared/components/workspace/workspace-context/workspace-variable-entity-context.interface'; import { UmbVariantId } from '../../../shared/variants/variant-id.class'; -import { UmbWorkspacePropertyStructureManager } from '../../../shared/components/workspace/workspace-context/workspace-structure-manager.class'; import { UmbWorkspaceSplitViewManager } from '../../../shared/components/workspace/workspace-context/workspace-split-view-manager.class'; +import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; import type { CreateDocumentRequestModel, DocumentResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { partialUpdateFrozenArray, @@ -45,7 +45,7 @@ export class UmbDocumentWorkspaceContext constructor(host: UmbControllerHostElement) { super(host, new UmbDocumentRepository(host)); - this.structure = new UmbWorkspacePropertyStructureManager(this.host, new UmbDocumentTypeRepository(this.host)); + this.structure = new UmbContentTypePropertyStructureManager(this.host, new UmbDocumentTypeRepository(this.host)); this.splitView = new UmbWorkspaceSplitViewManager(this.host); new UmbObserverController(this.host, this.documentTypeKey, (id) => this.structure.loadType(id)); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts index bd99def08f..03d21bcd92 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/document-workspace.element.ts @@ -2,7 +2,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbDocumentWorkspaceContext } from './document-workspace.context'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import './document-workspace-editor.element'; @@ -13,7 +13,7 @@ export class UmbDocumentWorkspaceElement extends UmbLitElement { #element = document.createElement('umb-document-workspace-editor'); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'create/:parentId/:documentTypeKey', component: () => this.#element, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/manifests.ts index d8ada1659b..8485aba0df 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/manifests.ts @@ -5,7 +5,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, ManifestWorkspaceViewCollection, } from '@umbraco-cms/backoffice/extensions-registry'; @@ -19,9 +19,9 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = [ +const workspaceEditorViews: Array = [ { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.Document.Edit', name: 'Document Workspace Edit View', loader: () => import('./views/edit/document-workspace-view-edit.element'), @@ -36,7 +36,7 @@ const workspaceViews: Array = [ }, }, { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.Document.Info', name: 'Document Workspace Info View', loader: () => import('./views/info/document-info-workspace-view.element'), @@ -132,4 +132,4 @@ const workspaceActions: Array = [ }, ]; -export const manifests = [workspace, ...workspaceViews, ...workspaceViewCollections, ...workspaceActions]; +export const manifests = [workspace, ...workspaceEditorViews, ...workspaceViewCollections, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts index 3044e047a4..68225c6b09 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-properties.element.ts @@ -2,15 +2,14 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; -import { UmbWorkspacePropertyStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-property-structure-helper.class'; -import { PropertyContainerTypes } from '../../../../../shared/components/workspace/workspace-context/workspace-structure-manager.class'; +import { UmbDocumentWorkspaceContext } from '../../document-workspace.context'; +import { UmbContentTypePropertyStructureHelper, PropertyContainerTypes } from '@umbraco-cms/backoffice/content-type'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { DocumentTypePropertyTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { PropertyTypeResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @customElement('umb-document-workspace-view-edit-properties') export class UmbDocumentWorkspaceViewEditPropertiesElement extends UmbLitElement { - - @property({ type: String, attribute: 'container-name', reflect: false }) public get containerName(): string | undefined { return this._propertyStructureHelper.getContainerName(); @@ -27,14 +26,17 @@ export class UmbDocumentWorkspaceViewEditPropertiesElement extends UmbLitElement this._propertyStructureHelper.setContainerType(value); } - _propertyStructureHelper = new UmbWorkspacePropertyStructureHelper(this); + _propertyStructureHelper = new UmbContentTypePropertyStructureHelper(this); @state() - _propertyStructure: Array = []; + _propertyStructure: Array = []; constructor() { super(); + this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { + this._propertyStructureHelper.setStructureManager((workspaceContext as UmbDocumentWorkspaceContext).structure); + }); this.observe(this._propertyStructureHelper.propertyStructure, (propertyStructure) => { this._propertyStructure = propertyStructure; }); @@ -47,7 +49,7 @@ export class UmbDocumentWorkspaceViewEditPropertiesElement extends UmbLitElement (property) => html` ` ); } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts index fd407b65d5..721c251f8e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit-tab.element.ts @@ -2,15 +2,15 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; -import { UmbWorkspaceContainerStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-container-structure-helper.class'; +import { UmbDocumentWorkspaceContext } from '../../document-workspace.context'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { PropertyTypeContainerResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import './document-workspace-view-edit-properties.element'; +import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @customElement('umb-document-workspace-view-edit-tab') export class UmbDocumentWorkspaceViewEditTabElement extends UmbLitElement { - - private _tabName?: string | undefined; @property({ type: String }) @@ -33,7 +33,7 @@ export class UmbDocumentWorkspaceViewEditTabElement extends UmbLitElement { this._groupStructureHelper.setIsRoot(value); } - _groupStructureHelper = new UmbWorkspaceContainerStructureHelper(this); + _groupStructureHelper = new UmbContentTypeContainerStructureHelper(this); @state() _groups: Array = []; @@ -44,6 +44,9 @@ export class UmbDocumentWorkspaceViewEditTabElement extends UmbLitElement { constructor() { super(); + this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { + this._groupStructureHelper.setStructureManager((workspaceContext as UmbDocumentWorkspaceContext).structure); + }); this.observe(this._groupStructureHelper.containers, (groups) => { this._groups = groups; }); @@ -74,7 +77,7 @@ export class UmbDocumentWorkspaceViewEditTabElement extends UmbLitElement { )} `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts index c885e6df46..1ad1609158 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/documents/workspace/views/edit/document-workspace-view-edit.element.ts @@ -3,22 +3,24 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; import { UmbDocumentWorkspaceContext } from '../../document-workspace.context'; -import { UmbWorkspaceContainerStructureHelper } from '../../../../../shared/components/workspace/workspace-context/workspace-container-structure-helper.class'; +import { UmbContentTypeContainerStructureHelper } from '@umbraco-cms/backoffice/content-type'; import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { PropertyTypeContainerResponseModelBaseModel } from '@umbraco-cms/backoffice/backend-api'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; -import { IRoute } from '@umbraco-cms/backoffice/router'; +import { UmbRoute } from '@umbraco-cms/backoffice/router'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-document-workspace-view-edit') -export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement { - - +export class UmbDocumentWorkspaceViewEditElement + extends UmbLitElement + implements UmbWorkspaceEditorViewExtensionElement +{ //private _hasRootProperties = false; private _hasRootGroups = false; @state() - private _routes: IRoute[] = []; + private _routes: UmbRoute[] = []; @state() _tabs: Array = []; @@ -31,7 +33,7 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement { private _workspaceContext?: UmbDocumentWorkspaceContext; - private _tabsStructureHelper = new UmbWorkspaceContainerStructureHelper(this); + private _tabsStructureHelper = new UmbContentTypeContainerStructureHelper(this); constructor() { super(); @@ -47,6 +49,7 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement { this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { this._workspaceContext = workspaceContext as UmbDocumentWorkspaceContext; + this._tabsStructureHelper.setStructureManager((workspaceContext as UmbDocumentWorkspaceContext).structure); this._observeRootGroups(); }); } @@ -65,7 +68,7 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement { } private _createRoutes() { - const routes: IRoute[] = []; + const routes: UmbRoute[] = []; if (this._tabs.length > 0) { this._tabs?.forEach((tab) => { @@ -139,7 +142,7 @@ export class UmbDocumentWorkspaceViewEditElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/umbraco-package.ts index af3c9d6830..5fd6d00768 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/umbraco-package.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/umbraco-package.ts @@ -1,5 +1,4 @@ export const name = 'Umbraco.Core.DocumentManagement'; -export const version = '0.0.1'; export const extensions = [ { name: 'Document Management Entry Point', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts index 32fdedecbd..16b649f19b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts @@ -2,7 +2,6 @@ import { UmbMediaTypeTreeStore, UMB_MEDIA_TYPE_TREE_STORE_CONTEXT_TOKEN } from ' import { UmbMediaTypeDetailServerDataSource } from './sources/media-type.detail.server.data'; import { UmbMediaTypeStore, UMB_MEDIA_TYPE_STORE_CONTEXT_TOKEN } from './media-type.detail.store'; import { UmbMediaTypeTreeServerDataSource } from './sources/media-type.tree.server.data'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; @@ -60,8 +59,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { await this.#init; if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { data: undefined, error }; + throw new Error('Parent id is missing'); } const { data, error } = await this.#treeSource.getChildrenOf(parentId); @@ -77,8 +75,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { await this.#init; if (!ids) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { data: undefined, error }; + throw new Error('Ids are missing'); } const { data, error } = await this.#treeSource.getItems(ids); @@ -114,8 +111,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? if (!id) { - const error: ProblemDetailsModel = { title: 'Id is missing' }; - return { error }; + throw new Error('Id is missing'); } const { data, error } = await this.#detailSource.get(id); @@ -136,8 +132,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { // TODO: should we show a notification if the media type is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? if (!mediaType || !mediaType.id) { - const error: ProblemDetailsModel = { title: 'Media Type is missing' }; - return { error }; + throw new Error('Media type is missing'); } const { error } = await this.#detailSource.update(mediaType); @@ -161,8 +156,7 @@ export class UmbMediaTypeRepository implements UmbTreeRepository { await this.#init; if (!mediaType.name) { - const error: ProblemDetailsModel = { title: 'Name is missing' }; - return { error }; + throw new Error('Name is missing'); } const { data, error } = await this.#detailSource.insert(mediaType); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts index 701b0dcf21..c305dde0c0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts @@ -1,6 +1,5 @@ import { MediaTypeDetailDataSource } from './media-type.details.server.data.interface'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -50,8 +49,7 @@ export class UmbMediaTypeDetailServerDataSource implements MediaTypeDetailDataSo */ async update(mediaType: MediaTypeDetails) { if (!mediaType.id) { - const error: ProblemDetailsModel = { title: 'MediaType id is missing' }; - return { error }; + throw new Error('MediaType id is missing'); } const payload = { id: mediaType.id, requestBody: mediaType }; @@ -99,8 +97,7 @@ export class UmbMediaTypeDetailServerDataSource implements MediaTypeDetailDataSo */ async delete(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } //return await tryExecuteAndNotify(this.#host, MediaTypeResource.deleteMediaTypeByKey({ id })); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts index 12401f3fe9..f1b9e18602 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.tree.server.data.ts @@ -1,6 +1,6 @@ -import { MediaTypeResource, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { MediaTypeResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -38,8 +38,7 @@ export class UmbMediaTypeTreeServerDataSource implements UmbTreeDataSource { */ async getChildrenOf(parentId: string | null) { if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { error }; + throw new Error('Parent id is missing'); } return tryExecuteAndNotify( @@ -58,8 +57,7 @@ export class UmbMediaTypeTreeServerDataSource implements UmbTreeDataSource { */ async getItems(ids: Array) { if (!ids || ids.length === 0) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { error }; + throw new Error('Keys are missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/manifests.ts index b7965aad4b..db7109282b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/manifests.ts @@ -1,7 +1,7 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, ManifestWorkspaceViewCollection, } from '@umbraco-cms/backoffice/extensions-registry'; @@ -15,7 +15,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceViewCollections: Array = []; const workspaceActions: Array = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace-edit.element.ts index efdec63f87..dc73cab408 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace-edit.element.ts @@ -8,7 +8,7 @@ import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-ap @customElement('umb-media-type-workspace-edit') export class UmbMediaTypeWorkspaceEditElement extends UmbLitElement { - + @state() private _mediaTypeName?: string | null = ''; @@ -42,11 +42,11 @@ export class UmbMediaTypeWorkspaceEditElement extends UmbLitElement { } render() { - return html` + return html` - `; + `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.element.ts index f2aa3bd13f..e21d13517b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.element.ts @@ -4,17 +4,15 @@ import { customElement, state } from 'lit/decorators.js'; import { UmbWorkspaceMediaTypeContext } from './media-type-workspace.context'; import { UmbMediaTypeWorkspaceEditElement } from './media-type-workspace-edit.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; @customElement('umb-media-type-workspace') export class UmbMediaTypeWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbWorkspaceMediaTypeContext(this); #element = new UmbMediaTypeWorkspaceEditElement(); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'edit/:id', component: () => this.#element, @@ -28,7 +26,7 @@ export class UmbMediaTypeWorkspaceElement extends UmbLitElement { render() { return html``; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/collection-view-media-test.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/collection-view-media-test.element.ts index 66d295d385..fcc03093c9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/collection-view-media-test.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/collection-view-media-test.element.ts @@ -4,12 +4,12 @@ import { customElement } from 'lit/decorators.js'; @customElement('umb-collection-view-media-test') export class UmbCollectionViewMediaTestElement extends LitElement { - + render() { return html`umb-collection-view-media-test`; } - + static styles = [UUITextStyles, css``]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-grid-collection-view.element.ts index 889e595f7d..157daab33e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-grid-collection-view.element.ts @@ -2,22 +2,19 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; -import { UmbCollectionContext, UMB_COLLECTION_CONTEXT_TOKEN } from '../../../shared/collection/collection.context'; +import { UmbCollectionContext, UMB_COLLECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -// TODO: this should be a lib import @customElement('umb-media-grid-collection-view') export class UmbMediaGridCollectionViewElement extends UmbLitElement { - - @state() private _mediaItems?: Array; @state() private _selection: Array = []; - private _collectionContext?: UmbCollectionContext; + private _collectionContext?: UmbCollectionContext; constructor() { super(); @@ -53,7 +50,7 @@ export class UmbMediaGridCollectionViewElement extends UmbLitElement { private _observeCollectionContext() { if (!this._collectionContext) return; - this.observe(this._collectionContext.data, (mediaItems) => { + this.observe(this._collectionContext.items, (mediaItems) => { this._mediaItems = [...mediaItems].sort((a, b) => (a.hasChildren === b.hasChildren ? 0 : a ? -1 : 1)); }); @@ -120,7 +117,7 @@ export class UmbMediaGridCollectionViewElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-table-collection-view.element.ts index 31d502c771..f51dd0cfbb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/collection-view/media-table-collection-view.element.ts @@ -11,14 +11,12 @@ import type { UmbTableSelectedEvent, } from '../../../shared/components/table'; import type { MediaDetails } from '../'; -import { UmbCollectionContext, UMB_COLLECTION_CONTEXT_TOKEN } from '../../../shared/collection/collection.context'; +import { UmbCollectionContext, UMB_COLLECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-media-table-collection-view') export class UmbMediaTableCollectionViewElement extends UmbLitElement { - - @state() private _mediaItems?: Array; @@ -41,7 +39,7 @@ export class UmbMediaTableCollectionViewElement extends UmbLitElement { @state() private _selection: Array = []; - private _collectionContext?: UmbCollectionContext; + private _collectionContext?: UmbCollectionContext; constructor() { super(); @@ -54,7 +52,7 @@ export class UmbMediaTableCollectionViewElement extends UmbLitElement { private _observeCollectionContext() { if (!this._collectionContext) return; - this.observe(this._collectionContext.data, (nodes) => { + this.observe(this._collectionContext.items, (nodes) => { this._mediaItems = nodes; this._createTableItems(this._mediaItems); }); @@ -114,7 +112,7 @@ export class UmbMediaTableCollectionViewElement extends UmbLitElement { @ordered="${this._handleOrdering}"> `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/modals/media-picker/media-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/modals/media-picker/media-picker-modal.element.ts index bd9655512c..3cac92aec2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/modals/media-picker/media-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/modals/media-picker/media-picker-modal.element.ts @@ -10,7 +10,7 @@ export class UmbMediaPickerModalElement extends UmbModalBaseElement< UmbMediaPickerModalData, UmbMediaPickerModalResult > { - + @state() _selection: Array = []; @@ -41,7 +41,7 @@ export class UmbMediaPickerModalElement extends UmbModalBaseElement< render() { return html` - +
@@ -55,10 +55,10 @@ export class UmbMediaPickerModalElement extends UmbModalBaseElement< -
+ `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts index 0e0587fa40..4440fe2046 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.repository.ts @@ -6,11 +6,7 @@ import { UmbMediaDetailServerDataSource } from './sources/media.detail.server.da import type { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { - CreateMediaRequestModel, - ProblemDetailsModel, - UpdateMediaRequestModel, -} from '@umbraco-cms/backoffice/backend-api'; +import { CreateMediaRequestModel, UpdateMediaRequestModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; @@ -83,8 +79,7 @@ export class UmbMediaRepository await this.#init; if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { data: undefined, error }; + throw new Error('Parent id is missing'); } const { data, error } = await this.#treeSource.getChildrenOf(parentId); @@ -100,8 +95,7 @@ export class UmbMediaRepository await this.#init; if (!ids) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { data: undefined, error }; + throw new Error('Ids are missing'); } const { data, error } = await this.#treeSource.getItems(ids); @@ -145,6 +139,12 @@ export class UmbMediaRepository return { data, error }; } + async byId(id: string) { + if (!id) throw new Error('Id is missing'); + await this.#init; + return this.#store!.byId(id); + } + // Could potentially be general methods: async create(media: CreateMediaRequestModel) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts index ba59e42ce4..36947597ec 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/media.store.ts @@ -29,6 +29,15 @@ export class UmbMediaStore extends UmbStoreBase { this._data.append([media]); } + /** + * Retrieve a media from the store + * @param {string} id + * @memberof UmbMediaStore + */ + byId(id: MediaDetails['id']) { + return this._data.getObservablePart((x) => x.find((y) => y.id === id)); + } + /** * Removes media in the store with the given uniques * @param {string[]} uniques diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts index 797329b01a..c6618f5c5f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.detail.server.data.ts @@ -1,11 +1,7 @@ import type { MediaDetails } from '../../'; -import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; -import { - CreateMediaRequestModel, - ProblemDetailsModel, - UpdateMediaRequestModel, -} from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbDataSource } from '@umbraco-cms/backoffice/repository'; +import { CreateMediaRequestModel, UpdateMediaRequestModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -15,7 +11,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {TemplateDetailDataSource} */ export class UmbMediaDetailServerDataSource - implements UmbDataSource + implements UmbDataSource { #host: UmbControllerHostElement; @@ -36,8 +32,7 @@ export class UmbMediaDetailServerDataSource */ async get(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } return tryExecuteAndNotify( @@ -96,7 +91,7 @@ export class UmbMediaDetailServerDataSource headers: { 'Content-Type': 'application/json', }, - }) as any + }).then((res) => res.json()) ); } @@ -111,14 +106,7 @@ export class UmbMediaDetailServerDataSource if (!id) throw new Error('Key is missing'); if (!media) throw new Error('Media is missing'); - let body: string; - - try { - body = JSON.stringify(media); - } catch (error) { - const myError: ProblemDetailsModel = { title: 'JSON could not parse' }; - return { error: myError }; - } + const body = JSON.stringify(media); return tryExecuteAndNotify( this.#host, @@ -128,7 +116,7 @@ export class UmbMediaDetailServerDataSource headers: { 'Content-Type': 'application/json', }, - }) as any + }).then((res) => res.json()) ); } @@ -140,8 +128,7 @@ export class UmbMediaDetailServerDataSource */ async trash(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } return tryExecuteAndNotify( @@ -152,7 +139,7 @@ export class UmbMediaDetailServerDataSource headers: { 'Content-Type': 'application/json', }, - }) as any + }).then((res) => res.json()) ); } @@ -164,28 +151,18 @@ export class UmbMediaDetailServerDataSource */ async delete(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Key is missing'); } - let problemDetails: ProblemDetailsModel | undefined = undefined; - - try { - await fetch('/umbraco/management/api/v1/media/delete', { + return tryExecuteAndNotify( + this.#host, + fetch('/umbraco/management/api/v1/media/delete', { method: 'POST', body: JSON.stringify([id]), headers: { 'Content-Type': 'application/json', }, - }); - } catch (error) { - problemDetails = { title: 'Delete document Failed' }; - } - - return { error: problemDetails }; - - /* TODO: use backend cli when available. - return tryExecuteAndNotify(this.#host); - */ + }).then((res) => res.json()) + ); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.tree.server.data.ts index ee50c0ce1d..c13e0effc8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/repository/sources/media.tree.server.data.ts @@ -1,6 +1,6 @@ import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; -import { ProblemDetailsModel, MediaResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { MediaResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -67,8 +67,7 @@ export class UmbMediaTreeServerDataSource implements UmbTreeDataSource { */ async getChildrenOf(parentId: string | null) { if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { error }; + throw new Error('Parent id is missing'); } return tryExecuteAndNotify( @@ -87,8 +86,7 @@ export class UmbMediaTreeServerDataSource implements UmbTreeDataSource { */ async getItems(ids: Array) { if (!ids) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { error }; + throw new Error('Ids are missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/manifests.ts index 7dbf6b198f..40a369f34f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/manifests.ts @@ -3,7 +3,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, ManifestWorkspaceViewCollection, } from '@umbraco-cms/backoffice/extensions-registry'; @@ -17,9 +17,9 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = [ +const workspaceEditorViews: Array = [ { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.Media.Edit', name: 'Media Workspace Edit View', loader: () => import('./views/edit/media-edit-workspace-view.element'), @@ -34,7 +34,7 @@ const workspaceViews: Array = [ }, }, { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.Media.Info', name: 'Media Workspace Info View', loader: () => import('./views/info/media-info-workspace-view.element'), @@ -86,4 +86,4 @@ const workspaceActions: Array = [ }, ]; -export const manifests = [workspace, ...workspaceViews, ...workspaceViewCollections, ...workspaceActions]; +export const manifests = [workspace, ...workspaceEditorViews, ...workspaceViewCollections, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace-edit.element.ts index 651454dd8f..3aae72d902 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace-edit.element.ts @@ -7,7 +7,7 @@ import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-ap @customElement('umb-media-workspace-edit') export class UmbMediaWorkspaceEditElement extends UmbLitElement { - + @state() _id?: string; @@ -30,15 +30,15 @@ export class UmbMediaWorkspaceEditElement extends UmbLitElement { render() { if (!this._id) return nothing; - return html` + return html` - `; + `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.element.ts index a3488970c2..58ec3bbcef 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/media-workspace.element.ts @@ -3,18 +3,16 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbMediaWorkspaceContext } from './media-workspace.context'; import { UmbMediaWorkspaceEditElement } from './media-workspace-edit.element'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-media-workspace') export class UmbMediaWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbMediaWorkspaceContext(this); #element = new UmbMediaWorkspaceEditElement(); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'edit/:id', component: () => this.#element, @@ -28,7 +26,7 @@ export class UmbMediaWorkspaceElement extends UmbLitElement { render() { return html``; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/views/edit/media-edit-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/views/edit/media-edit-workspace-view.element.ts index 3820549b09..fd4aefb04a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/views/edit/media-edit-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/views/edit/media-edit-workspace-view.element.ts @@ -2,15 +2,14 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement } from 'lit/decorators.js'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-media-edit-workspace-view') -export class UmbMediaEditWorkspaceViewElement extends UmbLitElement { - - +export class UmbMediaEditWorkspaceViewElement extends UmbLitElement implements UmbWorkspaceEditorViewExtensionElement { render() { return html`
Render Media Props
`; } - + static styles = [UUITextStyles, css``]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/views/info/media-info-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/views/info/media-info-workspace-view.element.ts index 274418a635..1f803bdc26 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/views/info/media-info-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media/workspace/views/info/media-info-workspace-view.element.ts @@ -2,15 +2,14 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement } from 'lit/decorators.js'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-media-info-workspace-view') -export class UmbMediaInfoWorkspaceViewElement extends UmbLitElement { - - +export class UmbMediaInfoWorkspaceViewElement extends UmbLitElement implements UmbWorkspaceEditorViewExtensionElement { render() { return html`
Media info
`; } - + static styles = [UUITextStyles, css``]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/umbraco-package.ts index f60335274e..995dea659a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/umbraco-package.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/umbraco-package.ts @@ -1,5 +1,4 @@ export const name = 'Umbraco.Core.MediaManagement'; -export const version = '0.0.1'; export const extensions = [ { name: 'Media Management Entry Point', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts index a405678c1a..fec1899830 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts @@ -2,11 +2,10 @@ import { UmbMemberGroupTreeStore, UMB_MEMBER_GROUP_TREE_STORE_CONTEXT_TOKEN } fr import { UmbMemberGroupDetailServerDataSource } from './sources/member-group.detail.server.data'; import { UmbMemberGroupStore, UMB_MEMBER_GROUP_STORE_CONTEXT_TOKEN } from './member-group.store'; import { UmbMemberGroupTreeServerDataSource } from './sources/member-group.tree.server.data'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; import type { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; // TODO => Update type when backend updated @@ -55,16 +54,14 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep } async requestTreeItemsOf(parentId: string | null) { - const error: ProblemDetailsModel = { title: 'Not implemented' }; - return { data: undefined, error }; + return { data: undefined, error: { title: 'Not implemented', message: 'Not implemented' } }; } async requestItemsLegacy(ids: Array) { await this.#init; if (!ids) { - const error: ProblemDetailsModel = { title: 'Ids are missing' }; - return { data: undefined, error }; + throw new Error('Ids are missing'); } const { data, error } = await this.#treeSource.getItems(ids); @@ -100,8 +97,7 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? if (!id) { - const error: ProblemDetailsModel = { title: 'Id is missing' }; - return { error }; + throw new Error('Id is missing'); } const { data, error } = await this.#detailSource.get(id); @@ -111,12 +107,17 @@ export class UmbMemberGroupRepository implements UmbTreeRepository, UmbDetailRep return { data, error }; } + async byId(id: string) { + if (!id) throw new Error('Id is missing'); + await this.#init; + return this.#store!.byId(id); + } + async create(detail: MemberGroupDetails) { await this.#init; if (!detail.name) { - const error: ProblemDetailsModel = { title: 'Name is missing' }; - return { error }; + throw new Error('Name is missing'); } const { data, error } = await this.#detailSource.insert(detail); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts index e379594fa5..f5175b7168 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts @@ -25,6 +25,15 @@ export class UmbMemberGroupStore extends UmbStoreBase { this._data.append([memberGroup]); } + /** + * Retrieve a member from the store + * @param {string} id + * @memberof UmbMemberGroupStore + */ + byId(id: MemberGroupDetails['id']) { + return this._data.getObservablePart((x) => x.find((y) => y.id === id)); + } + remove(uniques: string[]) { this._data.remove(uniques); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts index 11503e3873..89c7ee4775 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts @@ -1,6 +1,5 @@ -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; @@ -11,7 +10,7 @@ import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; * @implements {MemberGroupDetailDataSource} */ // TODO => Provide type when it is available -export class UmbMemberGroupDetailServerDataSource implements UmbDataSource { +export class UmbMemberGroupDetailServerDataSource implements UmbDataSource { #host: UmbControllerHostElement; constructor(host: UmbControllerHostElement) { @@ -51,8 +50,7 @@ export class UmbMemberGroupDetailServerDataSource implements UmbDataSource) { if (!ids || ids.length === 0) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { error }; + throw new Error('Ids are missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/manifests.ts index 05b69158ab..05584b89d8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/manifests.ts @@ -2,7 +2,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -15,9 +15,9 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = [ +const workspaceViews: Array = [ { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.MemberGroup.Info', name: 'Member Group Workspace Info View', loader: () => import('./views/info/workspace-view-member-group-info.element'), diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace-edit.element.ts index acbebc3a5b..1d87666038 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace-edit.element.ts @@ -13,7 +13,7 @@ import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-ap */ @customElement('umb-member-group-workspace-edit') export class UmbMemberGroupWorkspaceEditElement extends UmbLitElement { - + #workspaceContext?: UmbWorkspaceMemberGroupContext; @@ -46,13 +46,13 @@ export class UmbMemberGroupWorkspaceEditElement extends UmbLitElement { } render() { - return html` + return html` - `; + `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.element.ts index 9a98c2a50b..0b89249f04 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.element.ts @@ -3,7 +3,7 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbWorkspaceMemberGroupContext } from './member-group-workspace.context'; import { UmbMemberGroupWorkspaceEditElement } from './member-group-workspace-edit.element'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** @@ -12,13 +12,11 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; */ @customElement('umb-member-group-workspace') export class UmbMemberGroupWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbWorkspaceMemberGroupContext(this); #element = new UmbMemberGroupWorkspaceEditElement(); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'edit/:id', component: () => this.#element, @@ -32,7 +30,7 @@ export class UmbMemberGroupWorkspaceElement extends UmbLitElement { render() { return html` `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts index 960be5ef86..3129798500 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts @@ -5,7 +5,6 @@ import { UmbMemberTypeDetailServerDataSource } from './sources/member-type.detai import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import type { MemberTypeDetails } from '@umbraco-cms/backoffice/models'; @@ -64,8 +63,7 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, await this.#init; if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { data: undefined, error }; + throw new Error('Parent id is missing'); } const { data, error } = await this.#treeSource.getChildrenOf(parentId); @@ -81,8 +79,7 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, await this.#init; if (!ids) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { data: undefined, error }; + throw new Error('Ids are missing'); } const { data, error } = await this.#treeSource.getItems(ids); @@ -118,8 +115,7 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } const { data, error } = await this.#detailSource.requestById(id); @@ -128,13 +124,17 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, } return { data, error }; } + async byId(id: string) { + if (!id) throw new Error('Id is missing'); + await this.#init; + return this.#store!.byId(id); + } async delete(id: string) { await this.#init; if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } const { error } = await this.#detailSource.delete(id); @@ -160,7 +160,7 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, await this.#init; - const { error } = await this.#detailSource.save(id, updatedMemberType); + const { error } = await this.#detailSource.update(id, updatedMemberType); if (!error) { // TODO: we currently don't use the detail store for anything. @@ -181,11 +181,10 @@ export class UmbMemberTypeRepository implements UmbTreeRepository, await this.#init; if (!detail.name) { - const error: ProblemDetailsModel = { title: 'Name is missing' }; - return { error }; + throw new Error('Name is missing'); } - const { data, error } = await this.#detailSource.create(detail); + const { data, error } = await this.#detailSource.insert(detail); if (!error) { const notification = { data: { message: `Member type '${detail.name}' created` } }; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts index 5dca6dd718..6c7e895e6a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts @@ -19,6 +19,15 @@ export class UmbMemberTypeStore extends UmbStoreBase { this._data.append([MemberType]); } + /** + * Retrieve a member type from the store + * @param {string} id + * @memberof UmbMemberTypeStore + */ + byId(id: MemberTypeDetails['id']) { + return this._data.getObservablePart((x) => x.find((y) => y.id === id)); + } + remove(uniques: string[]) { this._data.remove(uniques); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts index ab8466c03c..2359904e2e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts @@ -1,8 +1,7 @@ -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; import type { MemberTypeDetails } from '@umbraco-cms/backoffice/models'; -import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; +import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; /** * @description - A data source for the MemberType detail that fetches data from the server @@ -10,13 +9,37 @@ import { UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; * @class UmbMemberTypeDetailServerDataSource * @implements {MemberTypeDetailDataSource} */ -export class UmbMemberTypeDetailServerDataSource implements UmbDetailRepository { +export class UmbMemberTypeDetailServerDataSource implements UmbDataSource { #host: UmbControllerHostElement; constructor(host: UmbControllerHostElement) { this.#host = host; } + /** + * Fetches a Member Type with the given id from the server + * @param {string} id + * @return {*} + * @memberof UmbMediaDetailServerDataSource + */ + async get(id: string) { + if (!id) { + throw new Error('Id is missing'); + } + + return tryExecuteAndNotify(this.#host, fetch(`/umbraco/management/api/v1/member-group/${id}`)) as any; + + /* + return tryExecuteAndNotify( + this.#host, + // TODO: use backend cli when available. + fetch(`/umbraco/management/api/v1/member-group/details/${id}`) + .then((res) => res.json()) + .then((res) => res[0] || undefined) + ); + */ + } + /** * @description - Creates a new MemberType scaffold * @return {*} @@ -45,7 +68,7 @@ export class UmbMemberTypeDetailServerDataSource implements UmbDetailRepository< * @return {*} * @memberof UmbMemberTypeDetailServerDataSource */ - async save(id: string, memberType: any) { + async update(id: string, memberType: any) { if (!id) throw new Error('Member Type id is missing'); const payload = { id: memberType.id, requestBody: memberType }; @@ -70,7 +93,7 @@ export class UmbMemberTypeDetailServerDataSource implements UmbDetailRepository< * @return {*} * @memberof UmbMemberTypeDetailServerDataSource */ - async create(data: MemberTypeDetails) { + async insert(data: MemberTypeDetails) { const requestBody = { name: data.name, }; @@ -97,8 +120,7 @@ export class UmbMemberTypeDetailServerDataSource implements UmbDetailRepository< */ async delete(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } //return await tryExecuteAndNotify(this.#host, MemberTypeResource.deleteMemberTypeByKey({ id })); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts index 40c09a25fc..f5e135b31b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.tree.server.data.ts @@ -1,6 +1,6 @@ -import { MemberTypeResource, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { ApiError, MemberTypeResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -37,8 +37,11 @@ export class UmbMemberTypeTreeServerDataSource implements UmbTreeDataSource { * @memberof UmbMemberTypeTreeServerDataSource */ async getChildrenOf(parentId: string | null) { - const error: ProblemDetailsModel = { title: 'Not implemented for Member Type' }; - return { error }; + if (!parentId) { + throw new Error('Parent id is missing'); + } + + return { error: new ApiError({} as any, {} as any, 'Not implemented for Member Type') }; } /** @@ -49,8 +52,7 @@ export class UmbMemberTypeTreeServerDataSource implements UmbTreeDataSource { */ async getItems(ids: Array) { if (!ids || ids.length === 0) { - const error: ProblemDetailsModel = { title: 'Ids are missing' }; - return { error }; + throw new Error('Ids are missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/manifests.ts index 7eb06e2bf4..e0b60ac3d9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/manifests.ts @@ -1,7 +1,7 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -14,7 +14,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceActions: Array = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace-edit.element.ts index 5d7d195fb6..88747c5a85 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace-edit.element.ts @@ -5,14 +5,14 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-member-type-workspace-edit') export class UmbMemberTypeWorkspaceEditElement extends UmbLitElement { - + render() { return html` - Member Type Workspace + Member Type Workspace `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.element.ts index 19a4fd8682..b860c5ad53 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/workspace/member-type-workspace.element.ts @@ -3,18 +3,16 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbMemberTypeWorkspaceEditElement } from './member-type-workspace-edit.element'; import { UmbMemberTypeWorkspaceContext } from './member-type-workspace.context'; -import { IRoute } from '@umbraco-cms/backoffice/router'; +import { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-member-type-workspace') export class UmbMemberTypeWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbMemberTypeWorkspaceContext(this); #element = new UmbMemberTypeWorkspaceEditElement(); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'edit/:id', component: () => this.#element, @@ -28,7 +26,7 @@ export class UmbMemberTypeWorkspaceElement extends UmbLitElement { render() { return html` `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts index e5020375a1..9f20156cc8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.repository.ts @@ -1,10 +1,9 @@ import { UmbMemberTreeStore, UMB_MEMBER_TREE_STORE_CONTEXT_TOKEN } from './member.tree.store'; import { UmbMemberTreeServerDataSource } from './sources/member.tree.server.data'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; -import { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; export class UmbMemberRepository implements UmbTreeRepository { #host: UmbControllerHostElement; @@ -54,16 +53,14 @@ export class UmbMemberRepository implements UmbTreeRepository { } async requestTreeItemsOf(parentId: string | null) { - const error: ProblemDetailsModel = { title: 'Not implemented' }; - return { data: undefined, error }; + return { data: undefined, error: { title: 'Not implemented', message: 'Not implemented' } }; } async requestItemsLegacy(ids: Array) { await this.#init; if (!ids) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { data: undefined, error }; + throw new Error('Ids are missing'); } const { data, error } = await this.#dataSource.getItems(ids); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/manifests.ts index a2e1875688..4e089b96f4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/manifests.ts @@ -1,7 +1,7 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -14,7 +14,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceActions: Array = []; export const manifests = [workspace, ...workspaceViews, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace-edit.element.ts index 6e21c30ca6..99e31b5151 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace-edit.element.ts @@ -4,12 +4,12 @@ import { customElement } from 'lit/decorators.js'; @customElement('umb-member-workspace-edit') export class UmbMemberWorkspaceEditElement extends LitElement { - + render() { - return html` Member Workspace `; + return html` Member Workspace `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.element.ts index 8747bc587b..5e4bec6ebe 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.element.ts @@ -3,18 +3,16 @@ import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbMemberWorkspaceEditElement } from './member-workspace-edit.element'; import { UmbMemberWorkspaceContext } from './member-workspace.context'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-member-workspace') export class UmbMemberWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbMemberWorkspaceContext(this); #element = new UmbMemberWorkspaceEditElement(); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'edit/:id', component: () => this.#element, @@ -28,7 +26,7 @@ export class UmbMemberWorkspaceElement extends UmbLitElement { render() { return html` `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/umbraco-package.ts index 25102a156d..5916f5d7ae 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/umbraco-package.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/umbraco-package.ts @@ -1,5 +1,4 @@ export const name = 'Umbraco.Core.MemberManagement'; -export const version = '0.0.1'; export const extensions = [ { name: 'Member Management Entry Point', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/manifests.ts index e9a0e23c03..84e7d15039 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/manifests.ts @@ -1,7 +1,7 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, ManifestWorkspaceViewCollection, } from '@umbraco-cms/backoffice/extensions-registry'; @@ -15,7 +15,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceViewCollections: Array = []; const workspaceActions: Array = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts index 439cab0304..cf6287835e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-builder/workspace/workspace-package-builder.element.ts @@ -13,7 +13,7 @@ import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco @customElement('umb-workspace-package-builder') export class UmbWorkspacePackageBuilderElement extends UmbLitElement { - + @property() entityId?: string; @@ -85,11 +85,11 @@ export class UmbWorkspacePackageBuilderElement extends UmbLitElement { render() { return html` - + ${this.#renderHeader()} ${this.#renderEditors()} ${this.#renderActions()} - + `; } @@ -264,7 +264,7 @@ export class UmbWorkspacePackageBuilderElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/manifests.ts index 66eb9eeaf9..2845a8eb9e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/manifests.ts @@ -1,7 +1,7 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, ManifestWorkspaceViewCollection, } from '@umbraco-cms/backoffice/extensions-registry'; @@ -15,7 +15,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceViewCollections: Array = []; const workspaceActions: Array = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/workspace/workspace-package.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/workspace/workspace-package.element.ts index efe25ddfaa..f33d0da6f6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/workspace/workspace-package.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-repo/workspace/workspace-package.element.ts @@ -4,7 +4,7 @@ import { customElement, property, state } from 'lit/decorators.js'; @customElement('umb-workspace-package') export class UmbWorkspacePackageElement extends LitElement { - + @property() entityId?: string; @@ -40,9 +40,9 @@ export class UmbWorkspacePackageElement extends LitElement { } render() { - return html` ${this._renderHeader()} `; + return html` ${this._renderHeader()} `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/created-packages-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/created-packages-section-view.element.ts index 4f22319e4f..75bf2b9b81 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/created-packages-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/created/created-packages-section-view.element.ts @@ -1,14 +1,18 @@ import { html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; -import type { ManifestTree, ManifestWorkspace } from '@umbraco-cms/backoffice/extensions-registry'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; +import type { + ManifestTree, + ManifestWorkspace, + UmbSectionViewExtensionElement, +} from '@umbraco-cms/backoffice/extensions-registry'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-created-packages-section-view') -export class UmbCreatedPackagesSectionViewElement extends UmbLitElement { +export class UmbCreatedPackagesSectionViewElement extends UmbLitElement implements UmbSectionViewExtensionElement { @state() - private _routes: IRoute[] = []; + private _routes: UmbRoute[] = []; private _workspaces: Array = []; @@ -23,7 +27,7 @@ export class UmbCreatedPackagesSectionViewElement extends UmbLitElement { } private _createRoutes() { - const routes: IRoute[] = [ + const routes: UmbRoute[] = [ { path: 'overview', component: () => import('./packages-created-overview.element'), diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts index c7dfc3aed8..8a093fa5ef 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view-item.element.ts @@ -1,8 +1,8 @@ import { html, css, nothing } from 'lit'; import { ifDefined } from 'lit/directives/if-defined.js'; import { customElement, property, state } from 'lit/decorators.js'; -import { firstValueFrom, map } from 'rxjs'; import { UUIButtonState } from '@umbraco-ui/uui'; +import { map } from 'rxjs'; import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@umbraco-cms/backoffice/modal'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; @@ -14,10 +14,18 @@ import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco @customElement('umb-installed-packages-section-view-item') export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement { - - @property() - name?: string; + public get name(): string | undefined { + return this.#name; + } + public set name(value: string | undefined) { + const oldValue = this.#name; + if (oldValue === value) return; + this.#name = value; + this.#observePackageView(); + this.requestUpdate('name', oldValue); + } + #name?: string | undefined; @property() version?: string | null; @@ -34,48 +42,41 @@ export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement { @state() private _packageView?: ManifestPackageView; - private _notificationContext?: UmbNotificationContext; - private _modalContext?: UmbModalContext; + #notificationContext?: UmbNotificationContext; + #modalContext?: UmbModalContext; constructor() { super(); this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { - this._notificationContext = instance; + this.#notificationContext = instance; }); this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { - this._modalContext = instance; + this.#modalContext = instance; }); } - connectedCallback(): void { - super.connectedCallback(); - - if (this.name?.length) { - this.findPackageView(this.name); - } - } - - private async findPackageView(alias: string) { - const observable = umbExtensionsRegistry - ?.extensionsOfType('packageView') - .pipe(map((e) => e.filter((m) => m.meta.packageName === alias))); - - if (!observable) { - return; - } - - const views = await firstValueFrom(observable); - if (!views.length) { - return; - } - - this._packageView = views[0]; + #observePackageView() { + this.observe( + umbExtensionsRegistry.extensionsOfType('packageView').pipe( + map((extensions) => { + return extensions.filter((extension) => extension.meta.packageName === this.#name); + }) + ), + (manifests) => { + if (manifests.length === 0) { + this._packageView = undefined; + return; + } + this._packageView = manifests[0]; + }, + '_observePackageViewExtension' + ); } async _onMigration() { if (!this.name) return; - const modalHandler = this._modalContext?.open(UMB_CONFIRM_MODAL, { + const modalHandler = this.#modalContext?.open(UMB_CONFIRM_MODAL, { color: 'positive', headline: `Run migrations for ${this.name}?`, content: `Do you want to start run migrations for ${this.name}`, @@ -90,33 +91,35 @@ export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement { PackageResource.postPackageByNameRunMigration({ name: this.name }) ); if (error) return; - this._notificationContext?.peek('positive', { data: { message: 'Migrations completed' } }); + this.#notificationContext?.peek('positive', { data: { message: 'Migrations completed' } }); this._migrationButtonState = 'success'; this.hasPendingMigrations = false; } render() { - return html` - - ${this.customIcon ? html`` : nothing} -
- ${this.hasPendingMigrations - ? html` - Run pending migrations - ` - : nothing} -
-
- `; + return this.name + ? html` + + ${this.customIcon ? html`` : nothing} +
+ ${this.hasPendingMigrations + ? html` + Run pending migrations + ` + : nothing} +
+
+ ` + : ''; } private async _onConfigure() { @@ -142,7 +145,7 @@ export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement { }); */ } - + static styles = css` :host { display: flex; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts index 5d748834ec..87b152a156 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts @@ -8,11 +8,10 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbPackageWithMigrationStatus } from '@umbraco-cms/backoffice/models'; import './installed-packages-section-view-item.element'; +import { UmbSectionViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-installed-packages-section-view') -export class UmbInstalledPackagesSectionViewElement extends UmbLitElement { - - +export class UmbInstalledPackagesSectionViewElement extends UmbLitElement implements UmbSectionViewExtensionElement { @state() private _installedPackages: UmbPackageWithMigrationStatus[] = []; @@ -38,7 +37,7 @@ export class UmbInstalledPackagesSectionViewElement extends UmbLitElement { const [package$, migration$] = data; - combineLatest([package$, migration$]).subscribe(([packages, migrations]) => { + this.observe(combineLatest([package$, migration$]), ([packages, migrations]) => { this._installedPackages = packages.map((p) => { const migration = migrations.find((m) => m.packageName === p.name); if (migration) { @@ -109,7 +108,7 @@ export class UmbInstalledPackagesSectionViewElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/market-place/packages-market-place-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/market-place/packages-market-place-section-view.element.ts index b8161bad01..6e112cc255 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/market-place/packages-market-place-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/market-place/packages-market-place-section-view.element.ts @@ -1,10 +1,10 @@ -import { css, html, LitElement } from 'lit'; +import { css, html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UmbSectionViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-packages-market-place-section-view') -export class UmbPackagesMarketPlaceSectionViewElement extends LitElement { - - +export class UmbPackagesMarketPlaceSectionViewElement extends UmbLitElement implements UmbSectionViewExtensionElement { // TODO: This URL comes from the server // Was previously found in 'Umbraco.Sys.ServerVariables.umbracoUrls.marketplaceUrl' @property() @@ -20,7 +20,7 @@ export class UmbPackagesMarketPlaceSectionViewElement extends LitElement { `; } - + static styles = [ css` :host { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/umbraco-package.ts index 7a92b4bf38..83ad4adb79 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/umbraco-package.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/umbraco-package.ts @@ -1,5 +1,4 @@ export const name = 'Umbraco.Core.PackageManagement'; -export const version = '0.0.1'; export const extensions = [ { name: 'Package Management Entry Point', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/search/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/backoffice/search/umbraco-package.ts index 2efaba5d15..6834301777 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/search/umbraco-package.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/search/umbraco-package.ts @@ -1,5 +1,4 @@ export const name = 'Umbraco.Core.Search'; -export const version = '0.0.1'; export const extensions = [ { name: 'Search Entry Point', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/dashboard-examine-management.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/dashboard-examine-management.element.ts index 12896bbd78..f36768b6d0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/dashboard-examine-management.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/examine-management/dashboard-examine-management.element.ts @@ -3,16 +3,15 @@ import { customElement, state } from 'lit/decorators.js'; import { UmbDashboardExamineIndexElement } from './views/section-view-examine-indexers'; import { UmbDashboardExamineSearcherElement } from './views/section-view-examine-searchers'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-dashboard-examine-management') export class UmbDashboardExamineManagementElement extends UmbLitElement { - @state() - private _routes: IRoute[] = [ + private _routes: UmbRoute[] = [ { path: `/index/:indexerName`, component: () => import('./views/section-view-examine-indexers'), @@ -54,7 +53,7 @@ export class UmbDashboardExamineManagementElement extends UmbLitElement { this._activePath = event.target.localActiveViewPath || ''; }}>`; } - + static styles = [ css` a { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/dashboard-health-check.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/dashboard-health-check.element.ts index cce292cb19..80c0b06342 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/dashboard-health-check.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/health-check/dashboard-health-check.element.ts @@ -6,7 +6,7 @@ import { UMB_HEALTHCHECK_DASHBOARD_CONTEXT_TOKEN, } from './health-check-dashboard.context'; import { UmbHealthCheckContext } from './health-check.context'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { ManifestHealthCheck } from '@umbraco-cms/backoffice/extensions-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; @@ -16,7 +16,7 @@ import { HealthCheckGroupResponseModel, HealthCheckResource } from '@umbraco-cms @customElement('umb-dashboard-health-check') export class UmbDashboardHealthCheckElement extends UmbLitElement { @state() - private _routes: IRoute[] = [ + private _routes: UmbRoute[] = [ { path: `/:groupName`, component: () => import('./views/health-check-group.element'), diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/telemetry/dashboard-telemetry.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/telemetry/dashboard-telemetry.element.ts index 54f446ca1f..e6cc16c5c9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/telemetry/dashboard-telemetry.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/dashboards/telemetry/dashboard-telemetry.element.ts @@ -3,7 +3,12 @@ import { customElement, state } from 'lit/decorators.js'; import { unsafeHTML } from 'lit/directives/unsafe-html.js'; import { UUIButtonState } from '@umbraco-ui/uui'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { TelemetryResponseModel, TelemetryLevelModel, TelemetryResource } from '@umbraco-cms/backoffice/backend-api'; +import { + TelemetryResponseModel, + TelemetryLevelModel, + TelemetryResource, + ApiError, +} from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -50,7 +55,7 @@ export class UmbDashboardTelemetryElement extends UmbLitElement { if (error) { this._buttonState = 'failed'; - this._errorMessage = error.detail; + this._errorMessage = error instanceof ApiError ? error.body.detail : error.message; return; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts index c2d25be707..7df6538c39 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/data-type.store.ts @@ -36,8 +36,8 @@ export class UmbDataTypeStore extends UmbStoreBase { } /** - * Append a data-type to the store - * @param {id} DataTypeModel id. + * Retrieve a data-type from the store + * @param {id} string id. * @memberof UmbDataTypeStore */ byId(id: DataTypeResponseModel['id']) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type-folder.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type-folder.server.data.ts index dffb153689..25c8b8a834 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type-folder.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type-folder.server.data.ts @@ -1,4 +1,4 @@ -import { v4 as uuidv4 } from 'uuid'; +import { UmbId } from '@umbraco-cms/backoffice/id'; import { UmbFolderDataSource } from '@umbraco-cms/backoffice/repository'; import { DataTypeResource, @@ -37,7 +37,7 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { const scaffold: FolderReponseModel = { $type: 'FolderReponseModel', name: '', - id: uuidv4(), + id: UmbId.new(), parentId, }; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts index 11c6c99093..b64d8766f9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/repository/sources/data-type.server.data.ts @@ -1,4 +1,4 @@ -import { v4 as uuidv4 } from 'uuid'; +import { UmbId } from '@umbraco-cms/backoffice/id'; import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; import { DataTypeResource, @@ -17,7 +17,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RepositoryDetailDataSource} */ export class UmbDataTypeServerDataSource - implements UmbDataSource + implements UmbDataSource { #host: UmbControllerHostElement; @@ -54,7 +54,7 @@ export class UmbDataTypeServerDataSource */ async createScaffold(parentId?: string | null) { const data: CreateDataTypeRequestModel = { - id: uuidv4(), + id: UmbId.new(), parentId, name: '', propertyEditorAlias: undefined, diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace-edit.element.ts index 224053c9d5..49f8d3affc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace-edit.element.ts @@ -3,7 +3,6 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UmbDataTypeWorkspaceContext } from './data-type-workspace.context'; -import { UmbRouteLocation } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { ManifestWorkspace } from '@umbraco-cms/backoffice/extensions-registry'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @@ -14,14 +13,9 @@ import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-ap */ @customElement('umb-data-type-workspace-edit-element') export class UmbDataTypeWorkspaceEditElement extends UmbLitElement { - - @property() manifest?: ManifestWorkspace; - @property() - location?: UmbRouteLocation; - @state() private _dataTypeName = ''; @@ -58,12 +52,12 @@ export class UmbDataTypeWorkspaceEditElement extends UmbLitElement { render() { return html` - + - + `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts index 15a5714fc1..33d7922fc0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.context.ts @@ -1,7 +1,7 @@ import { UmbWorkspaceContext } from '../../../shared/components/workspace/workspace-context/workspace-context'; import { UmbDataTypeRepository } from '../repository/data-type.repository'; import { UmbEntityWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; -import type { CreateDataTypeRequestModel, DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { appendToFrozenArray, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.element.ts index 12563f4537..f67effa398 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/data-type-workspace.element.ts @@ -2,21 +2,19 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbDataTypeWorkspaceContext } from './data-type-workspace.context'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import './data-type-workspace-edit.element'; @customElement('umb-data-type-workspace') export class UmbDataTypeWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbDataTypeWorkspaceContext(this); #element = document.createElement('umb-data-type-workspace-edit-element'); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'create/:parentId', component: () => this.#element, @@ -38,7 +36,7 @@ export class UmbDataTypeWorkspaceElement extends UmbLitElement { render() { return html``; } - + static styles = [UUITextStyles, css``]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/manifests.ts index f743839a8f..783e0acd78 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/manifests.ts @@ -2,7 +2,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const DATA_TYPE_WORKSPACE_ALIAS = 'Umb.Workspace.DataType'; @@ -17,9 +17,9 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = [ +const workspaceViews: Array = [ { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.DataType.Edit', name: 'Data Type Workspace Edit View', loader: () => import('./views/details/data-type-details-workspace-view.element'), @@ -34,7 +34,7 @@ const workspaceViews: Array = [ }, }, { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.DataType.Info', name: 'Data Type Workspace Info View', loader: () => import('./views/info/workspace-view-data-type-info.element'), diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts index 63784eada4..76a331a977 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/details/data-type-details-workspace-view.element.ts @@ -14,11 +14,13 @@ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import '../../../../../shared/property-editors/shared/property-editor-config/property-editor-config.element'; import '../../../../../shared/components/ref-property-editor-ui/ref-property-editor-ui.element'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-data-type-details-workspace-view') -export class UmbDataTypeDetailsWorkspaceViewEditElement extends UmbLitElement { - - +export class UmbDataTypeDetailsWorkspaceViewEditElement + extends UmbLitElement + implements UmbWorkspaceEditorViewExtensionElement +{ @state() _dataType?: DataTypeResponseModel; @@ -162,7 +164,7 @@ export class UmbDataTypeDetailsWorkspaceViewEditElement extends UmbLitElement { : nothing} `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts index fff37abf7e..607e566ab4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/data-types/workspace/views/info/workspace-view-data-type-info.element.ts @@ -6,11 +6,13 @@ import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-ap import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DataTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-workspace-view-data-type-info') -export class UmbWorkspaceViewDataTypeInfoElement extends UmbLitElement { - - +export class UmbWorkspaceViewDataTypeInfoElement + extends UmbLitElement + implements UmbWorkspaceEditorViewExtensionElement +{ @state() _dataType?: DataTypeResponseModel; @@ -59,7 +61,7 @@ export class UmbWorkspaceViewDataTypeInfoElement extends UmbLitElement { private _renderReferences() { return html` `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts index 55f24548b7..d12b09b79d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/extension-root-workspace.element.ts @@ -8,8 +8,6 @@ import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CONFIRM_MODAL } from '@um @customElement('umb-extension-root-workspace') export class UmbExtensionRootWorkspaceElement extends UmbLitElement { - - @state() private _extensions?: Array = undefined; @@ -40,7 +38,8 @@ export class UmbExtensionRootWorkspaceElement extends UmbLitElement { ), (extensions) => { this._extensions = extensions || undefined; - } + }, + '_observeExtensionRegistry' ); } @@ -58,7 +57,7 @@ export class UmbExtensionRootWorkspaceElement extends UmbLitElement { render() { return html` - + @@ -92,10 +91,10 @@ export class UmbExtensionRootWorkspaceElement extends UmbLitElement { )} - + `; } - + static styles = [ css` uui-box { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/manifests.ts index e0496a26ae..094c077b68 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/extensions/workspace/manifests.ts @@ -1,7 +1,7 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -14,7 +14,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceActions: Array = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts index 243a7f3791..ea8da97c60 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/repository/language.repository.ts @@ -2,14 +2,10 @@ import { UmbLanguageServerDataSource } from './sources/language.server.data'; import { UmbLanguageStore, UMB_LANGUAGE_STORE_CONTEXT_TOKEN } from './language.store'; import { UmbLanguageItemServerDataSource } from './sources/language-item.server.data'; import { UMB_LANGUAGE_ITEM_STORE_CONTEXT_TOKEN, UmbLanguageItemStore } from './language-item.store'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; -import { - LanguageItemResponseModel, - LanguageResponseModel, - ProblemDetailsModel, -} from '@umbraco-cms/backoffice/backend-api'; +import { LanguageItemResponseModel, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbItemRepository } from '@umbraco-cms/backoffice/repository'; export class UmbLanguageRepository implements UmbItemRepository { @@ -50,8 +46,7 @@ export class UmbLanguageRepository implements UmbItemRepository + implements UmbDataSource { #host: UmbControllerHostElement; @@ -69,8 +68,7 @@ export class UmbLanguageServerDataSource */ async insert(language: CreateLanguageRequestModel) { if (!language.isoCode) { - const error: ProblemDetailsModel = { title: 'Language iso code is missing' }; - return { error }; + throw new Error('Language iso code is missing'); } return tryExecuteAndNotify(this.#host, LanguageResource.postLanguage({ requestBody: language })); @@ -84,8 +82,7 @@ export class UmbLanguageServerDataSource */ async update(iscoCode: string, language: LanguageResponseModel) { if (!language.isoCode) { - const error: ProblemDetailsModel = { title: 'Language iso code is missing' }; - return { error }; + throw new Error('Language iso code is missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/manifests.ts index d04dc6b395..ca0e4224d1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language-root/manifests.ts @@ -1,7 +1,7 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -14,7 +14,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceActions: Array = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace-edit.element.ts index 5c701d85ef..00153be58f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace-edit.element.ts @@ -10,7 +10,7 @@ import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-ap @customElement('umb-language-workspace-edit') export class UmbLanguageWorkspaceEditElement extends UmbLitElement { - + #workspaceContext?: UmbLanguageWorkspaceContext; @@ -50,7 +50,7 @@ export class UmbLanguageWorkspaceEditElement extends UmbLitElement { } render() { - return html` + return html` - `; + `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts index 782f623ff0..388c828199 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.context.ts @@ -1,9 +1,9 @@ import { UmbLanguageRepository } from '../../repository/language.repository'; import { UmbWorkspaceContext } from '../../../../shared/components/workspace/workspace-context/workspace-context'; import { UmbEntityWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; -import type { LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { ApiError, LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbLanguageWorkspaceContext extends UmbWorkspaceContext @@ -83,8 +83,8 @@ export class UmbLanguageWorkspaceContext const { error } = await this.repository.create(data); // TODO: this is temp solution to bubble validation errors to the UI if (error) { - if (error.type === 'validation') { - this.setValidationErrors?.(error.errors); + if (error instanceof ApiError && error.body.type === 'validation') { + this.setValidationErrors?.(error.body.errors); } } else { this.setValidationErrors?.(undefined); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts index a7c17458a4..04adbc7341 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/language-workspace.element.ts @@ -2,7 +2,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbLanguageWorkspaceContext } from './language-workspace.context'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -11,8 +11,6 @@ import { generateRoutePathBuilder } from '@umbraco-cms/backoffice/router'; @customElement('umb-language-workspace') export class UmbLanguageWorkspaceElement extends UmbLitElement { - - #languageWorkspaceContext = new UmbLanguageWorkspaceContext(this); /** @@ -31,7 +29,7 @@ export class UmbLanguageWorkspaceElement extends UmbLitElement { }; @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'edit/:isoCode', component: this.#getComponentElement, @@ -50,7 +48,6 @@ export class UmbLanguageWorkspaceElement extends UmbLitElement { this.observe( this.#languageWorkspaceContext.isNew, (isNew) => { - console.log('observe', isNew); if (isNew === false) { const isoCode = this.#languageWorkspaceContext.getEntityId(); if (this.#routerPath && isoCode) { @@ -74,7 +71,7 @@ export class UmbLanguageWorkspaceElement extends UmbLitElement { this.#routerPath = event.target.absoluteRouterPath; }}>`; } - + static styles = [UUITextStyles, css``]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/manifests.ts index 4e85e5b348..bbd4992f1d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/manifests.ts @@ -2,7 +2,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -15,9 +15,9 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = [ +const workspaceViews: Array = [ { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.Language.Details', name: 'Language Workspace Details View', loader: () => import('./views/details/language-details-workspace-view.element'), diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts index f60d8ae9c0..00705baa9e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/languages/workspace/language/views/details/language-details-workspace-view.element.ts @@ -10,11 +10,13 @@ import { UmbChangeEvent } from '@umbraco-cms/backoffice/events'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { LanguageResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-language-details-workspace-view') -export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement { - - +export class UmbLanguageDetailsWorkspaceViewElement + extends UmbLitElement + implements UmbWorkspaceEditorViewExtensionElement +{ @state() _language?: LanguageResponseModel; @@ -185,7 +187,7 @@ export class UmbLanguageDetailsWorkspaceViewElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts index c4cb6d4dcf..d7b06d7812 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/logviewer-root-workspace.element.ts @@ -7,22 +7,23 @@ import { repeat } from 'lit/directives/repeat.js'; import { UmbLogViewerWorkspaceContext, UMB_APP_LOG_VIEWER_CONTEXT_TOKEN } from '../logviewer.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { umbExtensionsRegistry, createExtensionElement } from '@umbraco-cms/backoffice/extensions-api'; -import { ManifestWorkspaceView, ManifestWorkspaceViewCollection } from '@umbraco-cms/backoffice/extensions-registry'; +import { + ManifestWorkspaceEditorView, + ManifestWorkspaceViewCollection, +} from '@umbraco-cms/backoffice/extensions-registry'; import type { UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent } from '@umbraco-cms/internal/router'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; //TODO make uui-input accept min and max values @customElement('umb-logviewer-workspace') export class UmbLogViewerWorkspaceElement extends UmbLitElement { - - private _alias = 'Umb.Workspace.LogviewerRoot'; @state() - private _workspaceViews: Array = []; + private _workspaceViews: Array = []; @state() - private _routes: IRoute[] = []; + private _routes: UmbRoute[] = []; @state() private _activePath?: string; @@ -62,7 +63,7 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { private _observeWorkspaceViews() { this.observe( umbExtensionsRegistry - .extensionsOfTypes(['workspaceView']) + .extensionsOfTypes(['workspaceEditorView']) .pipe( map((extensions) => extensions.filter((extension) => extension.conditions.workspaces.includes(this._alias))) ), @@ -153,7 +154,7 @@ export class UmbLogViewerWorkspaceElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts index 83478e4b88..3f0589afeb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/logviewer/workspace/logviewer-root/manifests.ts @@ -2,7 +2,7 @@ import type { ManifestModal, ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspaceAlias = 'Umb.Workspace.LogviewerRoot'; @@ -17,9 +17,9 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = [ +const workspaceViews: Array = [ { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.Logviewer.Overview', name: 'LogViewer Root Workspace Overview View', loader: () => import('../views/overview/index'), @@ -34,7 +34,7 @@ const workspaceViews: Array = [ }, }, { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.Logviewer.Search', name: 'LogViewer Root Workspace Search View', loader: () => import('../views/search/index'), diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts index 6f92a1ce92..8433f6c883 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.repository.ts @@ -3,11 +3,10 @@ import { UmbRelationTypeServerDataSource } from './sources/relation-type.server. import { UmbRelationTypeStore, UMB_RELATION_TYPE_STORE_CONTEXT_TOKEN } from './relation-type.store'; import { UmbRelationTypeTreeServerDataSource } from './sources/relation-type.tree.server.data'; import { UmbRelationTypeTreeDataSource } from './sources'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { CreateRelationTypeRequestModel, - ProblemDetailsModel, RelationTypeResponseModel, UpdateRelationTypeRequestModel, } from '@umbraco-cms/backoffice/backend-api'; @@ -70,8 +69,7 @@ export class UmbRelationTypeRepository //TODO RelationTypes can't have children. But this method is required by the tree interface. async requestTreeItemsOf(parentId: string | null) { - const error: ProblemDetailsModel = { title: 'Not implemented' }; - return { data: undefined, error }; + return { data: undefined, error: { title: 'Not implemented', message: 'Not implemented' } }; } async requestItemsLegacy(ids: Array) { @@ -116,9 +114,9 @@ export class UmbRelationTypeRepository // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } + const { data, error } = await this.#detailDataSource.get(id); if (data) { @@ -128,9 +126,9 @@ export class UmbRelationTypeRepository return { data, error }; } - async byKey(id: string) { + async byId(id: string) { await this.#init; - return this.#detailStore!.byKey(id); + return this.#detailStore!.byId(id); } // Could potentially be general methods: diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.store.ts index 708e9ba0e4..dd0dba909f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/relation-type.store.ts @@ -40,7 +40,7 @@ export class UmbRelationTypeStore extends UmbStoreBase { * @param {id} RelationTypeResponseModel id. * @memberof UmbRelationTypeStore */ - byKey(id: RelationTypeResponseModel['id']) { + byId(id: RelationTypeResponseModel['id']) { return this._data.getObservablePart((x) => x.find((y) => y.id === id)); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts index 80ba73c8d4..5777a4268d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.server.data.ts @@ -1,12 +1,11 @@ -import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbDataSource } from '@umbraco-cms/backoffice/repository'; import { - ProblemDetailsModel, RelationTypeResource, RelationTypeResponseModel, CreateRelationTypeRequestModel, UpdateRelationTypeRequestModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -16,7 +15,8 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @implements {RepositoryDetailDataSource} */ export class UmbRelationTypeServerDataSource - implements UmbDataSource + implements + UmbDataSource { #host: UmbControllerHostElement; @@ -37,8 +37,7 @@ export class UmbRelationTypeServerDataSource */ async get(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } return tryExecuteAndNotify( @@ -104,8 +103,7 @@ export class UmbRelationTypeServerDataSource */ async delete(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'RelationType id is missing' }; - return { error }; + throw new Error('RelationType id is missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts index 4529c77390..c7a34302a7 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/repository/sources/relation-type.tree.server.data.ts @@ -1,6 +1,6 @@ -import { UmbRelationTypeTreeDataSource } from '.'; -import { ProblemDetailsModel, RelationTypeResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbRelationTypeTreeDataSource } from '.'; +import { RelationTypeResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -16,8 +16,7 @@ export class UmbRelationTypeTreeServerDataSource implements UmbRelationTypeTreeD // TODO: how do we handle trashed items? async trashItems(ids: Array) { if (!ids) { - const error: ProblemDetailsModel = { title: 'RelationType ids is missing' }; - return { error }; + throw new Error('Ids are missing'); } // TODO: use resources when end point is ready: @@ -72,8 +71,7 @@ export class UmbRelationTypeTreeServerDataSource implements UmbRelationTypeTreeD */ async getItems(ids: Array) { if (ids) { - const error: ProblemDetailsModel = { title: 'Ids are missing' }; - return { error }; + throw new Error('Ids are missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/manifests.ts index 0e4adf80b6..b9f5e657d5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/manifests.ts @@ -2,7 +2,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -15,9 +15,9 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = [ +const workspaceViews: Array = [ { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.RelationType.RelationType', name: 'Relation Type Workspace RelationType View', loader: () => import('./views/relation-type/relation-type-workspace-view-relation-type.element'), @@ -32,7 +32,7 @@ const workspaceViews: Array = [ }, }, { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.RelationType.Relation', name: 'Relation Type Workspace Relation View', loader: () => import('./views/relation/workspace-view-relation-type-relation.element'), diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace-edit.element.ts index 4357b69e82..399b0d251e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace-edit.element.ts @@ -13,7 +13,7 @@ import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-ap */ @customElement('umb-relation-type-workspace-edit-element') export class UmbRelationTypeWorkspaceEditElement extends UmbLitElement { - + #workspaceContext?: UmbRelationTypeWorkspaceContext; @@ -47,16 +47,16 @@ export class UmbRelationTypeWorkspaceEditElement extends UmbLitElement { render() { return html` - + - + `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.element.ts index 1e016e04a4..12ffb53eba 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/relation-type-workspace.element.ts @@ -4,7 +4,7 @@ import { customElement, state } from 'lit/decorators.js'; import { UmbRelationTypeWorkspaceContext } from './relation-type-workspace.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import './relation-type-workspace-edit.element'; @@ -14,8 +14,6 @@ import './relation-type-workspace-edit.element'; */ @customElement('umb-relation-type-workspace') export class UmbRelationTypeWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbRelationTypeWorkspaceContext(this); #routerPath? = ''; @@ -24,7 +22,7 @@ export class UmbRelationTypeWorkspaceElement extends UmbLitElement { #key = ''; @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'create/:parentId', component: () => this.#element, @@ -50,7 +48,7 @@ export class UmbRelationTypeWorkspaceElement extends UmbLitElement { this.#routerPath = event.target.absoluteRouterPath; }}>`; } - + static styles = [UUITextStyles, css``]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts index 934f15d8f2..46fa3eaf09 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation-type/relation-type-workspace-view-relation-type.element.ts @@ -7,9 +7,13 @@ import { UmbRelationTypeWorkspaceContext } from '../../relation-type-workspace.c import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { RelationTypeResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-relation-type-workspace-view-relation-type') -export class UmbRelationTypeWorkspaceViewRelationTypeElement extends UmbLitElement { +export class UmbRelationTypeWorkspaceViewRelationTypeElement + extends UmbLitElement + implements UmbWorkspaceEditorViewExtensionElement +{ @state() private _relationType?: RelationTypeResponseModel; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts index 69688fdd19..49308207c1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/relation-types/workspace/views/relation/workspace-view-relation-type-relation.element.ts @@ -4,11 +4,13 @@ import { customElement, state } from 'lit/decorators.js'; import { UmbTableColumn, UmbTableConfig } from '../../../../../shared/components/table'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { RelationResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbWorkspaceEditorViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; @customElement('umb-workspace-view-relation-type-relation') -export class UmbWorkspaceViewRelationTypeRelationElement extends UmbLitElement { - - +export class UmbWorkspaceViewRelationTypeRelationElement + extends UmbLitElement + implements UmbWorkspaceEditorViewExtensionElement +{ //TODO Use real data @state() _relations: Array = MockData; @@ -68,7 +70,7 @@ export class UmbWorkspaceViewRelationTypeRelationElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/settings/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/backoffice/settings/umbraco-package.ts index 12e375af3e..66e08355bb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/settings/umbraco-package.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/settings/umbraco-package.ts @@ -1,5 +1,4 @@ export const name = 'Umbraco.Core.Settings'; -export const version = '0.0.1'; export const extensions = [ { name: 'Settings Entry Point', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts deleted file mode 100644 index 4f2512206c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.context.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { Observable } from 'rxjs'; -import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import { UmbContextToken, UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import { UmbArrayState, UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import { umbExtensionsRegistry, createExtensionClass } from '@umbraco-cms/backoffice/extensions-api'; -import { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; - -// TODO: Clean up the need for store as Media has switched to use Repositories(repository). -export class UmbCollectionContext { - private _host: UmbControllerHostElement; - private _entityType: string | null; - private _entityId: string | null; - - #repository?: UmbTreeRepository; - - private _store?: any; - protected _dataObserver?: UmbObserverController; - - #data = new UmbArrayState(>[]); - public readonly data = this.#data.asObservable(); - - #selection = new UmbArrayState(>[]); - public readonly selection = this.#selection.asObservable(); - - /* - TODO: - private _search = new UmbStringState(''); - public readonly search = this._search.asObservable(); - */ - - constructor( - host: UmbControllerHostElement, - entityType: string | null, - entityId: string | null, - storeAlias?: string, - repositoryAlias?: string - ) { - this._entityType = entityType; - this._host = host; - this._entityId = entityId; - - if (storeAlias) { - new UmbContextConsumerController(this._host, storeAlias, (_instance) => { - this._store = _instance; - if (!this._store) { - // TODO: if we keep the type assumption of _store existing, then we should here make sure to break the application in a good way. - return; - } - this._onStoreSubscription(); - }); - } else if (repositoryAlias) { - new UmbObserverController( - this._host, - umbExtensionsRegistry.getByTypeAndAlias('repository', repositoryAlias), - async (repositoryManifest) => { - if (repositoryManifest) { - // TODO: use the right interface here, we might need a collection repository interface. - const result = await createExtensionClass(repositoryManifest, [this._host]); - this.#repository = result; - this._onRepositoryReady(); - } - } - ); - } - } - - /* - public getData() { - return this.#data.getValue(); - } - */ - - /* - public update(data: Partial) { - this._data.next({ ...this.getData(), ...data }); - } - */ - - public getEntityType() { - return this._entityType; - } - - protected _onStoreSubscription(): void { - if (!this._store) { - return; - } - - this._dataObserver?.destroy(); - - if (this._entityId) { - this._dataObserver = new UmbObserverController( - this._host, - this._store.getTreeItemChildren(this._entityId), - (nodes) => { - if (nodes) { - this.#data.next(nodes); - } - } - ); - } else { - this._dataObserver = new UmbObserverController(this._host, this._store.getTreeRoot(), (nodes) => { - if (nodes) { - this.#data.next(nodes); - } - }); - } - } - - protected async _onRepositoryReady() { - if (!this.#repository) { - return; - } - - this._dataObserver?.destroy(); - - if (this._entityId) { - // TODO: we should be able to get an observable from this call. either return a observable or a asObservable() method. - const observable = (await this.#repository.requestTreeItemsOf(this._entityId)).asObservable?.(); - - if (observable) { - this._dataObserver = new UmbObserverController(this._host, observable as Observable, (nodes) => { - if (nodes) { - this.#data.next(nodes); - } - }); - } - } else { - const observable = (await this.#repository.requestRootTreeItems()).asObservable?.(); - - if (observable) { - this._dataObserver = new UmbObserverController(this._host, observable as Observable, (nodes) => { - if (nodes) { - this.#data.next(nodes); - } - }); - } - } - } - - /* - TODO: - public setSearch(value: string) { - if (!value) value = ''; - - this._search.next(value); - } - */ - - public setSelection(value: Array) { - if (!value) return; - this.#selection.next(value); - } - - public clearSelection() { - this.#selection.next([]); - } - - public select(id: string) { - this.#selection.appendOne(id); - } - - public deselect(id: string) { - this.#selection.filter((k) => k !== id); - } - - // TODO: how can we make sure to call this. - public destroy(): void { - this.#data.unsubscribe(); - } -} - -export const UMB_COLLECTION_CONTEXT_TOKEN = new UmbContextToken>('UmbCollectionContext'); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-header-sections.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-header-sections.element.ts index 1e8fc69156..a44bf574db 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-header-sections.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-header-sections.element.ts @@ -57,7 +57,7 @@ export class UmbBackofficeHeaderSectionsElement extends UmbLitElement { private _observeSections() { if (!this._backofficeContext) return; - this.observe(this._backofficeContext.getAllowedSections(), (allowedSections) => { + this.observe(this._backofficeContext.allowedSections, (allowedSections) => { this._sections = allowedSections; this._visibleSections = this._sections; }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts index 9000dbd312..d7667182d5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice-main.element.ts @@ -2,21 +2,18 @@ import { defineElement } from '@umbraco-ui/uui-base/lib/registration'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { state } from 'lit/decorators.js'; -import { UmbSectionElement } from '../section/section.element'; import { UmbSectionContext, UMB_SECTION_CONTEXT_TOKEN } from '../section/section.context'; import { UmbBackofficeContext, UMB_BACKOFFICE_CONTEXT_TOKEN } from './backoffice.context'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import type { UmbRouterSlotChangeEvent } from '@umbraco-cms/internal/router'; -import type { ManifestSection } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestSection, UmbSectionExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { createExtensionElementOrFallback } from '@umbraco-cms/backoffice/extensions-api'; @defineElement('umb-backoffice-main') export class UmbBackofficeMainElement extends UmbLitElement { - - @state() - private _routes: Array = []; + private _routes: Array = []; @state() private _sections: Array = []; @@ -37,7 +34,7 @@ export class UmbBackofficeMainElement extends UmbLitElement { private async _observeBackoffice() { if (this._backofficeContext) { this.observe( - this._backofficeContext.getAllowedSections(), + this._backofficeContext.allowedSections, (sections) => { this._sections = sections; this._createRoutes(); @@ -54,9 +51,9 @@ export class UmbBackofficeMainElement extends UmbLitElement { this._routes = this._sections.map((section) => { return { path: this._routePrefix + section.meta.pathname, - component: () => createExtensionElementOrFallback(section, 'umb-section'), + component: () => createExtensionElementOrFallback(section, 'umb-section-default'), setup: (component) => { - (component as UmbSectionElement).manifest = section; + (component as UmbSectionExtensionElement).manifest = section; }, }; }); @@ -87,7 +84,7 @@ export class UmbBackofficeMainElement extends UmbLitElement { render() { return html` `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice.context.ts index f7562f6296..862593322c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/backoffice-frame/backoffice.context.ts @@ -3,17 +3,10 @@ import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStringState } from '@umbraco-cms/backoffice/observable-api'; export class UmbBackofficeContext { + #activeSectionAlias = new UmbStringState(undefined); public readonly activeSectionAlias = this.#activeSectionAlias.asObservable(); - - public getAllowedSections() { - // TODO: implemented allowed filtering based on user, maybe this will be a general need and solved else where so this might not be needed in the end. - /* - const { data } = await getUserSections({}); - this._allowedSection = data.sections; - */ - return umbExtensionsRegistry.extensionsOfType('section'); - } + public readonly allowedSections = umbExtensionsRegistry.extensionsOfType('section'); public setActiveSectionAlias(alias: string) { this.#activeSectionAlias.next(alias); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection-selection-actions.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/collection-selection-actions.element.ts similarity index 83% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection-selection-actions.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/collection-selection-actions.element.ts index 713f229730..925f23c1c9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection-selection-actions.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/collection-selection-actions.element.ts @@ -1,21 +1,18 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { css, html, nothing } from 'lit'; -import { customElement, property, state } from 'lit/decorators.js'; +import { css, html } from 'lit'; +import { customElement, state } from 'lit/decorators.js'; import { map } from 'rxjs'; -import { UmbCollectionContext, UMB_COLLECTION_CONTEXT_TOKEN } from './collection.context'; +import { UMB_COLLECTION_CONTEXT_TOKEN, UmbCollectionContext } from '@umbraco-cms/backoffice/collection'; import type { ManifestEntityBulkAction } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { UmbExecutedEvent } from '@umbraco-cms/backoffice/events'; -import '../components/entity-bulk-action/entity-bulk-action.element'; +import '../entity-bulk-action/entity-bulk-action.element'; @customElement('umb-collection-selection-actions') export class UmbCollectionSelectionActionsElement extends UmbLitElement { - - - @property() - public entityType: string | null = null; + #entityType?: string; @state() private _nodesLength = 0; @@ -26,16 +23,19 @@ export class UmbCollectionSelectionActionsElement extends UmbLitElement { @state() private _entityBulkActions: Array = []; - private _collectionContext?: UmbCollectionContext; + private _collectionContext?: UmbCollectionContext; private _selection: Array = []; constructor() { super(); this.consumeContext(UMB_COLLECTION_CONTEXT_TOKEN, (instance) => { this._collectionContext = instance; - this.entityType = instance.getEntityType(); this._observeCollectionContext(); - this.#observeEntityBulkActions(); + + if (instance.getEntityType()) { + this.#entityType = instance.getEntityType() ?? undefined; + this.#observeEntityBulkActions(); + } }); } @@ -53,7 +53,7 @@ export class UmbCollectionSelectionActionsElement extends UmbLitElement { if (!this._collectionContext) return; // TODO: Make sure it only updates on length change. - this.observe(this._collectionContext.data, (mediaItems) => { + this.observe(this._collectionContext.items, (mediaItems) => { this._nodesLength = mediaItems.length; }); @@ -72,7 +72,7 @@ export class UmbCollectionSelectionActionsElement extends UmbLitElement { this.observe( umbExtensionsRegistry.extensionsOfType('entityBulkAction').pipe( map((extensions) => { - return extensions.filter((extension) => extension.conditions.entityType === this.entityType); + return extensions.filter((extension) => extension.conditions.entityType === this.#entityType); }) ), (bulkActions) => { @@ -87,7 +87,7 @@ export class UmbCollectionSelectionActionsElement extends UmbLitElement { } render() { - if (this._selectionLength === 0) return nothing; + // if (this._selectionLength === 0) return nothing; return html`
`; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection-toolbar.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/collection-toolbar.element.ts similarity index 97% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection-toolbar.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/collection-toolbar.element.ts index cf405aa30b..dc2ce3f517 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection-toolbar.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/collection-toolbar.element.ts @@ -2,8 +2,8 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html, nothing } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { map } from 'rxjs'; -import { TooltipMenuItem } from '../components/tooltip-menu'; -import '../components/tooltip-menu/tooltip-menu.element'; +import { TooltipMenuItem } from '../tooltip-menu'; +import '../tooltip-menu/tooltip-menu.element'; import type { ManifestCollectionView } from '@umbraco-cms/backoffice/extensions-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/collection.element.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/collection.element.ts index ed2235102c..23e7d2d8fd 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/collection.element.ts @@ -4,24 +4,22 @@ import { customElement, state, property } from 'lit/decorators.js'; import { map } from 'rxjs'; import './collection-selection-actions.element'; import './collection-toolbar.element'; -import { UmbCollectionContext, UMB_COLLECTION_CONTEXT_TOKEN } from './collection.context'; +import { UmbCollectionContext, UMB_COLLECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/collection'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import type { ManifestCollectionView } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; @customElement('umb-collection') export class UmbCollectionElement extends UmbLitElement { - - @state() - private _routes: Array = []; + private _routes: Array = []; @state() private _selection?: Array | null; - private _collectionContext?: UmbCollectionContext; + private _collectionContext?: UmbCollectionContext; private _entityType!: string; @property({ type: String, attribute: 'entity-type' }) @@ -96,7 +94,7 @@ export class UmbCollectionElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/dashboards/dashboard-collection.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/dashboards/dashboard-collection.element.ts similarity index 90% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/dashboards/dashboard-collection.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/dashboards/dashboard-collection.element.ts index 82ca1ad616..d1a2621301 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/dashboards/dashboard-collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/dashboards/dashboard-collection.element.ts @@ -2,7 +2,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; -import { UmbCollectionContext, UMB_COLLECTION_CONTEXT_TOKEN } from '../../../shared/collection/collection.context'; +import { UMB_COLLECTION_CONTEXT_TOKEN, UmbCollectionContext } from '@umbraco-cms/backoffice/collection'; import type { ManifestDashboardCollection } from '@umbraco-cms/backoffice/extensions-registry'; import type { FolderTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -11,10 +11,8 @@ import '../collection.element'; @customElement('umb-dashboard-collection') export class UmbDashboardCollectionElement extends UmbLitElement { - - // TODO: Use the right type here: - private _collectionContext?: UmbCollectionContext; + private _collectionContext?: UmbCollectionContext; public manifest!: ManifestDashboardCollection; @@ -27,7 +25,7 @@ export class UmbDashboardCollectionElement extends UmbLitElement { if (!this._collectionContext) { const repositoryAlias = this.manifest.meta.repositoryAlias; this._entityType = this.manifest.conditions.entityType; - this._collectionContext = new UmbCollectionContext(this, this._entityType, null, '', repositoryAlias); + this._collectionContext = new UmbCollectionContext(this, this._entityType, repositoryAlias); this.provideContext(UMB_COLLECTION_CONTEXT_TOKEN, this._collectionContext); } } @@ -35,7 +33,7 @@ export class UmbDashboardCollectionElement extends UmbLitElement { render() { return html``; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/dashboards/dashboard-collection.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/dashboards/dashboard-collection.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/collection/dashboards/dashboard-collection.stories.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/collection/dashboards/dashboard-collection.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts index e258078e0f..a56e0ab18f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/index.ts @@ -12,6 +12,9 @@ import './backoffice-frame/backoffice-modal-container.element'; import './backoffice-frame/backoffice-notification-container.element'; import './button-with-dropdown/button-with-dropdown.element'; import './code-block/code-block.element'; +import './collection/collection.element'; +import './collection/collection-toolbar.element'; +import './collection/collection-selection-actions.element'; import './debug/debug.element'; import './donut-chart'; import './dropdown/dropdown.element'; @@ -53,8 +56,8 @@ import './history/history-list.element'; import './history/history-item.element'; import './workspace/workspace-action/workspace-action.element'; -import './workspace/workspace-layout/workspace-layout.element'; -import './workspace/workspace-footer-layout/workspace-footer-layout.element'; +import './workspace/workspace-editor/workspace-editor.element'; +import './workspace/workspace-footer/workspace-footer.element'; import './template-card/template-card.element'; import './code-editor'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-section/input-section.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-section/input-section.element.ts index 361c5cf166..7e94b12316 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-section/input-section.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-section/input-section.element.ts @@ -21,7 +21,7 @@ export class UmbInputPickerSectionElement extends UmbInputListBaseElement { private _observeSections() { if (this.value.length > 0) { - umbExtensionsRegistry.extensionsOfType('section').subscribe((sections: Array) => { + this.observe(umbExtensionsRegistry.extensionsOfType('section'), (sections: Array) => { this._sections = sections.filter((section) => this.value.includes(section.alias)); }); } else { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts deleted file mode 100644 index 8a51a0ac85..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.element.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { css, html, nothing, PropertyValueMap } from 'lit'; -import { customElement, state } from 'lit/decorators.js'; -import { UmbInputListBaseElement } from '../input-list-base/input-list-base'; -import { UmbUserStore, UMB_USER_STORE_CONTEXT_TOKEN } from '../../../users/users/repository/user.store'; -import { UMB_USER_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; -import type { UserEntity } from '@umbraco-cms/backoffice/models'; - -@customElement('umb-input-user') -export class UmbPickerUserElement extends UmbInputListBaseElement { - - - @state() - private _users: Array = []; - - private _userStore?: UmbUserStore; - - connectedCallback(): void { - super.connectedCallback(); - this.pickerToken = UMB_USER_PICKER_MODAL; - this.consumeContext(UMB_USER_STORE_CONTEXT_TOKEN, (userStore) => { - this._userStore = userStore; - this._observeUser(); - }); - } - - protected updated(_changedProperties: PropertyValueMap | Map): void { - super.updated(_changedProperties); - if (_changedProperties.has('value')) { - this._observeUser(); // TODO: This works, but it makes the value change twice. - } - } - - private _observeUser() { - if (!this._userStore) return; - - // TODO: Fix type mismatch: - this.observe>(this._userStore.getByKeys(this.value), (users) => { - this._users = users; - }); - } - - selectionUpdated() { - this._observeUser(); - this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); - } - - private _renderUserList() { - if (this._users.length === 0) return nothing; - - return html`
- ${this._users.map( - (user) => html` -
- -
${user.name}
- this.removeFromSelection(user.id)} label="remove" color="danger"> -
- ` - )} -
`; - } - - renderContent() { - return html`${this._renderUserList()}`; - } - - static styles = [ - UUITextStyles, - css` - :host { - display: flex; - flex-direction: column; - gap: var(--uui-size-space-4); - } - #user-list { - display: flex; - flex-direction: column; - gap: var(--uui-size-space-4); - } - .user { - display: flex; - align-items: center; - gap: var(--uui-size-space-2); - } - .user uui-button { - margin-left: auto; - } - `, - ]; -} - -declare global { - interface HTMLElementTagNameMap { - 'umb-input-user': UmbPickerUserElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.stories.ts deleted file mode 100644 index e1f907ddd1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.stories.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Meta, StoryObj } from '@storybook/web-components'; -import './input-user.element'; -import type { UmbPickerUserElement } from './input-user.element'; - -const meta: Meta = { - title: 'Components/Inputs/User', - component: 'umb-input-user', - argTypes: { - modalType: { - control: 'inline-radio', - options: ['dialog', 'sidebar'], - defaultValue: 'sidebar', - description: 'The type of modal to use when selecting users', - }, - modalSize:{ - control: 'select', - options: ['small', 'medium', 'large', 'full'], - defaultValue: 'small', - description: 'The size of the modal to use when selecting users, only applicable to sidebar not dialog', - } - } -}; - -export default meta; -type Story = StoryObj; - -export const Overview: Story = { - args: { - } -}; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.test.ts deleted file mode 100644 index 7d85d80d5f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user/input-user.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -//TODO: Test has been commented out while we figure out how to setup import maps for the test environment -// import { UmbPickerUserElement } from './picker-user.element'; -// import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// describe('UmbPickerUserElement', () => { -// let element: UmbPickerUserElement; -// beforeEach(async () => { -// element = await fixture(html``); -// }); - -// it('is defined with its own instance', () => { -// expect(element).to.be.instanceOf(UmbPickerUserElement); -// }); - -// it('passes the a11y audit', async () => { -// await expect(element).shadowDom.to.be.accessible(defaultA11yConfig); -// }); -// }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-views/section-views.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-views/section-views.element.ts index 1a2f9c398a..81b12d7fe9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-views/section-views.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section-views/section-views.element.ts @@ -3,9 +3,14 @@ import { css, html, nothing } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { map, of } from 'rxjs'; import { UmbSectionContext, UMB_SECTION_CONTEXT_TOKEN } from '../section.context'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; -import type { ManifestDashboard, ManifestSectionView } from '@umbraco-cms/backoffice/extensions-registry'; +import type { + ManifestDashboard, + ManifestSectionView, + UmbDashboardExtensionElement, + UmbSectionViewExtensionElement, +} from '@umbraco-cms/backoffice/extensions-registry'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; @@ -13,8 +18,6 @@ import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; // TODO: this might need a new name, since it's both view and dashboard now @customElement('umb-section-views') export class UmbSectionViewsElement extends UmbLitElement { - - @property({ type: String, attribute: 'section-alias' }) public sectionAlias?: string; @@ -31,7 +34,7 @@ export class UmbSectionViewsElement extends UmbLitElement { private _activePath?: string; @state() - private _routes: Array = []; + private _routes: Array = []; private _sectionContext?: UmbSectionContext; private _extensionsObserver?: UmbObserverController; @@ -52,14 +55,20 @@ export class UmbSectionViewsElement extends UmbLitElement { return { path: 'dashboard/' + manifest.meta.pathname, component: () => createExtensionElement(manifest), - }; + setup: (component: UmbDashboardExtensionElement) => { + component.manifest = manifest; + }, + } as UmbRoute; }); const viewRoutes = this._views?.map((manifest) => { return { path: 'view/' + manifest.meta.pathname, component: () => createExtensionElement(manifest), - }; + setup: (component: UmbSectionViewExtensionElement) => { + component.manifest = manifest; + }, + } as UmbRoute; }); const routes = [...dashboardRoutes, ...viewRoutes]; @@ -163,7 +172,7 @@ export class UmbSectionViewsElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section.element.ts index 4f614856db..9d614a4f34 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/section/section.element.ts @@ -4,27 +4,29 @@ import { customElement, property, state } from 'lit/decorators.js'; import { map } from 'rxjs'; import type { UmbWorkspaceElement } from '../workspace/workspace.element'; import type { UmbSectionViewsElement } from './section-views/section-views.element'; -import type { ManifestSection, ManifestSectionSidebarApp } from '@umbraco-cms/backoffice/extensions-registry'; +import type { + ManifestSection, + ManifestSectionSidebarApp, + UmbSectionExtensionElement, +} from '@umbraco-cms/backoffice/extensions-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import './section-sidebar-menu/section-sidebar-menu.element'; /** * @export - * @class UmbSectionElement + * @class UmbBaseSectionElement * @description - Element hosting sections and section navigation. */ -@customElement('umb-section') -export class UmbSectionElement extends UmbLitElement { - - +@customElement('umb-section-default') +export class UmbSectionDefaultElement extends UmbLitElement implements UmbSectionExtensionElement { @property() public manifest?: ManifestSection; @state() - private _routes?: Array; + private _routes?: Array; @state() private _menus?: Array>; @@ -36,8 +38,6 @@ export class UmbSectionElement extends UmbLitElement { } #createRoutes() { - this._routes = []; - this._routes = [ { path: 'workspace/:entityType', @@ -93,7 +93,7 @@ export class UmbSectionElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` @@ -112,6 +112,6 @@ export class UmbSectionElement extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-section': UmbSectionElement; + 'umb-section-default': UmbSectionDefaultElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.stories.ts index f4da64de01..8d11d99076 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/table/table.stories.ts @@ -1,7 +1,7 @@ import { Meta, StoryObj } from '@storybook/web-components'; import './table.element'; -import { v4 as uuidv4 } from 'uuid'; import type { UmbTableElement, UmbTableColumn, UmbTableConfig, UmbTableItem } from './table.element'; +import { UmbId } from '@umbraco-cms/backoffice/id'; const meta: Meta = { title: 'Components/Table', @@ -26,7 +26,7 @@ const columns: Array = [ const items: Array = [ { - id: uuidv4(), + id: UmbId.new(), icon: 'umb:wand', data: [ { @@ -40,7 +40,7 @@ const items: Array = [ ], }, { - id: uuidv4(), + id: UmbId.new(), icon: 'umb:document', data: [ { @@ -54,7 +54,7 @@ const items: Array = [ ], }, { - id: uuidv4(), + id: UmbId.new(), icon: 'umb:user', data: [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.element.ts index a68e13eece..a018fa9f6c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/entity-tree-item/entity-tree-item.element.ts @@ -4,7 +4,7 @@ import { customElement, property } from 'lit/decorators.js'; import { UmbEntityTreeItemContext } from './entity-tree-item.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import { ManifestKind } from '@umbraco-cms/backoffice/extensions-registry'; +import { ManifestKind, UmbTreeItemExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; // TODO: Move to separate file: @@ -21,9 +21,7 @@ const manifest: ManifestKind = { umbExtensionsRegistry.register(manifest); @customElement('umb-entity-tree-item') -export class UmbEntityTreeItemElement extends UmbLitElement { - - +export class UmbEntityTreeItemElement extends UmbLitElement implements UmbTreeItemExtensionElement { private _item?: EntityTreeItemResponseModel; @property({ type: Object, attribute: false }) public get item() { @@ -40,7 +38,7 @@ export class UmbEntityTreeItemElement extends UmbLitElement { if (!this.item) return nothing; return html``; } - + static styles = [UUITextStyles, css``]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts index 34588fa7c1..1337e52ae1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item-base/tree-item-base.element.ts @@ -86,7 +86,7 @@ export class UmbTreeItemBaseElement extends UmbLitElement { const { asObservable } = await this.#treeItemContext.requestChildren(); if (!asObservable) return; - this.observe(asObservable(), (childItems: any) => { + this.observe(asObservable(), (childItems) => { this._childItems = childItems; }); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item.context.interface.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item.context.interface.ts index 31d877f22e..7809c8ad23 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item.context.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-item.context.interface.ts @@ -1,6 +1,6 @@ -import { Observable } from 'rxjs'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import { ProblemDetailsModel, TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; +import type { Observable } from 'rxjs'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { ProblemDetailsModel, TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; // TODO: temp type. Add paged response type to the repository interface interface PagedResponse { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-menu-item/tree-menu-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-menu-item/tree-menu-item.element.ts index 7922feb209..39d2a9ea28 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-menu-item/tree-menu-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/tree/tree-menu-item/tree-menu-item.element.ts @@ -4,7 +4,11 @@ import { ifDefined } from 'lit/directives/if-defined.js'; import { UUIMenuItemEvent } from '@umbraco-ui/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; -import { ManifestKind, ManifestMenuItemTreeKind } from '@umbraco-cms/backoffice/extensions-registry'; +import { + ManifestKind, + ManifestMenuItemTreeKind, + UmbMenuItemExtensionElement, +} from '@umbraco-cms/backoffice/extensions-registry'; // TODO: Move to separate file: const manifest: ManifestKind = { @@ -20,7 +24,7 @@ const manifest: ManifestKind = { umbExtensionsRegistry.register(manifest); @customElement('umb-menu-item-tree') -export class UmbMenuItemTreeElement extends UmbLitElement { +export class UmbMenuItemTreeElement extends UmbLitElement implements UmbMenuItemExtensionElement { @state() private _renderTree = false; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.element.ts index 123a035fc3..a4b93f1b14 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace-property/workspace-property.element.ts @@ -4,7 +4,6 @@ import { customElement, property, state } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; import { UmbVariantId } from '../../variants/variant-id.class'; import { UmbWorkspacePropertyContext } from './workspace-property.context'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import type { ManifestPropertyEditorUI } from '@umbraco-cms/backoffice/extensions-registry'; @@ -22,8 +21,6 @@ import { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backe @customElement('umb-workspace-property') export class UmbWorkspacePropertyElement extends UmbLitElement { - - /** * Label. Name of the property * @type {string} @@ -114,7 +111,7 @@ export class UmbWorkspacePropertyElement extends UmbLitElement { private _variantDifference?: string; @state() - private _element?: UmbPropertyEditorElement; + private _element?: ManifestPropertyEditorUI["ELEMENT_TYPE"]; @state() private _value?: unknown; @@ -182,7 +179,7 @@ export class UmbWorkspacePropertyElement extends UmbLitElement { oldValue?.removeEventListener('change', this._onPropertyEditorChange as any as EventListener); - this._element = el as UmbPropertyEditorElement; + this._element = el as ManifestPropertyEditorUI["ELEMENT_TYPE"]; this._valueObserver?.destroy(); this._configObserver?.destroy(); @@ -243,7 +240,7 @@ export class UmbWorkspacePropertyElement extends UmbLitElement { .value="${this._value}">` : ''}`; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts index 08558273e5..00d1f82ac5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element.ts @@ -2,27 +2,22 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement } from 'lit/decorators.js'; import { ifDefined } from 'lit/directives/if-defined.js'; -import { - UmbCollectionContext, - UMB_COLLECTION_CONTEXT_TOKEN, -} from '../../../../../../shared/collection/collection.context'; - -import '../../../../../../shared/collection/dashboards/dashboard-collection.element'; +import { UmbCollectionContext, UMB_COLLECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { FolderTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import type { ManifestWorkspaceViewCollection } from '@umbraco-cms/backoffice/extensions-registry'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import '../../../../../../shared/components/collection/dashboards/dashboard-collection.element'; + @customElement('umb-workspace-view-collection') export class UmbWorkspaceViewCollectionElement extends UmbLitElement { - - public manifest!: ManifestWorkspaceViewCollection; private _workspaceContext?: typeof UMB_ENTITY_WORKSPACE_CONTEXT.TYPE; // TODO: add type for the collection context. - private _collectionContext?: UmbCollectionContext; + private _collectionContext?: UmbCollectionContext; constructor() { super(); @@ -40,13 +35,7 @@ export class UmbWorkspaceViewCollectionElement extends UmbLitElement { if (entityId != null && entityType != null) { const manifestMeta = this.manifest.meta; - this._collectionContext = new UmbCollectionContext( - this, - entityType, - entityId, - manifestMeta.storeAlias, - manifestMeta.repositoryAlias - ); + this._collectionContext = new UmbCollectionContext(this, entityType, manifestMeta.repositoryAlias); this.provideContext(UMB_COLLECTION_CONTEXT_TOKEN, this._collectionContext); } } @@ -54,7 +43,7 @@ export class UmbWorkspaceViewCollectionElement extends UmbLitElement { render() { return html``; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts index 9eb0f5400c..4f876638f8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-context/entity-manager-controller.ts @@ -1,4 +1,4 @@ -import { v4 as uuidv4 } from 'uuid'; +import { UmbId } from '@umbraco-cms/backoffice/id'; import { UmbContextConsumerController, UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { @@ -90,7 +90,7 @@ export class UmbEntityWorkspaceManager< create = (parentId: string | null) => { this.#isNew = true; - this._entityId = uuidv4(); + this._entityId = UmbId.new(); this._createAtParentKey = parentId; }; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-editor/workspace-editor.element.ts similarity index 82% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-editor/workspace-editor.element.ts index f3d7567a48..edfc8d8468 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-editor/workspace-editor.element.ts @@ -4,11 +4,11 @@ import { customElement, property, state } from 'lit/decorators.js'; import { map } from 'rxjs'; import { repeat } from 'lit/directives/repeat.js'; -import type { IRoute, PageComponent } from '@umbraco-cms/backoffice/router'; +import type { PageComponent, UmbRoute } from '@umbraco-cms/backoffice/router'; import type { UmbRouterSlotInitEvent, UmbRouterSlotChangeEvent } from '@umbraco-cms/internal/router'; import { createExtensionElement, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import type { - ManifestWorkspaceView, + ManifestWorkspaceEditorView, ManifestWorkspaceViewCollection, } from '@umbraco-cms/backoffice/extensions-registry'; @@ -17,7 +17,7 @@ import '../../extension-slot/extension-slot.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** - * @element umb-workspace-layout + * @element umb-workspace-editor * @description * @slot icon - Slot for icon * @slot header - Slot for workspace header @@ -30,10 +30,8 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; * @extends {UmbLitElement} */ // TODO: stop naming this something with layout. as its not just an layout. it hooks up with extensions. -@customElement('umb-workspace-layout') -export class UmbWorkspaceLayoutElement extends UmbLitElement { - - +@customElement('umb-workspace-editor') +export class UmbWorkspaceEditorElement extends UmbLitElement { @property() public headline = ''; @@ -65,10 +63,10 @@ export class UmbWorkspaceLayoutElement extends UmbLitElement { } @state() - private _workspaceViews: Array = []; + private _workspaceViews: Array = []; @state() - private _routes?: IRoute[]; + private _routes?: UmbRoute[]; @state() private _routerPath?: string; @@ -77,9 +75,10 @@ export class UmbWorkspaceLayoutElement extends UmbLitElement { private _activePath?: string; private _observeWorkspaceViews() { + // TODO: Make collection as a kind of workspaceEditorView. this.observe( umbExtensionsRegistry - .extensionsOfTypes(['workspaceView', 'workspaceViewCollection']) + .extensionsOfTypes(['workspaceEditorView', 'workspaceViewCollection']) .pipe( map((extensions) => extensions.filter((extension) => extension.conditions.workspaces.includes(this.alias))) ), @@ -99,23 +98,23 @@ export class UmbWorkspaceLayoutElement extends UmbLitElement { this._routes = []; if (this._workspaceViews.length > 0) { - this._routes = this._workspaceViews.map((view) => { + this._routes = this._workspaceViews.map((manifest) => { return { - path: `view/${view.meta.pathname}`, + path: `view/${manifest.meta.pathname}`, component: () => { - if (view.type === 'workspaceViewCollection') { + if (manifest.type === 'workspaceViewCollection') { return import( - '../../../../shared/components/workspace/workspace-content/views/collection/workspace-view-collection.element' + '../workspace-content/views/collection/workspace-view-collection.element' ) as unknown as Promise; } - return createExtensionElement(view); + return createExtensionElement(manifest); }, - setup: (component, info) => { + setup: (component) => { if (this.componentHasManifest(component)) { - component.manifest = view; + component.manifest = manifest; } }, - }; + } as UmbRoute; }); // If we have a post fix then we need to add a direct from the empty url of the split-view-index: @@ -140,10 +139,10 @@ export class UmbWorkspaceLayoutElement extends UmbLitElement { ${this.enforceNoFooter ? '' : html` - + - + `} `; @@ -190,7 +189,7 @@ export class UmbWorkspaceLayoutElement extends UmbLitElement { : nothing} `; } - + static styles = [ UUITextStyles, css` @@ -226,6 +225,6 @@ export class UmbWorkspaceLayoutElement extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-workspace-layout': UmbWorkspaceLayoutElement; + 'umb-workspace-editor': UmbWorkspaceEditorElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-editor/workspace-editor.stories.ts similarity index 62% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.stories.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-editor/workspace-editor.stories.ts index ba84a2855e..734f874d9c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-layout/workspace-layout.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-editor/workspace-editor.stories.ts @@ -1,21 +1,21 @@ -import './workspace-layout.element'; +import './workspace-editor.element'; import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; -import type { UmbWorkspaceLayoutElement } from './workspace-layout.element'; +import type { UmbWorkspaceEditorElement } from './workspace-editor.element'; export default { - title: 'Workspaces/Shared/Editor Entity Layout', - component: 'umb-workspace-layout', - id: 'umb-workspace-layout', + title: 'Workspaces/Shared/Workspace Editor', + component: 'umb-workspace-editor', + id: 'umb-workspace-editor', } as Meta; -export const AAAOverview: Story = () => html` +export const AAAOverview: Story = () => html`
Icon slot
Name slot
Footer slot
Actions slot
Default slot -
`; +`; AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer/workspace-footer.element.ts similarity index 92% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer/workspace-footer.element.ts index 2c706cb5b9..5e25286af6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer/workspace-footer.element.ts @@ -6,7 +6,7 @@ import type { ManifestWorkspaceAction } from '@umbraco-cms/backoffice/extensions import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** - * @element umb-workspace-footer-layout + * @element umb-workspace-footer * @description Uses the alias to insert extensions that targets this workspace-alias. * @slot - Slot for workspace footer items * @slot actions - Slot for workspace actions @@ -15,10 +15,8 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; * @extends {UmbLitElement} */ // TODO: stop naming this something with layout. as its not just an layout. it hooks up with extensions. -@customElement('umb-workspace-footer-layout') +@customElement('umb-workspace-footer') export class UmbWorkspaceFooterLayoutElement extends UmbLitElement { - - private _alias = ''; /** * Alias of the workspace. The Layout will render the workspace actions that are registered for this workspace alias. @@ -54,7 +52,7 @@ export class UmbWorkspaceFooterLayoutElement extends UmbLitElement { `; } - + static styles = [ UUITextStyles, css` @@ -73,6 +71,6 @@ export class UmbWorkspaceFooterLayoutElement extends UmbLitElement { declare global { interface HTMLElementTagNameMap { - 'umb-workspace-footer-layout': UmbWorkspaceFooterLayoutElement; + 'umb-workspace-footer': UmbWorkspaceFooterLayoutElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer/workspace-footer.stories.ts similarity index 63% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.stories.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer/workspace-footer.stories.ts index a37b61a21b..1dc0fbb9eb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer-layout/workspace-footer-layout.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-footer/workspace-footer.stories.ts @@ -1,19 +1,19 @@ -import '../workspace-layout/workspace-layout.element'; -import './workspace-footer-layout.element'; +import '../workspace-editor/workspace-editor.element'; +import './workspace-footer.element'; import { Meta, Story } from '@storybook/web-components'; import { html } from 'lit'; -import type { UmbWorkspaceFooterLayoutElement } from './workspace-footer-layout.element'; +import type { UmbWorkspaceFooterLayoutElement } from './workspace-footer.element'; export default { title: 'Workspaces/Shared/Footer Layout', - component: 'umb-workspace-footer-layout', - id: 'umb-workspace-footer-layout', + component: 'umb-workspace-footer', + id: 'umb-workspace-footer', } as Meta; -export const AAAOverview: Story = () => html` +export const AAAOverview: Story = () => html`
Footer slot
Actions slot
-
`; +`; AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-variant/workspace-variant.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-variant/workspace-variant.element.ts index 2ae60b30db..36a761d443 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-variant/workspace-variant.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/workspace/workspace-variant/workspace-variant.element.ts @@ -2,7 +2,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; -import '../workspace-layout/workspace-layout.element'; +import '../workspace-editor/workspace-editor.element'; import '../../../../shared/components/variant-selector/variant-selector.element.ts'; // Lazy load @@ -18,8 +18,6 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; */ @customElement('umb-workspace-variant') export class UmbWorkspaceVariantContentElement extends UmbLitElement { - - // TODO: stop prop drilling this alias. Instead use the workspace context. @property() alias!: string; @@ -40,7 +38,7 @@ export class UmbWorkspaceVariantContentElement extends UmbLitElement { render() { return html` - ` : ''} - + `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.element.ts index ce7de0f359..d1ce56eb46 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/embedded-media/embedded-media-modal.element.ts @@ -26,7 +26,7 @@ interface UmbEmbeddedMediaModalModel { @customElement('umb-embedded-media-modal') export class UmbEmbeddedMediaModalElement extends UmbLitElement { - + #loading = false; #embedResult!: OEmbedResult; @@ -164,7 +164,7 @@ export class UmbEmbeddedMediaModalElement extends UmbLitElement { render() { return html` - +
@@ -227,10 +227,10 @@ export class UmbEmbeddedMediaModalElement extends UmbLitElement { look="primary" label="Submit" @click=${this.#handleConfirm}> - + `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.element.ts index 4dadf09877..8c42d0242b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/icon-picker/icon-picker-modal.element.ts @@ -83,7 +83,7 @@ export class UmbIconPickerModalElement extends UmbModalBaseElement +
${this.renderSearchbar()}
@@ -104,7 +104,7 @@ export class UmbIconPickerModalElement extends UmbModalBaseElement Submit - + `; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/link-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/link-picker-modal.element.ts index 3c94113484..df4510682f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/link-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/link-picker/link-picker-modal.element.ts @@ -14,7 +14,7 @@ import { buildUdi, getKeyFromUdi } from '@umbraco-cms/backoffice/utils'; @customElement('umb-link-picker-modal') export class UmbLinkPickerModalElement extends UmbModalBaseElement { - + @state() _selectedKey?: string; @@ -91,7 +91,7 @@ export class UmbLinkPickerModalElement extends UmbModalBaseElement + @@ -121,7 +121,7 @@ export class UmbLinkPickerModalElement extends UmbModalBaseElement
- +
`; } @@ -170,7 +170,7 @@ export class UmbLinkPickerModalElement extends UmbModalBaseElement`; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/property-settings/property-settings-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/property-settings/property-settings-modal.element.ts index 20deb3097d..690978f919 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/property-settings/property-settings-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/property-settings/property-settings-modal.element.ts @@ -14,7 +14,7 @@ import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; @customElement('umb-property-settings-modal') export class UmbPropertySettingsModalElement extends UmbModalBaseElement { - + @state() private _selectedPropertyEditorUI?: ManifestPropertyEditorUI; @state() private _selectedPropertyEditorUIAlias = ''; @@ -200,7 +200,7 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement
- +
@@ -241,7 +241,7 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement
- + `; @@ -333,7 +333,7 @@ export class UmbPropertySettingsModalElement extends UmbModalBaseElement { - + @state() private _sections: Array = []; connectedCallback(): void { super.connectedCallback(); - umbExtensionsRegistry.extensionsOfType('section').subscribe((sections: Array) => { + this.observe(umbExtensionsRegistry.extensionsOfType('section'), (sections: Array) => { this._sections = sections; }); } render() { return html` - +
@@ -42,10 +42,10 @@ export class UmbSectionPickerModalElement extends UmbModalElementPickerBase
-
+ `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/template-picker/template-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/template-picker/template-picker-modal.element.ts index ef63b2064b..d458e732d9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/template-picker/template-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/modals/template-picker/template-picker-modal.element.ts @@ -42,7 +42,7 @@ export class UmbTemplatePickerModalElement extends UmbModalBaseElement< // TODO: make umb-tree have a disabled option (string array like selection)? render() { return html` - +
@@ -56,7 +56,7 @@ export class UmbTemplatePickerModalElement extends UmbModalBaseElement<
-
+ `; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-actions/shared/property-action-menu/property-action-menu.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-actions/shared/property-action-menu/property-action-menu.element.ts index 566b7bc555..e83a7119ab 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-actions/shared/property-action-menu/property-action-menu.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-actions/shared/property-action-menu/property-action-menu.element.ts @@ -12,8 +12,6 @@ import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; @customElement('umb-property-action-menu') export class UmbPropertyActionMenuElement extends UmbLitElement { - - // TODO: we need to investigate context api vs values props and events @property() public value?: string; @@ -48,6 +46,7 @@ export class UmbPropertyActionMenuElement extends UmbLitElement { private _observeActions(alias: string) { this._actionsObserver?.destroy(); + // TODO: Align property actions with entity actions. this._actionsObserver = this.observe( umbExtensionsRegistry.extensionsOfType('propertyAction').pipe( map((propertyActions) => { @@ -94,7 +93,7 @@ export class UmbPropertyActionMenuElement extends UmbLitElement { ` : ''; } - + static styles: CSSResultGroup = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts index eaf2856fa2..8188c21356 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/modals/property-editor-ui-picker/property-editor-ui-picker-modal.element.ts @@ -18,7 +18,7 @@ interface GroupedPropertyEditorUIs { } @customElement('umb-property-editor-ui-picker-modal') export class UmbPropertyEditorUIPickerModalElement extends UmbLitElement { - + @property({ type: Object }) data?: UmbPropertyEditorUIPickerModalData; @@ -89,13 +89,13 @@ export class UmbPropertyEditorUIPickerModalElement extends UmbLitElement { render() { return html` - + ${this._renderFilter()} ${this._renderGrid()}
-
+ `; } @@ -131,7 +131,7 @@ export class UmbPropertyEditorUIPickerModalElement extends UmbLitElement { )} `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid-inner-test.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid-inner-test.element.ts index 346b7aba1c..97e307d8fa 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid-inner-test.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid-inner-test.element.ts @@ -1,7 +1,7 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; @@ -10,8 +10,6 @@ import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco- */ @customElement('umb-property-editor-ui-block-grid-inner-test') export class UmbPropertyEditorUIBlockGridInnerTestElement extends UmbLitElement { - - @property({ type: String }) public name = ''; @@ -22,14 +20,13 @@ export class UmbPropertyEditorUIBlockGridInnerTestElement extends UmbLitElement private _activePath: string | undefined; @state() - private _routes: IRoute[] = [ + private _routes: UmbRoute[] = [ { path: 'inner-1', component: () => { return import('./property-editor-ui-block-grid-inner-test.element'); }, - setup: (component, info) => { - console.log('block route inner', info); + setup: (component) => { if (component instanceof HTMLElement) { (component as any).name = 'inner-1'; } @@ -37,12 +34,10 @@ export class UmbPropertyEditorUIBlockGridInnerTestElement extends UmbLitElement }, { path: 'inner-2', - //pathMatch: 'full', component: () => { return import('./property-editor-ui-block-grid-inner-test.element'); }, - setup: (component, info) => { - console.log('block route inner', info); + setup: (component) => { if (component instanceof HTMLElement) { (component as any).name = 'inner-2'; } @@ -76,7 +71,7 @@ export class UmbPropertyEditorUIBlockGridInnerTestElement extends UmbLitElement }}>
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts index 373c103153..fdce8edb53 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-grid/property-editor-ui-block-grid.element.ts @@ -4,18 +4,16 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { UmbVariantId } from '../../../../shared/variants/variant-id.class'; import { UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN } from '../../../../shared/components/workspace/workspace-variant/workspace-variant.context'; import { UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN } from '../../../../shared/components/workspace-property/workspace-property.context'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import type { UmbRouterSlotChangeEvent, UmbRouterSlotInitEvent } from '@umbraco-cms/internal/router'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-block-grid */ @customElement('umb-property-editor-ui-block-grid') -export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implements UmbPropertyEditorElement { - - +export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { private _variantContext?: typeof UMB_WORKSPACE_VARIANT_CONTEXT_TOKEN.TYPE; @property() @@ -25,7 +23,7 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement public config = []; @state() - private _routes: IRoute[] = []; + private _routes: UmbRoute[] = []; @state() private _routerPath: string | undefined; @@ -56,8 +54,7 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement component: () => { return import('./property-editor-ui-block-grid-inner-test.element'); }, - setup: (component, info) => { - console.log('block route', info); + setup: (component) => { if (component instanceof HTMLElement) { (component as any).name = 'block-grid-1'; } @@ -65,12 +62,10 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement }, { path: 'modal-2', - //pathMatch: 'full', component: () => { return import('./property-editor-ui-block-grid-inner-test.element'); }, - setup: (component, info) => { - console.log('block route', info); + setup: (component) => { if (component instanceof HTMLElement) { (component as any).name = 'block-grid-2'; } @@ -110,7 +105,7 @@ export class UmbPropertyEditorUIBlockGridElement extends UmbLitElement implement ` : 'loading...'; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-list/property-editor-ui-block-list.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-list/property-editor-ui-block-list.element.ts index 812dad8b2e..29491255de 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-list/property-editor-ui-block-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/block-list/property-editor-ui-block-list.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-block-list */ @customElement('umb-property-editor-ui-block-list') -export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUIBlockListElement extends UmbLitElement implement render() { return html`
umb-property-editor-ui-block-list
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts index 4a7d1be5d6..5b6ec0a179 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/checkbox-list/property-editor-ui-checkbox-list.element.ts @@ -2,7 +2,7 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { UmbInputCheckboxListElement } from '../../../components/input-checkbox-list/input-checkbox-list.element'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; @@ -10,8 +10,8 @@ import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/ * @element umb-property-editor-ui-checkbox-list */ @customElement('umb-property-editor-ui-checkbox-list') -export class UmbPropertyEditorUICheckboxListElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUICheckboxListElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + #value: Array = []; @property({ type: Array }) @@ -57,7 +57,7 @@ export class UmbPropertyEditorUICheckboxListElement extends UmbLitElement implem .selectedIds="${this.#value}" .list="${this._list}">`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts index 436e7a4575..d860a60012 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts @@ -2,7 +2,7 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { UUIColorSwatchesEvent } from '@umbraco-ui/uui'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; import type { SwatchDetails } from '@umbraco-cms/backoffice/models'; @@ -11,8 +11,8 @@ import type { SwatchDetails } from '@umbraco-cms/backoffice/models'; * @element umb-property-editor-ui-color-picker */ @customElement('umb-property-editor-ui-color-picker') -export class UmbPropertyEditorUIColorPickerElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIColorPickerElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -43,7 +43,7 @@ export class UmbPropertyEditorUIColorPickerElement extends UmbLitElement impleme .swatches="${this._swatches}" .showLabels="${this._showLabels}">`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/date-picker/property-editor-ui-date-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/date-picker/property-editor-ui-date-picker.element.ts index 2efa0b7ce1..5a5fda058f 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/date-picker/property-editor-ui-date-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/date-picker/property-editor-ui-date-picker.element.ts @@ -3,16 +3,15 @@ import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { InputType } from '@umbraco-ui/uui'; import { UmbPropertyValueChangeEvent } from '../..'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement , PropertyEditorConfigDefaultData } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { PropertyEditorConfigDefaultData } from '@umbraco-cms/backoffice/extensions-registry'; /** * @element umb-property-editor-ui-date-picker */ @customElement('umb-property-editor-ui-date-picker') -export class UmbPropertyEditorUIDatePickerElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIDatePickerElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + private _value?: Date; private _valueString?: string; @@ -81,7 +80,7 @@ export class UmbPropertyEditorUIDatePickerElement extends UmbLitElement implemen .value=${this._valueString} label="Pick a date or time">`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element.ts index d2e02efa43..9953c982f3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element.ts @@ -1,13 +1,16 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import type { UmbInputDocumentPickerElement } from '../../../components/input-document-picker/input-document-picker.element'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import '../../../components/input-document-picker/input-document-picker.element'; import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-property-editor-ui-document-picker') -export class UmbPropertyEditorUIContentPickerElement extends UmbLitElement implements UmbPropertyEditorElement { +export class UmbPropertyEditorUIContentPickerElement + extends UmbLitElement + implements UmbPropertyEditorExtensionElement +{ private _value: Array = []; @property({ type: Array }) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/dropdown/property-editor-ui-dropdown.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/dropdown/property-editor-ui-dropdown.element.ts index ce103b1e32..a9cbe55149 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/dropdown/property-editor-ui-dropdown.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/dropdown/property-editor-ui-dropdown.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-dropdown */ @customElement('umb-property-editor-ui-dropdown') -export class UmbPropertyEditorUIDropdownElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIDropdownElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUIDropdownElement extends UmbLitElement implements render() { return html`
umb-property-editor-ui-dropdown
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/eye-dropper/property-editor-ui-eye-dropper.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/eye-dropper/property-editor-ui-eye-dropper.element.ts index d6fe2ba4c3..99f55f01f3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/eye-dropper/property-editor-ui-eye-dropper.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/eye-dropper/property-editor-ui-eye-dropper.element.ts @@ -2,7 +2,7 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { UUIColorPickerChangeEvent } from '@umbraco-ui/uui'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; @@ -10,8 +10,8 @@ import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/ * @element umb-property-editor-ui-eye-dropper */ @customElement('umb-property-editor-ui-eye-dropper') -export class UmbPropertyEditorUIEyeDropperElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIEyeDropperElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -42,7 +42,7 @@ export class UmbPropertyEditorUIEyeDropperElement extends UmbLitElement implemen .swatches=${this._swatches} .opacity="${this._opacity}">`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts index 6b449cfd86..a737fd7816 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/icon-picker/property-editor-ui-icon-picker.element.ts @@ -1,7 +1,7 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_ICON_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -9,8 +9,8 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; * @element umb-property-editor-ui-icon-picker */ @customElement('umb-property-editor-ui-icon-picker') -export class UmbPropertyEditorUIIconPickerElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIIconPickerElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -42,7 +42,7 @@ export class UmbPropertyEditorUIIconPickerElement extends UmbLitElement implemen `; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/image-cropper/property-editor-ui-image-cropper.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/image-cropper/property-editor-ui-image-cropper.element.ts index 50b9ece7fa..e6561e8ffc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/image-cropper/property-editor-ui-image-cropper.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/image-cropper/property-editor-ui-image-cropper.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-image-cropper */ @customElement('umb-property-editor-ui-image-cropper') -export class UmbPropertyEditorUIImageCropperElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIImageCropperElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUIImageCropperElement extends UmbLitElement implem render() { return html`
umb-property-editor-ui-image-cropper
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts index 214c373e3f..2e07e6f3fa 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts @@ -1,7 +1,7 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** @@ -10,9 +10,9 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-property-editor-ui-image-crops-configuration') export class UmbPropertyEditorUIImageCropsConfigurationElement extends UmbLitElement - implements UmbPropertyEditorElement + implements UmbPropertyEditorExtensionElement { - + @property() value = ''; @@ -23,7 +23,7 @@ export class UmbPropertyEditorUIImageCropsConfigurationElement render() { return html`
umb-property-editor-ui-image-crops-configuration
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/label/property-editor-ui-label.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/label/property-editor-ui-label.element.ts index 02b207b9a2..fcb662aaa5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/label/property-editor-ui-label.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/label/property-editor-ui-label.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-label */ @customElement('umb-property-editor-ui-label') -export class UmbPropertyEditorUILabelElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUILabelElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUILabelElement extends UmbLitElement implements Um render() { return html`
umb-property-editor-ui-label
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/markdown-editor/property-editor-ui-markdown-editor.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/markdown-editor/property-editor-ui-markdown-editor.element.ts index 8be60cda1c..3c58d3d278 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/markdown-editor/property-editor-ui-markdown-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/markdown-editor/property-editor-ui-markdown-editor.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-markdown-editor */ @customElement('umb-property-editor-ui-markdown-editor') -export class UmbPropertyEditorUIMarkdownEditorElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIMarkdownEditorElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUIMarkdownEditorElement extends UmbLitElement impl render() { return html`
umb-property-editor-ui-markdown-editor
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/media-picker/property-editor-ui-media-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/media-picker/property-editor-ui-media-picker.element.ts index fe81fe9792..a50c76f135 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/media-picker/property-editor-ui-media-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/media-picker/property-editor-ui-media-picker.element.ts @@ -1,7 +1,7 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UmbInputMediaPickerElement } from '../../../../../backoffice/shared/components/input-media-picker/input-media-picker.element'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; @@ -9,7 +9,7 @@ import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/ * @element umb-property-editor-ui-media-picker */ @customElement('umb-property-editor-ui-media-picker') -export class UmbPropertyEditorUIMediaPickerElement extends UmbLitElement implements UmbPropertyEditorElement { +export class UmbPropertyEditorUIMediaPickerElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { private _value: Array = []; @property({ type: Array }) diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/member-group-picker/property-editor-ui-member-group-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/member-group-picker/property-editor-ui-member-group-picker.element.ts index 2d64cfa210..88a034b12c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/member-group-picker/property-editor-ui-member-group-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/member-group-picker/property-editor-ui-member-group-picker.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-member-group-picker */ @customElement('umb-property-editor-ui-member-group-picker') -export class UmbPropertyEditorUIMemberGroupPickerElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIMemberGroupPickerElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUIMemberGroupPickerElement extends UmbLitElement i render() { return html`
umb-property-editor-ui-member-group-picker
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/member-picker/property-editor-ui-member-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/member-picker/property-editor-ui-member-picker.element.ts index b704333f48..84f1750cc1 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/member-picker/property-editor-ui-member-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/member-picker/property-editor-ui-member-picker.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-member-picker */ @customElement('umb-property-editor-ui-member-picker') -export class UmbPropertyEditorUIMemberPickerElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIMemberPickerElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUIMemberPickerElement extends UmbLitElement implem render() { return html`
umb-property-editor-ui-member-picker
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts index 86b05cdce5..24922b8934 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts @@ -5,7 +5,7 @@ import type { UUIModalSidebarSize } from '@umbraco-ui/uui'; import { UmbInputMultiUrlPickerElement } from '../../../../shared/components/input-multi-url-picker/input-multi-url-picker.element'; import { UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN } from '../../../../shared/components/workspace-property/workspace-property.context'; import { UmbLinkPickerLink } from '@umbraco-cms/backoffice/modal'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -13,8 +13,8 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; * @element umb-property-editor-ui-multi-url-picker */ @customElement('umb-property-editor-ui-multi-url-picker') -export class UmbPropertyEditorUIMultiUrlPickerElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIMultiUrlPickerElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property({ type: Array }) value: UmbLinkPickerLink[] = []; @@ -87,7 +87,7 @@ export class UmbPropertyEditorUIMultiUrlPickerElement extends UmbLitElement impl .min=${this._minNumber} .urls="${this.value}">`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multiple-text-string/property-editor-ui-multiple-text-string.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multiple-text-string/property-editor-ui-multiple-text-string.element.ts index 6f8dc64a1f..c5a6594000 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multiple-text-string/property-editor-ui-multiple-text-string.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/multiple-text-string/property-editor-ui-multiple-text-string.element.ts @@ -5,7 +5,7 @@ import { UmbPropertyValueChangeEvent } from '../..'; import UmbInputMultipleTextStringElement, { MultipleTextStringValue, } from './input-multiple-text-string/input-multiple-text-string.element'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbChangeEvent } from '@umbraco-cms/backoffice/events'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -18,7 +18,10 @@ export type MultipleTextStringConfigData = Array<{ * @element umb-property-editor-ui-multiple-text-string */ @customElement('umb-property-editor-ui-multiple-text-string') -export class UmbPropertyEditorUIMultipleTextStringElement extends UmbLitElement implements UmbPropertyEditorElement { +export class UmbPropertyEditorUIMultipleTextStringElement + extends UmbLitElement + implements UmbPropertyEditorExtensionElement +{ @property({ type: Array }) public value: MultipleTextStringValue = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/number-range/property-editor-ui-number-range.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/number-range/property-editor-ui-number-range.element.ts index faa0c90cad..f62ee00637 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/number-range/property-editor-ui-number-range.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/number-range/property-editor-ui-number-range.element.ts @@ -2,7 +2,7 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import type { UmbInputNumberRangeElement } from '../../../../shared/components/input-number-range/input-number-range.element'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import '../../../../shared/components/input-number-range/input-number-range.element'; @@ -15,8 +15,8 @@ type ValueType = { * @element umb-property-editor-ui-number-range */ @customElement('umb-property-editor-ui-number-range') -export class UmbPropertyEditorUINumberRangeElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUINumberRangeElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property({ type: Object }) private _value: ValueType = { min: undefined, max: undefined }; @@ -51,7 +51,7 @@ export class UmbPropertyEditorUINumberRangeElement extends UmbLitElement impleme .maxValue=${this._maxValue} @change=${this._onChange}>`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/number/property-editor-ui-number.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/number/property-editor-ui-number.element.ts index 8bcabdce57..b6c60c6897 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/number/property-editor-ui-number.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/number/property-editor-ui-number.element.ts @@ -1,12 +1,12 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-property-editor-ui-number') -export class UmbPropertyEditorUINumberElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUINumberElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -22,7 +22,7 @@ export class UmbPropertyEditorUINumberElement extends UmbLitElement implements U render() { return html``; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/order-direction/property-editor-ui-order-direction.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/order-direction/property-editor-ui-order-direction.element.ts index 2326a65f3c..8ee8c90107 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/order-direction/property-editor-ui-order-direction.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/order-direction/property-editor-ui-order-direction.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-order-direction */ @customElement('umb-property-editor-ui-order-direction') -export class UmbPropertyEditorUIOrderDirectionElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIOrderDirectionElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUIOrderDirectionElement extends UmbLitElement impl render() { return html`
umb-property-editor-ui-order-direction
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/overlay-size/property-editor-ui-overlay-size.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/overlay-size/property-editor-ui-overlay-size.element.ts index 7a30aad0fd..cb540b42e2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/overlay-size/property-editor-ui-overlay-size.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/overlay-size/property-editor-ui-overlay-size.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-overlay-size */ @customElement('umb-property-editor-ui-overlay-size') -export class UmbPropertyEditorUIOverlaySizeElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIOverlaySizeElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUIOverlaySizeElement extends UmbLitElement impleme render() { return html`
umb-property-editor-ui-overlay-size
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/radio-button-list/property-editor-ui-radio-button-list.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/radio-button-list/property-editor-ui-radio-button-list.element.ts index 51fa7e0288..dea337da8e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/radio-button-list/property-editor-ui-radio-button-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/radio-button-list/property-editor-ui-radio-button-list.element.ts @@ -3,7 +3,7 @@ import { customElement, property, state } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import '../../../components/input-radio-button-list/input-radio-button-list.element'; import type { UmbInputRadioButtonListElement } from '../../../components/input-radio-button-list/input-radio-button-list.element'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; @@ -11,8 +11,8 @@ import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/ * @element umb-property-editor-ui-radio-button-list */ @customElement('umb-property-editor-ui-radio-button-list') -export class UmbPropertyEditorUIRadioButtonListElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIRadioButtonListElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + #value = ''; @property({ type: String }) @@ -59,7 +59,7 @@ export class UmbPropertyEditorUIRadioButtonListElement extends UmbLitElement imp .selectedKey="${this.#value}" .list="${this._list}">`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/slider/property-editor-ui-slider.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/slider/property-editor-ui-slider.element.ts index 5e8dfc75df..abeedaf49e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/slider/property-editor-ui-slider.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/slider/property-editor-ui-slider.element.ts @@ -2,7 +2,7 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import UmbInputSliderElement from '../../../../shared/components/input-slider/input-slider.element'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; @@ -10,8 +10,8 @@ import { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backe * @element umb-property-editor-ui-slider */ @customElement('umb-property-editor-ui-slider') -export class UmbPropertyEditorUISliderElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUISliderElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value: { @@ -81,7 +81,7 @@ export class UmbPropertyEditorUISliderElement extends UmbLitElement implements U ?enable-range=${this._enableRange} @change="${this._onChange}">`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tags/property-editor-ui-tags.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tags/property-editor-ui-tags.element.ts index 1c7255089f..935121c1f3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tags/property-editor-ui-tags.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tags/property-editor-ui-tags.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-tags */ @customElement('umb-property-editor-ui-tags') -export class UmbPropertyEditorUITagsElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUITagsElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUITagsElement extends UmbLitElement implements Umb render() { return html`
umb-property-editor-ui-tags
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/text-box/property-editor-ui-text-box.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/text-box/property-editor-ui-text-box.element.ts index ba23f7cc9c..6b90143ecd 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/text-box/property-editor-ui-text-box.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/text-box/property-editor-ui-text-box.element.ts @@ -1,12 +1,12 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-property-editor-ui-text-box') -export class UmbPropertyEditorUITextBoxElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUITextBoxElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -22,7 +22,7 @@ export class UmbPropertyEditorUITextBoxElement extends UmbLitElement implements render() { return html``; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/textarea/property-editor-ui-textarea.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/textarea/property-editor-ui-textarea.element.ts index 5ff0acbb59..b253800cfd 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/textarea/property-editor-ui-textarea.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/textarea/property-editor-ui-textarea.element.ts @@ -6,12 +6,12 @@ import { UmbWorkspacePropertyContext, UMB_WORKSPACE_PROPERTY_CONTEXT_TOKEN, } from '../../../../shared/components/workspace-property/workspace-property.context'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-property-editor-ui-textarea') -export class UmbPropertyEditorUITextareaElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUITextareaElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -37,7 +37,7 @@ export class UmbPropertyEditorUITextareaElement extends UmbLitElement implements render() { return html` `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tiny-mce/property-editor-ui-tiny-mce.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tiny-mce/property-editor-ui-tiny-mce.element.ts index 350698fbd5..8ddcd9f1a2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tiny-mce/property-editor-ui-tiny-mce.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tiny-mce/property-editor-ui-tiny-mce.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-tiny-mce */ @customElement('umb-property-editor-ui-tiny-mce') -export class UmbPropertyEditorUITinyMceElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUITinyMceElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUITinyMceElement extends UmbLitElement implements render() { return html`
umb-property-editor-ui-tiny-mce
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/toggle/property-editor-ui-toggle.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/toggle/property-editor-ui-toggle.element.ts index ee4552ae78..bbcbf4bee0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/toggle/property-editor-ui-toggle.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/toggle/property-editor-ui-toggle.element.ts @@ -2,7 +2,7 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import { UmbInputToggleElement } from '../../../components/input-toggle/input-toggle.element'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; @@ -10,8 +10,8 @@ import { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backe * @element umb-property-editor-ui-toggle */ @customElement('umb-property-editor-ui-toggle') -export class UmbPropertyEditorUIToggleElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIToggleElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = false; @@ -53,7 +53,7 @@ export class UmbPropertyEditorUIToggleElement extends UmbLitElement implements U ?showLabels="${this._showLabels}" @change="${this._onChange}">`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tree-picker/property-editor-ui-tree-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tree-picker/property-editor-ui-tree-picker.element.ts index 2054afaf0a..f17ee0500e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tree-picker/property-editor-ui-tree-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/tree-picker/property-editor-ui-tree-picker.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-tree-picker */ @customElement('umb-property-editor-ui-tree-picker') -export class UmbPropertyEditorUITreePickerElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUITreePickerElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUITreePickerElement extends UmbLitElement implemen render() { return html`
umb-property-editor-ui-tree-picker
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/upload-field/property-editor-ui-upload-field.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/upload-field/property-editor-ui-upload-field.element.ts index 794cb99568..86900c1680 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/upload-field/property-editor-ui-upload-field.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/upload-field/property-editor-ui-upload-field.element.ts @@ -3,15 +3,15 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property, state } from 'lit/decorators.js'; import { UmbInputUploadFieldElement } from '../../../../shared/components/input-upload-field/input-upload-field.element'; import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import type { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-upload-field */ @customElement('umb-property-editor-ui-upload-field') -export class UmbPropertyEditorUIUploadFieldElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIUploadFieldElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -42,7 +42,7 @@ export class UmbPropertyEditorUIUploadFieldElement extends UmbLitElement impleme ?multiple="${this._multiple}" .fileExtensions="${this._fileExtensions}">`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/user-picker/property-editor-ui-user-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/user-picker/property-editor-ui-user-picker.element.ts index f06c25f5bc..a836743822 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/user-picker/property-editor-ui-user-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/user-picker/property-editor-ui-user-picker.element.ts @@ -1,26 +1,25 @@ import { html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-user-picker */ @customElement('umb-property-editor-ui-user-picker') -export class UmbPropertyEditorUIUserPickerElement extends UmbLitElement implements UmbPropertyEditorElement { - - +export class UmbPropertyEditorUIUserPickerElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { @property() value = ''; @property({ type: Array, attribute: false }) public config = []; + // TODO: implement config render() { - return html`
umb-property-editor-ui-user-picker
`; + return html` `; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/value-type/property-editor-ui-value-type.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/value-type/property-editor-ui-value-type.element.ts index 919321a3a4..df2b219321 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/value-type/property-editor-ui-value-type.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/value-type/property-editor-ui-value-type.element.ts @@ -1,15 +1,15 @@ import { html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; -import { UmbPropertyEditorElement } from '@umbraco-cms/backoffice/property-editor'; +import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; /** * @element umb-property-editor-ui-value-type */ @customElement('umb-property-editor-ui-value-type') -export class UmbPropertyEditorUIValueTypeElement extends UmbLitElement implements UmbPropertyEditorElement { - +export class UmbPropertyEditorUIValueTypeElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { + @property() value = ''; @@ -20,7 +20,7 @@ export class UmbPropertyEditorUIValueTypeElement extends UmbLitElement implement render() { return html`
umb-property-editor-ui-value-type
`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/components/file-system-tree-item/file-system-tree-item.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/components/file-system-tree-item/file-system-tree-item.element.ts index 99f586c419..1f44e92dee 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/components/file-system-tree-item/file-system-tree-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/components/file-system-tree-item/file-system-tree-item.element.ts @@ -1,6 +1,7 @@ import { css, html, nothing } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, property } from 'lit/decorators.js'; +import { UmbTreeItemElement } from '../../../../backoffice/shared/components/tree/tree-item/tree-item.element'; import { UmbFileSystemTreeItemContext } from './file-system-tree-item.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { ManifestKind } from '@umbraco-cms/backoffice/extensions-registry'; @@ -21,7 +22,7 @@ const manifest: ManifestKind = { umbExtensionsRegistry.register(manifest); @customElement('umb-file-system-tree-item') -export class UmbFileSystemTreeItemElement extends UmbLitElement { +export class UmbFileSystemTreeItemElement extends UmbLitElement implements UmbTreeItemElement { private _item?: FileSystemTreeItemPresentationModel; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts index 6ce1917236..8656c35eea 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/sources/stylesheet.server.data.ts @@ -8,7 +8,7 @@ import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; * @class UmbStylesheetServerDataSource * @implements {UmbStylesheetServerDataSource} */ -export class UmbStylesheetServerDataSource implements UmbDataSource { +export class UmbStylesheetServerDataSource implements UmbDataSource { #host: UmbControllerHostElement; /** diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/manifests.ts index ad0675cf06..29bc690564 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/manifests.ts @@ -1,7 +1,7 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -14,7 +14,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceActions: Array = []; export const manifests = [workspace, ...workspaceViews, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace-edit.element.ts index 2de5896840..d8e0fda3ca 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace-edit.element.ts @@ -4,12 +4,12 @@ import { customElement } from 'lit/decorators.js'; @customElement('umb-stylesheet-workspace-edit') export class UmbStylesheetWorkspaceEditElement extends LitElement { - + render() { - return html` Stylesheet workspace `; + return html` Stylesheet workspace `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.element.ts index b3026afaa7..8a79c69d92 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/workspace/stylesheet-workspace.element.ts @@ -4,18 +4,16 @@ import { customElement, state } from 'lit/decorators.js'; import { serverFilePathFromUrlFriendlyPath } from '../../utils'; import { UmbStylesheetWorkspaceEditElement } from './stylesheet-workspace-edit.element'; import { UmbStylesheetWorkspaceContext } from './stylesheet-workspace.context'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-stylesheet-workspace') export class UmbStylesheetWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbStylesheetWorkspaceContext(this); #element = new UmbStylesheetWorkspaceEditElement(); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'edit/:path', component: () => this.#element, @@ -30,7 +28,7 @@ export class UmbStylesheetWorkspaceElement extends UmbLitElement { render() { return html` `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts index 5fdffe4c7e..db607996bc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.detail.server.data.ts @@ -1,4 +1,4 @@ -import { v4 as uuid } from 'uuid'; +import { UmbId } from '@umbraco-cms/backoffice/id'; import { TemplateResponseModel, TemplateResource, @@ -16,7 +16,7 @@ import type { UmbDataSource } from '@umbraco-cms/backoffice/repository'; * @implements {TemplateDetailDataSource} */ export class UmbTemplateDetailServerDataSource - implements UmbDataSource + implements UmbDataSource { #host: UmbControllerHostElement; @@ -49,7 +49,7 @@ export class UmbTemplateDetailServerDataSource const error = undefined; const data: TemplateResponseModel = { $type: '', - id: uuid(), + id: UmbId.new(), name: '', alias: '', content: '', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts index ee94417b50..d3c96eda1a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/sources/template.tree.server.data.ts @@ -1,6 +1,6 @@ -import { TemplateTreeDataSource } from '.'; -import { ProblemDetailsModel, TemplateResource } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { TemplateTreeDataSource } from '.'; +import { TemplateResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -38,8 +38,7 @@ export class UmbTemplateTreeServerDataSource implements TemplateTreeDataSource { */ async getChildrenOf(parentId: string | null) { if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { error }; + throw new Error('Parent id is missing'); } return tryExecuteAndNotify( @@ -58,8 +57,7 @@ export class UmbTemplateTreeServerDataSource implements TemplateTreeDataSource { */ async getItems(ids: Array) { if (!ids) { - const error: ProblemDetailsModel = { title: 'Ids are missing' }; - return { error }; + throw new Error('Ids are missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts index 24a0663004..c4cbd48566 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.repository.ts @@ -3,12 +3,11 @@ import { UmbTemplateTreeServerDataSource } from './sources/template.tree.server. import { UmbTemplateStore, UMB_TEMPLATE_STORE_CONTEXT_TOKEN } from './template.store'; import { UmbTemplateTreeStore, UMB_TEMPLATE_TREE_STORE_CONTEXT_TOKEN } from './template.tree.store'; import type { UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { CreateTemplateRequestModel, - ProblemDetailsModel, TemplateResponseModel, UpdateTemplateRequestModel, } from '@umbraco-cms/backoffice/backend-api'; @@ -69,8 +68,7 @@ export class UmbTemplateRepository await this.#init; if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { data: undefined, error }; + throw new Error('Parent id is missing'); } const { data, error } = await this.#treeDataSource.getChildrenOf(parentId); @@ -86,8 +84,7 @@ export class UmbTemplateRepository await this.#init; if (!ids) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { data: undefined, error }; + throw new Error('Ids are missing'); } const { data, error } = await this.#treeDataSource.getItems(ids); @@ -129,8 +126,7 @@ export class UmbTemplateRepository // TODO: should we show a notification if the id is missing? // Investigate what is best for Acceptance testing, cause in that perspective a thrown error might be the best choice? if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } const { data, error } = await this.#detailDataSource.get(id); @@ -140,6 +136,11 @@ export class UmbTemplateRepository return { data, error }; } + async byId(id: string) { + if (!id) throw new Error('Key is missing'); + await this.#init; + return this.#store!.byId(id); + } // Could potentially be general methods: diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts index d6e9a4589a..cf3d33a7a4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/repository/template.store.ts @@ -29,6 +29,15 @@ export class UmbTemplateStore extends UmbStoreBase { this._data.append([template]); } + /** + * Retrieve a template from the store + * @param {string} id + * @memberof UmbTemplateStore + */ + byId(id: TemplateResponseModel['id']) { + return this._data.getObservablePart((x) => x.find((y) => y.id === id)); + } + /** * Removes templates in the store with the given uniques * @param {string[]} uniques diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/manifests.ts index d981f5f1e9..a4b34186fb 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/manifests.ts @@ -2,7 +2,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -15,7 +15,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceActions: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.element.ts index 0d44e8c0a4..502047c2d0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/templates/workspace/template-workspace.element.ts @@ -11,6 +11,8 @@ import { UmbTemplateWorkspaceContext } from './template-workspace.context'; @customElement('umb-template-workspace') export class UmbTemplateWorkspaceElement extends UmbLitElement { + + public load(entityId: string) { this.#templateWorkspaceContext.load(entityId); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/umbraco-package.ts index b0ee024d06..ac55237077 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/umbraco-package.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/umbraco-package.ts @@ -1,5 +1,4 @@ export const name = 'Umbraco.Core.Templating'; -export const version = '0.0.1'; export const extensions = [ { name: 'Templating Entry Point', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts index 8ee8ddda86..204653d4c0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.repository.ts @@ -9,7 +9,6 @@ import { CreateDictionaryItemRequestModel, DictionaryOverviewResponseModel, ImportDictionaryRequestModel, - ProblemDetailsModel, UpdateDictionaryItemRequestModel, } from '@umbraco-cms/backoffice/backend-api'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; @@ -19,6 +18,7 @@ export class UmbDictionaryRepository UmbTreeRepository, UmbDetailRepository< CreateDictionaryItemRequestModel, + any, UpdateDictionaryItemRequestModel, DictionaryOverviewResponseModel > @@ -73,8 +73,7 @@ export class UmbDictionaryRepository await this.#init; if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { data: undefined, error }; + throw new Error('Parent id is missing'); } const { data, error } = await this.#treeSource.getChildrenOf(parentId); @@ -90,8 +89,7 @@ export class UmbDictionaryRepository await this.#init; if (!ids) { - const error: ProblemDetailsModel = { title: 'Keys are missing' }; - return { data: undefined, error }; + throw new Error('Ids are missing'); } const { data, error } = await this.#treeSource.getItems(ids); @@ -134,6 +132,12 @@ export class UmbDictionaryRepository return { data, error }; } + async byId(id: string) { + if (!id) throw new Error('Key is missing'); + await this.#init; + return this.#detailStore!.byId(id); + } + async list(skip = 0, take = 1000) { await this.#init; return this.#detailSource.list(skip, take); @@ -171,8 +175,7 @@ export class UmbDictionaryRepository await this.#init; if (!detail.name) { - const error: ProblemDetailsModel = { title: 'Name is missing' }; - return { error }; + throw new Error('Name is missing'); } const { data, error } = await this.#detailSource.insert(detail); @@ -189,8 +192,7 @@ export class UmbDictionaryRepository await this.#init; if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } return this.#detailSource.export(id, includeChildren); @@ -200,8 +202,7 @@ export class UmbDictionaryRepository await this.#init; if (!temporaryFileId) { - const error: ProblemDetailsModel = { title: 'File is missing' }; - return { error }; + throw new Error('Temporary file id is missing'); } return this.#detailSource.import(temporaryFileId, parentId); @@ -211,8 +212,7 @@ export class UmbDictionaryRepository await this.#init; if (!formData) { - const error: ProblemDetailsModel = { title: 'Form data is missing' }; - return { error }; + throw new Error('Form data is missing'); } return this.#detailSource.upload(formData); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts index 94347f6a59..67a7c011ff 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/dictionary.store.ts @@ -23,6 +23,15 @@ export class UmbDictionaryStore extends UmbStoreBase { this._data.append([dictionary]); } + /** + * Retrieve a dictionary item from the store + * @param {string} id + * @memberof UmbDictionaryStore + */ + byId(id: DictionaryItemResponseModel['id']) { + return this._data.getObservablePart((x) => x.find((y) => y.id === id)); + } + remove(uniques: string[]) { this._data.remove(uniques); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts index 3479db2d77..56f99243c4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.detail.server.data.ts @@ -1,5 +1,5 @@ -import { v4 as uuidv4 } from 'uuid'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { CreateDictionaryItemRequestModel, @@ -7,10 +7,9 @@ import { DictionaryResource, ImportDictionaryRequestModel, LanguageResource, - ProblemDetailsModel, UpdateDictionaryItemRequestModel, } from '@umbraco-cms/backoffice/backend-api'; -import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; +import type { UmbDataSource } from '@umbraco-cms/backoffice/repository'; /** * @description - A data source for the Dictionary detail that fetches data from the server @@ -20,7 +19,7 @@ import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; */ export class UmbDictionaryDetailServerDataSource implements - UmbDataSource + UmbDataSource { #host: UmbControllerHostElement; @@ -36,7 +35,7 @@ export class UmbDictionaryDetailServerDataSource */ async createScaffold(parentId?: string | null, name?: string) { const data = { - id: uuidv4(), + id: UmbId.new(), parentId, name, translations: [], @@ -97,8 +96,7 @@ export class UmbDictionaryDetailServerDataSource */ async delete(id: string) { if (!id) { - const error: ProblemDetailsModel = { title: 'Key is missing' }; - return { error }; + throw new Error('Id is missing'); } return await tryExecuteAndNotify(this.#host, DictionaryResource.deleteDictionaryById({ id })); @@ -149,6 +147,6 @@ export class UmbDictionaryDetailServerDataSource // TODO => temp until language service exists. Need languages as the dictionary response // includes the translated iso codes only, no friendly names and no way to tell if a dictionary // is missing a translation - return await tryExecuteAndNotify(this.#host, LanguageResource.getLanguage({ skip: 0, take: 1000 })); + return tryExecuteAndNotify(this.#host, LanguageResource.getLanguage({ skip: 0, take: 1000 })); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts index e9d5ab9a40..58a3a71d71 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/repository/sources/dictionary.tree.server.data.ts @@ -1,6 +1,6 @@ -import { DictionaryResource, ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; +import { DictionaryResource } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import type { UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -38,8 +38,7 @@ export class UmbDictionaryTreeServerDataSource implements UmbTreeDataSource { */ async getChildrenOf(parentId: string | null) { if (!parentId) { - const error: ProblemDetailsModel = { title: 'Parent id is missing' }; - return { error }; + throw new Error('Parent id is missing'); } return tryExecuteAndNotify( @@ -58,8 +57,7 @@ export class UmbDictionaryTreeServerDataSource implements UmbTreeDataSource { */ async getItems(ids: Array) { if (!ids || ids.length === 0) { - const error: ProblemDetailsModel = { title: 'Ids are missing' }; - return { error }; + throw new Error('Ids are missing'); } return tryExecuteAndNotify( diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace-edit.element.ts index e03da52678..12a0155a1a 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace-edit.element.ts @@ -8,7 +8,7 @@ import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-ap @customElement('umb-dictionary-workspace-edit') export class UmbDictionaryWorkspaceEditElement extends UmbLitElement { - + @state() private _name?: string | null = ''; @@ -42,17 +42,17 @@ export class UmbDictionaryWorkspaceEditElement extends UmbLitElement { render() { return html` - + - + `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.element.ts index 692759b71b..25cfa618d9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/dictionary-workspace.element.ts @@ -3,18 +3,16 @@ import { html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbDictionaryWorkspaceContext } from './dictionary-workspace.context'; import { UmbDictionaryWorkspaceEditElement } from './dictionary-workspace-edit.element'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-dictionary-workspace') export class UmbWorkspaceDictionaryElement extends UmbLitElement { - - #workspaceContext = new UmbDictionaryWorkspaceContext(this); #element = new UmbDictionaryWorkspaceEditElement(); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'edit/:id', component: () => this.#element, @@ -28,7 +26,7 @@ export class UmbWorkspaceDictionaryElement extends UmbLitElement { render() { return html` `; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/manifests.ts index 0b91eb6fec..a399d2d5fe 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/dictionary/workspace/manifests.ts @@ -3,7 +3,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspaceAlias = 'Umb.Workspace.Dictionary'; @@ -18,9 +18,9 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = [ +const workspaceViews: Array = [ { - type: 'workspaceView', + type: 'workspaceEditorView', alias: 'Umb.WorkspaceView.Dictionary.Edit', name: 'Dictionary Workspace Edit View', loader: () => import('./views/edit/workspace-view-dictionary-edit.element'), diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/translation/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/backoffice/translation/umbraco-package.ts index ff271b5e32..1bb22e40e6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/translation/umbraco-package.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/translation/umbraco-package.ts @@ -1,5 +1,4 @@ export const name = 'Umbraco.Core.TranslationManagement'; -export const version = '0.0.1'; export const extensions = [ { name: 'Translation Entry Point', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/index.ts new file mode 100644 index 0000000000..a4503b4b0a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/index.ts @@ -0,0 +1,19 @@ +import { UmbEntrypointOnInit } from '@umbraco-cms/backoffice/extensions-api'; +import { ManifestDashboard } from '@umbraco-cms/backoffice/extensions-registry'; + +const dashboard: ManifestDashboard = { + type: 'dashboard', + alias: 'Umb.Dashboard.UmbracoNews', + name: 'Umbraco News Dashboard', + loader: () => import('./umbraco-news-dashboard.element'), + weight: 20, + meta: { + label: 'Welcome', + pathname: 'welcome', + }, + conditions: { + sections: ['Umb.Section.Content'], + }, +}; + +export const onInit: UmbEntrypointOnInit = (_host, extensionRegistry) => extensionRegistry.register(dashboard); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/welcome/dashboard-welcome.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/umbraco-news-dashboard.element.ts similarity index 69% rename from src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/welcome/dashboard-welcome.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/umbraco-news-dashboard.element.ts index 7445e1ed95..5f04bc0463 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/dashboards/welcome/dashboard-welcome.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/umbraco-news-dashboard.element.ts @@ -2,10 +2,8 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html, LitElement } from 'lit'; import { customElement } from 'lit/decorators.js'; -@customElement('umb-dashboard-welcome') -export class UmbDashboardWelcomeElement extends LitElement { - - +@customElement('umb-umbraco-news-dashboard') +export class UmbUmbracoNewsDashboardElement extends LitElement { render() { return html` @@ -14,7 +12,7 @@ export class UmbDashboardWelcomeElement extends LitElement { `; } - + static styles = [ UUITextStyles, css` @@ -26,10 +24,10 @@ export class UmbDashboardWelcomeElement extends LitElement { ]; } -export default UmbDashboardWelcomeElement; +export default UmbUmbracoNewsDashboardElement; declare global { interface HTMLElementTagNameMap { - 'umb-dashboard-welcome': UmbDashboardWelcomeElement; + 'umb-umbraco-news-dashboard': UmbUmbracoNewsDashboardElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/umbraco-news-dashboard.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/umbraco-news-dashboard.stories.ts new file mode 100644 index 0000000000..ff3205e00d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/umbraco-news-dashboard.stories.ts @@ -0,0 +1,16 @@ +import './umbraco-news-dashboard.element'; + +import { Meta, Story } from '@storybook/web-components'; +import { html } from 'lit'; + +import type { UmbUmbracoNewsDashboardElement } from './umbraco-news-dashboard.element'; + +export default { + title: 'Dashboards/Umbraco News', + component: 'umb-umbraco-news-dashboard', + id: 'umb-umbraco-news-dashboard', +} as Meta; + +export const AAAOverview: Story = () => + html` `; +AAAOverview.storyName = 'Overview'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/umbraco-package.ts new file mode 100644 index 0000000000..b58a7d782b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/umbraco-news/umbraco-package.ts @@ -0,0 +1,9 @@ +export const name = 'Umbraco.Core.UmbracoNews'; +export const extensions = [ + { + name: 'Umbraco News Entry Point', + alias: 'Umb.EntryPoint.UmbracoNews', + type: 'entryPoint', + loader: () => import('./index'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user.store.ts index cf4823147e..e693f62bc0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user.store.ts @@ -1,5 +1,3 @@ -import { umbUsersData } from '../../../core/mocks/data/users.data'; -import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; @@ -7,27 +5,6 @@ import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; export const UMB_CURRENT_USER_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbCurrentUserStore'); export class UmbCurrentUserStore { - //TODO: Temp solution to get a current user. Replace when we have a real user service - private _currentUser = new UmbObjectState(umbUsersData.getAll()[0]); - public readonly currentUser = this._currentUser.asObservable(); - - /** - * logs out the user - * @public - * @memberof UmbCurrentUserService - */ - public logout(): void { - fetch(umbracoPath('/user/logout').toString()) - .then((res) => res.json()) - .then((data) => { - console.log('User Logged out', data); - }); - } - - public get isAdmin(): boolean { - //TODO: Find a way to figure out if current user is in the admin group - const adminUserGroupKey = 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1'; - const currentUser = this._currentUser.getValue(); - return currentUser ? currentUser.userGroups.includes(adminUserGroupKey) : false; - } + #currentUser = new UmbObjectState(undefined); + public readonly currentUser = this.#currentUser.asObservable(); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts index 78bb4d041a..7e1a194704 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts @@ -8,8 +8,6 @@ import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-current-user-modal') export class UmbCurrentUserModalElement extends UmbLitElement { - - @property({ attribute: false }) modalHandler?: UmbModalHandler; @@ -42,12 +40,12 @@ export class UmbCurrentUserModalElement extends UmbLitElement { } private _logout() { - this._currentUserStore?.logout(); + alert('implement log out'); } render() { return html` - +
@@ -55,10 +53,10 @@ export class UmbCurrentUserModalElement extends UmbLitElement { Close Logout -
+ `; } - + static styles: CSSResultGroup = [ UUITextStyles, css` @@ -67,7 +65,7 @@ export class UmbCurrentUserModalElement extends UmbLitElement { color: var(--uui-color-text); } :host, - umb-workspace-layout { + umb-workspace-editor { width: 100%; height: 100%; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts index 3c54bf51c1..c13879a26b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts @@ -8,8 +8,6 @@ import { UmbModalContext, UMB_CHANGE_PASSWORD_MODAL, UMB_MODAL_CONTEXT_TOKEN } f @customElement('umb-user-profile-app-profile') export class UmbUserProfileAppProfileElement extends UmbLitElement { - - @state() private _currentUser?: UserDetails; @@ -48,8 +46,9 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement { private _changePassword() { if (!this._modalContext) return; + // TODO: check if current user is admin this._modalContext.open(UMB_CHANGE_PASSWORD_MODAL, { - requireOldPassword: this._currentUserStore?.isAdmin || false, + requireOldPassword: false, }); } @@ -62,7 +61,7 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement { `; } - + static styles = [UUITextStyles, css``]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/index.ts index 4886cd3909..5beff8aad8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/index.ts @@ -8,8 +8,10 @@ import { UmbCurrentUserHistoryStore, UMB_CURRENT_USER_HISTORY_STORE_CONTEXT_TOKEN, } from './current-user/current-user-history.store'; -import { UmbEntrypointOnInit } from '@umbraco-cms/backoffice/extensions-api'; import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-api'; +import { UmbEntrypointOnInit } from '@umbraco-cms/backoffice/extensions-api'; + +import './users/components'; export const manifests = [...userGroupManifests, ...userManifests, ...userSectionManifests, ...currentUserManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/manifests.ts index dd709645d0..9d27c3c675 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/manifests.ts @@ -1,5 +1,6 @@ import { manifests as repositoryManifests } from './repository/manifests'; import { manifests as workspaceManifests } from './workspace/manifests'; import { manifests as modalManifests } from './modals/manifests'; +import { manifests as sectionViewManifests } from './section-view/manifests'; -export const manifests = [...repositoryManifests, ...workspaceManifests, ...modalManifests]; +export const manifests = [...repositoryManifests, ...workspaceManifests, ...modalManifests, ...sectionViewManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts index d85c609eb1..537d541997 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts @@ -7,7 +7,7 @@ import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; @customElement('umb-user-group-picker-modal') export class UmbUserGroupPickerModalElement extends UmbModalElementPickerBase { - + @state() private _userGroups: Array = []; @@ -29,7 +29,7 @@ export class UmbUserGroupPickerModalElement extends UmbModalElementPickerBase +
@@ -51,10 +51,10 @@ export class UmbUserGroupPickerModalElement extends UmbModalElementPickerBase - +
`; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/section-view/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/section-view/manifests.ts new file mode 100644 index 0000000000..0da2fefcd3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/section-view/manifests.ts @@ -0,0 +1,22 @@ +import { UMB_USER_SECTION_ALIAS } from '../../user-section/manifests'; +import type { ManifestSectionView } from '@umbraco-cms/backoffice/extensions-registry'; + +const sectionsViews: Array = [ + { + type: 'sectionView', + alias: 'Umb.SectionView.UserGroups', + name: 'User Groups Section View', + loader: () => import('./section-view-user-groups.element'), + weight: 100, + meta: { + label: 'User Groups', + pathname: 'user-groups', + icon: 'umb:users', + }, + conditions: { + sections: [UMB_USER_SECTION_ALIAS], + }, + }, +]; + +export const manifests = [...sectionsViews]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/section-view-user-groups.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/section-view/section-view-user-groups.element.ts similarity index 88% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/section-view-user-groups.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/section-view/section-view-user-groups.element.ts index c5abab729c..e88fd795a5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/section-view-user-groups.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/section-view/section-view-user-groups.element.ts @@ -2,8 +2,9 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html, LitElement } from 'lit'; import { customElement } from 'lit/decorators.js'; -import './workspace-view-user-groups.element'; +import '../workspace/workspace-view-user-groups.element'; +//TODO: rename to user-groups-section-view @customElement('umb-section-view-user-groups') export class UmbSectionViewUserGroupsElement extends LitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/manifests.ts index 29a5252340..2245819fb2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/manifests.ts @@ -1,7 +1,7 @@ import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -14,7 +14,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceActions: Array = []; export const manifests = [workspace, ...workspaceViews, ...workspaceActions]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/user-group-table-name-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-table-name-column-layout.element.ts similarity index 91% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/user-group-table-name-column-layout.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-table-name-column-layout.element.ts index b60dc36c88..d4cd1361c5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/user-group-table-name-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-table-name-column-layout.element.ts @@ -1,6 +1,6 @@ import { html, LitElement } from 'lit'; import { customElement, property } from 'lit/decorators.js'; -import { UmbTableItem } from '../../../../shared/components/table'; +import { UmbTableItem } from '../../../shared/components/table'; @customElement('umb-user-group-table-name-column-layout') export class UmbUserGroupTableNameColumnLayoutElement extends LitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/user-group-table-sections-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-table-sections-column-layout.element.ts similarity index 94% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/user-group-table-sections-column-layout.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-table-sections-column-layout.element.ts index 9171aa8c25..fc84192558 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/user-group-table-sections-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-table-sections-column-layout.element.ts @@ -1,6 +1,6 @@ import { html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; -import { UmbTableItem } from '../../../../shared/components/table'; +import { UmbTableItem } from '../../../shared/components/table'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts index d803d7f7d8..edce7b010c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts @@ -8,14 +8,12 @@ import { UmbUserGroupWorkspaceContext } from './user-group-workspace.context'; import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import '../../../shared/components/input-user/input-user.element'; +import '../../users/components/user-input/user-input.element'; import '../../../shared/components/input-section/input-section.element'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @customElement('umb-user-group-workspace-edit') export class UmbUserGroupWorkspaceEditElement extends UmbLitElement { - - defaultPermissions: Array<{ name: string; permissions: Array<{ name: string; description: string; value: boolean }>; @@ -151,23 +149,23 @@ export class UmbUserGroupWorkspaceEditElement extends UmbLitElement { this.observe(this.#workspaceContext.data, (userGroup) => (this._userGroup = userGroup as any)); } - private _observeUsers() { - if (!this._userStore) return; + // private _observeUsers() { + // if (!this._userStore) return; - // TODO: Create method to only get users from this userGroup - // TODO: Find a better way to only call this once at the start - this.observe(this._userStore.getAll(), (users) => { - // TODO: handle if there is no users. - if (!this._userKeys && users.length > 0) { - const entityId = this.#workspaceContext?.getEntityId(); - if (!entityId) return; - this._userKeys = users.filter((user) => user.userGroups.includes(entityId)).map((user) => user.id); - //this._updateProperty('users', this._userKeys); - // TODO: make a method on the UmbWorkspaceUserGroupContext: - //this._workspaceContext.setUsers(); - } - }); - } + // // TODO: Create method to only get users from this userGroup + // // TODO: Find a better way to only call this once at the start + // this.observe(this._userStore.getAll(), (users) => { + // // TODO: handle if there is no users. + // if (!this._userKeys && users.length > 0) { + // const entityId = this.#workspaceContext?.getEntityId(); + // if (!entityId) return; + // this._userKeys = users.filter((user) => user.userGroups.includes(entityId)).map((user) => user.id); + // //this._updateProperty('users', this._userKeys); + // // TODO: make a method on the UmbWorkspaceUserGroupContext: + // //this._workspaceContext.setUsers(); + // } + // }); + // } private _updateUserKeys(userKeys: Array) { this._userKeys = userKeys; @@ -297,16 +295,16 @@ export class UmbUserGroupWorkspaceEditElement extends UmbLitElement { if (!this._userGroup) return nothing; return html` - +
${this.renderLeftColumn()}
${this.renderRightColumn()}
-
+ `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.element.ts index 89b05dd255..71b5921a47 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.element.ts @@ -7,12 +7,10 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspaceAction } from '@umbraco-cms/backoffice/extensions-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; @customElement('umb-user-group-workspace') export class UmbUserGroupWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbUserGroupWorkspaceContext(this); #element = new UmbUserGroupWorkspaceEditElement(); @@ -47,7 +45,7 @@ export class UmbUserGroupWorkspaceElement extends UmbLitElement { } @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { path: 'edit/:id', component: () => this.#element, @@ -61,7 +59,7 @@ export class UmbUserGroupWorkspaceElement extends UmbLitElement { render() { return html` `; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.test.ts deleted file mode 100644 index d7d85083ba..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -//TODO: Test has been commented out while we figure out how to setup import maps for the test environment -// import UmbWorkspaceUserGroupElement from './editor-user-group.element'; -// import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// describe('UmbWorkspaceUserGroupElement', () => { -// let element: UmbWorkspaceUserGroupElement; - -// beforeEach(async () => { -// element = await fixture(html` `); -// }); - -// it('is defined with its own instance', () => { -// expect(element).to.be.instanceOf(UmbWorkspaceUserGroupElement); -// }); - -// it('passes the a11y audit', async () => { -// await expect(element).shadowDom.to.be.accessible(defaultA11yConfig); -// }); -// }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/workspace-view-user-groups.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/workspace-view-user-groups.element.ts similarity index 93% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/workspace-view-user-groups.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/workspace-view-user-groups.element.ts index 84567fcf85..352ab18080 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/user-groups/workspace-view-user-groups.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/workspace-view-user-groups.element.ts @@ -10,22 +10,17 @@ import { UmbTableItem, UmbTableOrderedEvent, UmbTableSelectedEvent, -} from '../../../../shared/components/table'; -import { - UmbUserGroupStore, - UMB_USER_GROUP_STORE_CONTEXT_TOKEN, -} from '../../../user-groups/repository/user-group.store'; +} from '../../../shared/components/table'; +import { UmbUserGroupStore, UMB_USER_GROUP_STORE_CONTEXT_TOKEN } from '../repository/user-group.store'; import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; import './user-group-table-name-column-layout.element'; -import './user-group-table-sections-column-layout.element'; +//import '../../user-section/views/user-groups/user-group-table-sections-column-layout.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-workspace-view-user-groups') export class UmbWorkspaceViewUserGroupsElement extends UmbLitElement { - - @state() private _userGroups: Array = []; @@ -140,7 +135,7 @@ export class UmbWorkspaceViewUserGroupsElement extends UmbLitElement { @ordered="${this._handleOrdering}"> `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/manifests.ts index 69636ed32b..d6a5b8e8fe 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/manifests.ts @@ -1,10 +1,10 @@ -import type { ManifestSection, ManifestSectionView } from '@umbraco-cms/backoffice/extensions-registry'; +import type { ManifestSection } from '@umbraco-cms/backoffice/extensions-registry'; -const sectionAlias = 'Umb.Section.Users'; +export const UMB_USER_SECTION_ALIAS = 'Umb.Section.Users'; const section: ManifestSection = { type: 'section', - alias: sectionAlias, + alias: UMB_USER_SECTION_ALIAS, name: 'Users Section', weight: 100, meta: { @@ -13,37 +13,4 @@ const section: ManifestSection = { }, }; -const sectionsViews: Array = [ - { - type: 'sectionView', - alias: 'Umb.SectionView.Users.Users', - name: 'Users Section View', - loader: () => import('./views/users/section-view-users.element'), - weight: 200, - meta: { - label: 'Users', - pathname: 'users', - icon: 'umb:user', - }, - conditions: { - sections: [sectionAlias], - }, - }, - { - type: 'sectionView', - alias: 'Umb.SectionView.Users.UserGroups', - name: 'User Groups Section View', - loader: () => import('./views/user-groups/section-view-user-groups.element'), - weight: 100, - meta: { - label: 'User Groups', - pathname: 'user-groups', - icon: 'umb:users', - }, - conditions: { - sections: [sectionAlias], - }, - }, -]; - -export const manifests = [section, ...sectionsViews]; +export const manifests = [section]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/section-users.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/section-users.element.ts deleted file mode 100644 index 8a1899563e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/section-users.element.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { html, LitElement } from 'lit'; -import { customElement } from 'lit/decorators.js'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; -import type { ManifestSectionView } from '@umbraco-cms/backoffice/extensions-registry'; - -@customElement('umb-users-section') -export class UmbUsersSectionElement extends LitElement { - constructor() { - super(); - - this._registerSectionViews(); - } - - private _registerSectionViews() { - const manifests: Array = []; - - manifests.forEach((manifest) => { - if (umbExtensionsRegistry.isRegistered(manifest.alias)) return; - umbExtensionsRegistry.register(manifest); - }); - } - - render() { - return html` `; - } -} - -export default UmbUsersSectionElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-users-section': UmbUsersSectionElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/grid/workspace-view-users-grid.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/grid/workspace-view-users-grid.element.ts deleted file mode 100644 index 22b88cef10..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/grid/workspace-view-users-grid.element.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { css, html, nothing } from 'lit'; -import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement, state } from 'lit/decorators.js'; -import { repeat } from 'lit/directives/repeat.js'; -import { ifDefined } from 'lit/directives/if-defined.js'; -import type { UmbSectionViewUsersElement } from '../../section-view-users.element'; -import { - UmbUserGroupStore, - UMB_USER_GROUP_STORE_CONTEXT_TOKEN, -} from '../../../../../user-groups/repository/user-group.store'; -import { getLookAndColorFromUserStatus } from '@umbraco-cms/backoffice/utils'; -import type { UserDetails, UserEntity, UserGroupEntity } from '@umbraco-cms/backoffice/models'; -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; - -@customElement('umb-workspace-view-users-grid') -export class UmbWorkspaceViewUsersGridElement extends UmbLitElement { - - - @state() - private _users: Array = []; - - @state() - private _selection: Array = []; - - @state() - private _userGroups: Array = []; - - private _userGroupStore?: UmbUserGroupStore; - private _usersContext?: UmbSectionViewUsersElement; - - constructor() { - super(); - - this.consumeContext(UMB_USER_GROUP_STORE_CONTEXT_TOKEN, (instance) => { - this._userGroupStore = instance; - this._observeUserGroups(); - }); - - this.consumeContext('umbUsersContext', (_instance) => { - this._usersContext = _instance; - this._observeUsers(); - this._observeSelection(); - }); - } - - private _observeUsers() { - if (!this._usersContext) return; - this.observe(this._usersContext.users, (users) => { - this._users = users; - }); - } - - private _observeUserGroups() { - if (!this._userGroupStore) return; - this.observe(this._userGroupStore.getAll(), (userGroups) => (this._userGroups = userGroups)); - } - - private _observeSelection() { - if (!this._usersContext) return; - this.observe(this._usersContext.selection, (selection) => (this._selection = selection)); - } - - private _isSelected(id: string) { - return this._selection.includes(id); - } - - //TODO How should we handle url stuff? - private _handleOpenCard(id: string) { - history.pushState(null, '', 'section/users/view/users/user/' + id); //TODO Change to a tag with href and make dynamic - } - - private _selectRowHandler(user: UserEntity) { - this._usersContext?.select(user.id); - } - - private _deselectRowHandler(user: UserEntity) { - this._usersContext?.deselect(user.id); - } - - private _getUserGroupNames(ids: Array) { - return ids - .map((id: string) => { - return this._userGroups.find((x) => x.id === id)?.name; - }) - .join(', '); - } - - private renderUserCard(user: UserDetails) { - if (!this._usersContext) return; - - const statusLook = getLookAndColorFromUserStatus(user.status); - - return html` - 0} - ?selected=${this._isSelected(user.id)} - @open=${() => this._handleOpenCard(user.id)} - @selected=${() => this._selectRowHandler(user)} - @unselected=${() => this._deselectRowHandler(user)}> - ${user.status && user.status !== 'enabled' - ? html` - ${user.status} - ` - : nothing} -
${this._getUserGroupNames(user.userGroups)}
- ${user.lastLoginDate - ? html`` - : html``} -
- `; - } - - render() { - return html` -
- ${repeat( - this._users, - (user) => user.id, - (user) => this.renderUserCard(user) - )} -
- `; - } - - static styles = [ - UUITextStyles, - css` - :host { - display: flex; - flex-direction: column; - } - - #user-grid { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); - gap: var(--uui-size-space-4); - margin: var(--uui-size-layout-1); - margin-top: var(--uui-size-space-2); - } - - uui-card-user { - width: 100%; - height: 180px; - } - - .user-login-time { - margin-top: auto; - } - `, - ]; -} - -export default UmbWorkspaceViewUsersGridElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-workspace-view-users-grid': UmbWorkspaceViewUsersGridElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/grid/workspace-view-users-grid.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/grid/workspace-view-users-grid.test.ts deleted file mode 100644 index 42befffb67..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/grid/workspace-view-users-grid.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import { UmbWorkspaceViewUsersGridElement } from './workspace-view-users-grid.element'; -import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -describe('UmbWorkspaceViewUsersCreateElement', () => { - let element: UmbWorkspaceViewUsersGridElement; - beforeEach(async () => { - element = await fixture(html``); - }); - - it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbWorkspaceViewUsersGridElement); - }); - - it('passes the a11y audit', async () => { - await expect(element).shadowDom.to.be.accessible(defaultA11yConfig); - }); -}); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/section-view-users.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/section-view-users.element.ts deleted file mode 100644 index c9ae7da4a0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/section-view-users.element.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { css, html } from 'lit'; -import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement, state } from 'lit/decorators.js'; -import { UmbUserStore, UMB_USER_STORE_CONTEXT_TOKEN } from '../../../users/repository/user.store'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; -import { umbExtensionsRegistry, createExtensionElement } from '@umbraco-cms/backoffice/extensions-api'; - -import './list-view-layouts/table/workspace-view-users-table.element'; -import './list-view-layouts/grid/workspace-view-users-grid.element'; -import './workspace-view-users-selection.element'; - -import type { UserDetails } from '@umbraco-cms/backoffice/models'; -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbDeepState } from '@umbraco-cms/backoffice/observable-api'; -import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extensions-registry'; - -@customElement('umb-section-view-users') -export class UmbSectionViewUsersElement extends UmbLitElement { - - - @state() - private _routes: IRoute[] = []; - - private _workspaces: Array = []; - - // TODO: This must be turned into context api: Maybe its a Collection View (SectionView Collection View)? - private _userStore?: UmbUserStore; - - #selection = new UmbDeepState(>[]); - public readonly selection = this.#selection.asObservable(); - - #users = new UmbDeepState(>[]); - public readonly users = this.#users.asObservable(); - - #search = new UmbDeepState(''); - public readonly search = this.#search.asObservable(); - - constructor() { - super(); - - this.consumeContext(UMB_USER_STORE_CONTEXT_TOKEN, (_instance) => { - this._userStore = _instance; - this._observeUsers(); - }); - - // TODO: consider this context name, is it to broad? - // TODO: Stop using it self as a context api. - this.provideContext('umbUsersContext', this); - - this.observe(umbExtensionsRegistry?.extensionsOfType('workspace'), (workspaceExtensions) => { - this._workspaces = workspaceExtensions; - this._createRoutes(); - }); - } - - private _createRoutes() { - const routes: IRoute[] = [ - { - path: 'overview', - component: () => import('./workspace-view-users-overview.element'), - }, - ]; - - // TODO: find a way to make this reuseable across: - this._workspaces?.map((workspace: ManifestWorkspace) => { - routes.push({ - path: `${workspace.meta.entityType}/:id`, - component: () => createExtensionElement(workspace), - setup: (component, info) => { - if (component) { - (component as any).entityId = info.match.params.id; - } - }, - }); - routes.push({ - path: workspace.meta.entityType, - component: () => createExtensionElement(workspace), - }); - }); - - routes.push({ - path: '**', - redirectTo: 'overview', - }); - this._routes = routes; - } - - private _observeUsers() { - if (!this._userStore) return; - - if (this.#search.getValue()) { - this.observe(this._userStore.getByName(this.#search.getValue()), (users) => this.#users.next(users)); - } else { - this.observe(this._userStore.getAll(), (users) => this.#users.next(users)); - } - } - - public setSearch(value?: string) { - this.#search.next(value || ''); - this._observeUsers(); - this.requestUpdate('search'); - } - - public setSelection(value: Array) { - if (!value) return; - this.#selection.next(value); - this.requestUpdate('selection'); - } - - public select(id: string) { - const oldSelection = this.#selection.getValue(); - if (oldSelection.indexOf(id) !== -1) return; - - this.#selection.next([...oldSelection, id]); - this.requestUpdate('selection'); - } - - public deselect(id: string) { - const selection = this.#selection.getValue(); - this.#selection.next(selection.filter((k) => k !== id)); - this.requestUpdate('selection'); - } - - render() { - return html``; - } - - static styles = [ - UUITextStyles, - css` - :host { - height: 100%; - } - - #router-slot { - height: calc(100% - var(--umb-header-layout-height)); - } - `, - ]; -} - -export default UmbSectionViewUsersElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-section-view-users': UmbSectionViewUsersElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/section-view-users.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/section-view-users.test.ts deleted file mode 100644 index d43ea1fb0e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/section-view-users.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -//TODO: Test has been commented out while we figure out how to setup import maps for the test environment -// import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; -// import UmbSectionViewUsersElement from './section-view-users.element'; - -// describe('UmbSectionViewUsersElement', () => { -// let element: UmbSectionViewUsersElement; -// beforeEach(async () => { -// element = await fixture(html``); -// }); - -// it('is defined with its own instance', () => { -// expect(element).to.be.instanceOf(UmbSectionViewUsersElement); -// }); - -// it('passes the a11y audit', async () => { -// await expect(element).shadowDom.to.be.accessible(defaultA11yConfig); -// }); -// }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts deleted file mode 100644 index 73f6e14627..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.element.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { css, html, nothing } from 'lit'; -import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement, state } from 'lit/decorators.js'; -import { UUIPopoverElement } from '@umbraco-ui/uui'; -import type { UmbSectionViewUsersElement } from './section-view-users.element'; -import { - UmbModalContext, - UMB_MODAL_CONTEXT_TOKEN, - UMB_INVITE_USER_MODAL, - UMB_CREATE_USER_MODAL, -} from '@umbraco-cms/backoffice/modal'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; - -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; - -import './list-view-layouts/table/workspace-view-users-table.element'; -import './list-view-layouts/grid/workspace-view-users-grid.element'; -import './workspace-view-users-selection.element'; - -export type UsersViewType = 'list' | 'grid'; -@customElement('umb-workspace-view-users-overview') -export class UmbWorkspaceViewUsersOverviewElement extends UmbLitElement { - - - @state() - private _selection: Array = []; - - @state() - private isCloud = false; //NOTE: Used to show either invite or create user buttons and views. - - @state() - private _routes: IRoute[] = [ - { - path: 'grid', - component: () => import('./list-view-layouts/grid/workspace-view-users-grid.element'), - }, - { - path: 'list', - component: () => import('./list-view-layouts/table/workspace-view-users-table.element'), - }, - { - path: '**', - redirectTo: 'grid', - }, - ]; - - private _usersContext?: UmbSectionViewUsersElement; - private _modalContext?: UmbModalContext; - private _inputTimer?: NodeJS.Timeout; - private _inputTimerAmount = 500; - - connectedCallback(): void { - super.connectedCallback(); - - this.consumeContext('umbUsersContext', (usersContext: UmbSectionViewUsersElement) => { - this._usersContext = usersContext; - this._observeSelection(); - }); - - this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { - this._modalContext = instance; - }); - } - - private _observeSelection() { - if (!this._usersContext) return; - this.observe(this._usersContext.selection, (selection) => (this._selection = selection)); - } - - private _toggleViewType() { - const isList = window.location.pathname.split('/').pop() === 'list'; - - isList - ? history.pushState(null, '', 'section/users/view/users/overview/grid') - : history.pushState(null, '', 'section/users/view/users/overview/list'); - } - - private _renderSelection() { - if (this._selection.length === 0) return nothing; - - return html``; - } - - private _handleTogglePopover(event: PointerEvent) { - const composedPath = event.composedPath(); - - const popover = composedPath.find((el) => el instanceof UUIPopoverElement) as UUIPopoverElement; - if (popover) { - popover.open = !popover.open; - } - } - - private _updateSearch(event: InputEvent) { - const target = event.target as HTMLInputElement; - const search = target.value || ''; - clearTimeout(this._inputTimer); - this._inputTimer = setTimeout(() => this._refreshUsers(search), this._inputTimerAmount); - } - - private _refreshUsers(search: string) { - if (!this._usersContext) return; - this._usersContext.setSearch(search); - } - - private _showInviteOrCreate() { - let token = undefined; - // TODO: we need to find a better way to determine if we should create or invite - if (this.isCloud) { - token = UMB_INVITE_USER_MODAL; - } else { - token = UMB_CREATE_USER_MODAL; - } - - this._modalContext?.open(token); - } - - render() { - return html` - -
-
- - -
- - - - Status: All - -
- - - - -
-
- - - Groups: All - -
- - - - -
-
- - - Order by: Name (A-Z) - -
- - - - -
-
- - - -
-
-
- - -
- - ${this._renderSelection()} - `; - } - - static styles = [ - UUITextStyles, - css` - :host { - height: 100%; - display: flex; - flex-direction: column; - } - - #sticky-top { - position: sticky; - top: 0px; - z-index: 1; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0), 0 1px 2px rgba(0, 0, 0, 0); - transition: 250ms box-shadow ease-in-out; - } - - #sticky-top.header-shadow { - box-shadow: var(--uui-shadow-depth-2); - } - - #user-list-top-bar { - padding: var(--uui-size-space-4) var(--uui-size-layout-1); - background-color: var(--uui-color-background); - display: flex; - justify-content: space-between; - white-space: nowrap; - gap: var(--uui-size-space-5); - align-items: center; - } - #user-list { - padding: var(--uui-size-layout-1); - padding-top: var(--uui-size-space-2); - } - #input-search { - width: 100%; - } - - uui-popover { - width: unset; - } - - .filter-dropdown { - display: flex; - gap: var(--uui-size-space-3); - flex-direction: column; - background-color: var(--uui-color-surface); - padding: var(--uui-size-space-4); - border-radius: var(--uui-size-border-radius); - box-shadow: var(--uui-shadow-depth-2); - width: fit-content; - } - a { - color: inherit; - text-decoration: none; - } - `, - ]; -} - -export default UmbWorkspaceViewUsersOverviewElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-workspace-view-users-overview': UmbWorkspaceViewUsersOverviewElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.test.ts deleted file mode 100644 index 4058b4be91..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-overview.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -//TODO: Test has been commented out while we figure out how to setup import maps for the test environment -// import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; -// import UmbWorkspaceViewUsersOverviewElement from './workspace-view-users-overview.element'; - -// describe('UmbWorkspaceViewUsersOverviewElement', () => { -// let element: UmbWorkspaceViewUsersOverviewElement; -// beforeEach(async () => { -// element = await fixture(html``); -// }); - -// it('is defined with its own instance', () => { -// expect(element).to.be.instanceOf(UmbWorkspaceViewUsersOverviewElement); -// }); - -// it('passes the a11y audit', async () => { -// await expect(element).shadowDom.to.be.accessible(defaultA11yConfig); -// }); -// }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-selection.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-selection.element.ts deleted file mode 100644 index 8ce1af9b6e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-selection.element.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { css, html } from 'lit'; -import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement, state } from 'lit/decorators.js'; -import { UmbUserStore, UMB_USER_STORE_CONTEXT_TOKEN } from '../../../../users/users/repository/user.store'; -import { UmbSectionViewUsersElement } from './section-view-users.element'; -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; - -@customElement('umb-workspace-view-users-selection') -export class UmbWorkspaceViewUsersSelectionElement extends UmbLitElement { - - - @state() - private _selection: Array = []; - - @state() - private _totalUsers = 0; - - private _usersContext?: UmbSectionViewUsersElement; - private _userStore?: UmbUserStore; - - connectedCallback(): void { - super.connectedCallback(); - this.consumeContext('umbUsersContext', (usersContext: UmbSectionViewUsersElement) => { - this._usersContext = usersContext; - this._observeSelection(); - }); - - this.consumeContext(UMB_USER_STORE_CONTEXT_TOKEN, (userStore) => { - this._userStore = userStore; - this._observeTotalUsers(); - }); - } - - private _observeSelection() { - if (!this._usersContext) return; - this.observe(this._usersContext.selection, (selection) => (this._selection = selection)); - } - - private _observeTotalUsers() { - if (!this._userStore) return; - this.observe(this._userStore.totalUsers, (totalUsers) => (this._totalUsers = totalUsers)); - } - - private _handleClearSelection() { - this._usersContext?.setSelection([]); - } - - private _renderSelectionCount() { - return html`
${this._selection.length} of ${this._totalUsers} selected
`; - } - - render() { - return html` - ${this._renderSelectionCount()} - - - - `; - } - - static styles = [ - UUITextStyles, - css` - :host { - display: flex; - gap: var(--uui-size-3); - width: 100%; - padding: var(--uui-size-space-4) var(--uui-size-space-6); - background-color: var(--uui-color-selected); - color: var(--uui-color-selected-contrast); - align-items: center; - box-sizing: border-box; - } - `, - ]; -} - -export default UmbWorkspaceViewUsersSelectionElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-workspace-view-users-selection': UmbWorkspaceViewUsersSelectionElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-selection.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-selection.test.ts deleted file mode 100644 index d889b7f951..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/workspace-view-users-selection.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -//TODO: Test has been commented out while we figure out how to setup import maps for the test environment -// import UmbWorkspaceViewUsersSelectionElement from './workspace-view-users-selection.element'; -// import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// describe('UmbWorkspaceViewUsersSelectionElement', () => { -// let element: UmbWorkspaceViewUsersSelectionElement; -// beforeEach(async () => { -// element = await fixture(html``); -// }); - -// it('is defined with its own instance', () => { -// expect(element).to.be.instanceOf(UmbWorkspaceViewUsersSelectionElement); -// }); - -// it('passes the a11y audit', async () => { -// await expect(element).shadowDom.to.be.accessible(defaultA11yConfig); -// }); -// }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/user-collection-header.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/user-collection-header.element.ts new file mode 100644 index 0000000000..80d971688c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/user-collection-header.element.ts @@ -0,0 +1,185 @@ +import { UUITextStyles } from '@umbraco-ui/uui-css'; +import { css, html } from 'lit'; +import { customElement, state } from 'lit/decorators.js'; +import { UUIPopoverElement } from '@umbraco-ui/uui'; +import { UmbUserCollectionContext } from './user-collection.context'; +import { UMB_COLLECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/collection'; +import { + UMB_CREATE_USER_MODAL, + UMB_INVITE_USER_MODAL, + UMB_MODAL_CONTEXT_TOKEN, + UmbModalContext, +} from '@umbraco-cms/backoffice/modal'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +@customElement('umb-user-collection-header') +export class UmbUserCollectionHeaderElement extends UmbLitElement { + @state() + private isCloud = true; //NOTE: Used to show either invite or create user buttons and views. + + #modalContext?: UmbModalContext; + #collectionContext?: UmbUserCollectionContext; + #inputTimer?: NodeJS.Timeout; + #inputTimerAmount = 500; + + constructor() { + super(); + + this.consumeContext(UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.#modalContext = instance; + }); + + this.consumeContext(UMB_COLLECTION_CONTEXT_TOKEN, (instance) => { + this.#collectionContext = instance; + }); + } + + private _toggleViewType() { + const isList = window.location.pathname.split('/').pop() === 'list'; + + isList + ? history.pushState(null, '', 'section/users/view/users/overview/grid') + : history.pushState(null, '', 'section/users/view/users/overview/list'); + } + + private _handleTogglePopover(event: PointerEvent) { + const composedPath = event.composedPath(); + + const popover = composedPath.find((el) => el instanceof UUIPopoverElement) as UUIPopoverElement; + if (popover) { + popover.open = !popover.open; + } + } + + private _updateSearch(event: InputEvent) { + const target = event.target as HTMLInputElement; + const filter = target.value || ''; + clearTimeout(this.#inputTimer); + this.#inputTimer = setTimeout(() => this.#collectionContext?.setFilter({ filter }), this.#inputTimerAmount); + } + + private _showInviteOrCreate() { + let token = undefined; + // TODO: we need to find a better way to determine if we should create or invite + if (this.isCloud) { + token = UMB_INVITE_USER_MODAL; + } else { + token = UMB_CREATE_USER_MODAL; + } + + this.#modalContext?.open(token); + } + + render() { + return html` +
+
+ + +
+ + + + Status: All + +
+ + + + +
+
+ + + Groups: All + +
+ + + + +
+
+ + + Order by: Name (A-Z) + +
+ + + + +
+
+ + + +
+
+
+ `; + } + static styles = [ + UUITextStyles, + css` + #sticky-top { + position: sticky; + top: 0px; + z-index: 1; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0), 0 1px 2px rgba(0, 0, 0, 0); + transition: 250ms box-shadow ease-in-out; + } + + #sticky-top.header-shadow { + box-shadow: var(--uui-shadow-depth-2); + } + + #user-list-top-bar { + padding: var(--uui-size-space-4) var(--uui-size-layout-1); + background-color: var(--uui-color-background); + display: flex; + justify-content: space-between; + white-space: nowrap; + gap: var(--uui-size-space-5); + align-items: center; + } + #user-list { + padding: var(--uui-size-layout-1); + padding-top: var(--uui-size-space-2); + } + #input-search { + width: 100%; + } + + uui-popover { + width: unset; + } + + .filter-dropdown { + display: flex; + gap: var(--uui-size-space-3); + flex-direction: column; + background-color: var(--uui-color-surface); + padding: var(--uui-size-space-4); + border-radius: var(--uui-size-border-radius); + box-shadow: var(--uui-shadow-depth-2); + width: fit-content; + } + a { + color: inherit; + text-decoration: none; + } + `, + ]; +} + +export default UmbUserCollectionHeaderElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-user-collection-header': UmbUserCollectionHeaderElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/user-collection.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/user-collection.context.ts new file mode 100644 index 0000000000..7ae6b56d21 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/user-collection.context.ts @@ -0,0 +1,11 @@ +import { USER_REPOSITORY_ALIAS } from '../repository/manifests'; +import { UmbUserCollectionFilterModel } from '../types'; +import { UmbCollectionContext } from '@umbraco-cms/backoffice/collection'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbUserCollectionContext extends UmbCollectionContext { + constructor(host: UmbControllerHostElement) { + super(host, 'user', USER_REPOSITORY_ALIAS); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/user-collection.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/user-collection.element.ts new file mode 100644 index 0000000000..6d9b25dc2c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/user-collection.element.ts @@ -0,0 +1,68 @@ +import { css, html } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, state } from 'lit/decorators.js'; +import { UmbUserCollectionContext } from './user-collection.context'; +import { UMB_COLLECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/collection'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +import './views/table/user-table-collection-view.element'; +import './views/grid/user-grid-collection-view.element'; +import './user-collection-header.element'; + +export type UsersViewType = 'list' | 'grid'; +@customElement('umb-user-collection') +export class UmbUserCollectionElement extends UmbLitElement { + #collectionContext = new UmbUserCollectionContext(this); + + @state() + private _routes: UmbRoute[] = [ + { + path: 'grid', + component: () => import('./views/grid/user-grid-collection-view.element'), + }, + { + path: 'list', + component: () => import('./views/table/user-table-collection-view.element'), + }, + { + path: '**', + redirectTo: 'grid', + }, + ]; + + connectedCallback(): void { + super.connectedCallback(); + this.provideContext(UMB_COLLECTION_CONTEXT_TOKEN, this.#collectionContext); + } + + render() { + return html` + + + + + + + `; + } + + static styles = [ + UUITextStyles, + css` + :host { + height: 100%; + display: flex; + flex-direction: column; + } + `, + ]; +} + +export default UmbUserCollectionElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-user-collection': UmbUserCollectionElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/grid/user-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/grid/user-grid-collection-view.element.ts new file mode 100644 index 0000000000..314f60c491 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/grid/user-grid-collection-view.element.ts @@ -0,0 +1,135 @@ +import { css, html, nothing } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, state } from 'lit/decorators.js'; +import { repeat } from 'lit/directives/repeat.js'; +import { ifDefined } from 'lit/directives/if-defined.js'; +import { getLookAndColorFromUserStatus } from '../../../../utils'; +import { UmbUserCollectionContext } from '../../user-collection.context'; +import { UMB_COLLECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/collection'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UserResponseModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; + +@customElement('umb-user-grid-collection-view') +export class UmbUserGridCollectionViewElement extends UmbLitElement { + @state() + private _users: Array = []; + + @state() + private _selection: Array = []; + + #collectionContext?: UmbUserCollectionContext; + + constructor() { + super(); + + //TODO: Get user group names + + this.consumeContext(UMB_COLLECTION_CONTEXT_TOKEN, (instance) => { + this.#collectionContext = instance; + this.observe(this.#collectionContext.selection, (selection) => (this._selection = selection)); + this.observe(this.#collectionContext.items, (items) => (this._users = items)); + }); + } + + //TODO How should we handle url stuff? + private _handleOpenCard(id: string) { + //TODO this will not be needed when cards works as links with href + history.pushState(null, '', 'section/users/view/users/user/' + id); //TODO Change to a tag with href and make dynamic + } + + #onSelect(user: UserResponseModel) { + this.#collectionContext?.select(user.id ?? ''); + } + + #onDeselect(user: UserResponseModel) { + this.#collectionContext?.deselect(user.id ?? ''); + } + + #renderUserCard(user: UserResponseModel) { + return html` + 0} + ?selected=${this.#collectionContext?.isSelected(user.id ?? '')} + @open=${() => this._handleOpenCard(user.id ?? '')} + @selected=${() => this.#onSelect(user)} + @unselected=${() => this.#onDeselect(user)}> + ${this.#renderUserTag(user)} ${this.#renderUserLoginDate(user)} + + `; + } + + #renderUserTag(user: UserResponseModel) { + if (user.state || user.state === UserStateModel.ACTIVE) { + return nothing; + } + + const statusLook = getLookAndColorFromUserStatus(user.state); + return html` + ${user.state} + `; + } + + #renderUserLoginDate(user: UserResponseModel) { + if (!user.lastLoginDate) { + return html``; + } + + return html``; + } + + render() { + return html` +
+ ${repeat( + this._users, + (user) => user.id, + (user) => this.#renderUserCard(user) + )} +
+ `; + } + + static styles = [ + UUITextStyles, + css` + :host { + display: flex; + flex-direction: column; + } + + #user-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: var(--uui-size-space-4); + margin: var(--uui-size-layout-1); + margin-top: var(--uui-size-space-2); + } + + uui-card-user { + width: 100%; + height: 180px; + } + + .user-login-time { + margin-top: auto; + } + `, + ]; +} + +export default UmbUserGridCollectionViewElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-user-grid-collection-view': UmbUserGridCollectionViewElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/column-layouts/name/user-table-name-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/column-layouts/name/user-table-name-column-layout.element.ts similarity index 95% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/column-layouts/name/user-table-name-column-layout.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/column-layouts/name/user-table-name-column-layout.element.ts index ed36318416..d88058e1d4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/column-layouts/name/user-table-name-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/column-layouts/name/user-table-name-column-layout.element.ts @@ -1,6 +1,6 @@ import { html, LitElement } from 'lit'; import { customElement, property } from 'lit/decorators.js'; -import type { UmbTableColumn, UmbTableItem } from '../../../../../../../../shared/components/table/table.element'; +import type { UmbTableColumn, UmbTableItem } from '../../../../../../../shared/components/table/table.element'; @customElement('umb-user-table-name-column-layout') export class UmbUserTableNameColumnLayoutElement extends LitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/column-layouts/status/user-table-status-column-layout.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/column-layouts/status/user-table-status-column-layout.element.ts similarity index 90% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/column-layouts/status/user-table-status-column-layout.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/column-layouts/status/user-table-status-column-layout.element.ts index 75ca3b5fb2..5ac48eced6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/column-layouts/status/user-table-status-column-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/column-layouts/status/user-table-status-column-layout.element.ts @@ -1,6 +1,6 @@ import { html, LitElement, nothing } from 'lit'; import { customElement, property } from 'lit/decorators.js'; -import { getLookAndColorFromUserStatus } from '@umbraco-cms/backoffice/utils'; +import { getLookAndColorFromUserStatus } from '../../../../../../utils'; @customElement('umb-user-table-status-column-layout') export class UmbUserTableStatusColumnLayoutElement extends LitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/workspace-view-users-table.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/user-table-collection-view.element.ts similarity index 70% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/workspace-view-users-table.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/user-table-collection-view.element.ts index ec4a433208..4220f02a3e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-section/views/users/list-view-layouts/table/workspace-view-users-table.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/user-table-collection-view.element.ts @@ -1,7 +1,6 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; -import type { UmbSectionViewUsersElement } from '../../section-view-users.element'; import { UmbTableElement, UmbTableColumn, @@ -10,24 +9,22 @@ import { UmbTableSelectedEvent, UmbTableConfig, UmbTableOrderedEvent, -} from '../../../../../../shared/components/table/table.element'; +} from '../../../../../shared/components/table/table.element'; import { UmbUserGroupStore, UMB_USER_GROUP_STORE_CONTEXT_TOKEN, -} from '../../../../../user-groups/repository/user-group.store'; -import type { UserDetails, UserGroupEntity } from '@umbraco-cms/backoffice/models'; +} from '../../../../user-groups/repository/user-group.store'; +import { UmbUserCollectionContext } from '../../user-collection.context'; +import { UMB_COLLECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/collection'; +import type { UserGroupEntity } from '@umbraco-cms/backoffice/models'; import './column-layouts/name/user-table-name-column-layout.element'; import './column-layouts/status/user-table-status-column-layout.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; -@customElement('umb-workspace-view-users-table') -export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { - - - @state() - private _users: Array = []; - +@customElement('umb-user-table-collection-view') +export class UmbUserTableCollectionViewElement extends UmbLitElement { @state() private _tableConfig: UmbTableConfig = { allowSelection: true, @@ -58,14 +55,18 @@ export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { @state() private _tableItems: Array = []; - @state() - private _selection: Array = []; - @state() private _userGroups: Array = []; private _userGroupStore?: UmbUserGroupStore; - private _usersContext?: UmbSectionViewUsersElement; + + @state() + private _users: Array = []; + + @state() + private _selection: Array = []; + + #collectionContext?: UmbUserCollectionContext; constructor() { super(); @@ -75,26 +76,10 @@ export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { this._observeUserGroups(); }); - this.consumeContext('umbUsersContext', (_instance) => { - this._usersContext = _instance; - this._observeUsers(); - this._observeSelection(); - }); - } - - private _observeUsers() { - if (!this._usersContext) return; - this.observe(this._usersContext.users, (users) => { - this._users = users; - this._createTableItems(this._users); - }); - } - - private _observeSelection() { - if (!this._usersContext) return; - this.observe(this._usersContext.selection, (selection) => { - if (this._selection === selection) return; - this._selection = selection; + this.consumeContext(UMB_COLLECTION_CONTEXT_TOKEN, (instance) => { + this.#collectionContext = instance; + this.observe(this.#collectionContext.selection, (selection) => (this._selection = selection)); + this.observe(this.#collectionContext.items, (items) => (this._users = items)); }); } @@ -114,10 +99,10 @@ export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { .join(', '); } - private _createTableItems(users: Array) { + private _createTableItems(users: Array) { this._tableItems = users.map((user) => { return { - id: user.id, + id: user.id ?? '', icon: 'umb:user', data: [ { @@ -128,7 +113,7 @@ export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { }, { columnAlias: 'userGroup', - value: this._getUserGroupNames(user.userGroups), + value: this._getUserGroupNames(user.userGroupIds ?? []), }, { columnAlias: 'userLastLogin', @@ -137,7 +122,7 @@ export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { { columnAlias: 'userStatus', value: { - status: user.status, + status: user.state, }, }, ], @@ -149,14 +134,14 @@ export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { event.stopPropagation(); const table = event.target as UmbTableElement; const selection = table.selection; - this._usersContext?.setSelection(selection); + this.#collectionContext?.setSelection(selection); } private _handleDeselected(event: UmbTableDeselectedEvent) { event.stopPropagation(); const table = event.target as UmbTableElement; const selection = table.selection; - this._usersContext?.setSelection(selection); + this.#collectionContext?.setSelection(selection); } private _handleOrdering(event: UmbTableOrderedEvent) { @@ -178,7 +163,7 @@ export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { @ordered="${this._handleOrdering}"> `; } - + static styles = [ UUITextStyles, css` @@ -195,10 +180,10 @@ export class UmbWorkspaceViewUsersTableElement extends UmbLitElement { ]; } -export default UmbWorkspaceViewUsersTableElement; +export default UmbUserTableCollectionViewElement; declare global { interface HTMLElementTagNameMap { - 'umb-workspace-view-users-table': UmbWorkspaceViewUsersTableElement; + 'umb-workspace-view-users-table': UmbUserTableCollectionViewElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/index.ts new file mode 100644 index 0000000000..df0765ef5b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/index.ts @@ -0,0 +1 @@ +import './user-input/user-input.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/user-input/user-input.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/user-input/user-input.context.ts new file mode 100644 index 0000000000..7a474bed3f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/user-input/user-input.context.ts @@ -0,0 +1,10 @@ +import { UmbPickerInputContext } from '@umbraco-cms/backoffice/picker-input'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UMB_USER_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export class UmbUserPickerContext extends UmbPickerInputContext { + constructor(host: UmbControllerHostElement) { + super(host, 'Umb.Repository.User', UMB_USER_PICKER_MODAL); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/user-input/user-input.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/user-input/user-input.element.ts new file mode 100644 index 0000000000..167ab7e678 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/user-input/user-input.element.ts @@ -0,0 +1,136 @@ +import { css, html } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, property, state } from 'lit/decorators.js'; +import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; +import { UmbUserPickerContext } from './user-input.context'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { UserItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +@customElement('umb-user-input') +export class UmbUserInputElement extends FormControlMixin(UmbLitElement) { + /** + * This is a minimum amount of selected items in this input. + * @type {number} + * @attr + * @default 0 + */ + @property({ type: Number }) + public get min(): number { + return this.#pickerContext.min; + } + public set min(value: number) { + this.#pickerContext.min = value; + } + + /** + * Min validation message. + * @type {boolean} + * @attr + * @default + */ + @property({ type: String, attribute: 'min-message' }) + minMessage = 'This field need more items'; + + /** + * This is a maximum amount of selected items in this input. + * @type {number} + * @attr + * @default Infinity + */ + @property({ type: Number }) + public get max(): number { + return this.#pickerContext.max; + } + public set max(value: number) { + this.#pickerContext.max = value; + } + + /** + * Max validation message. + * @type {boolean} + * @attr + * @default + */ + @property({ type: String, attribute: 'min-message' }) + maxMessage = 'This field exceeds the allowed amount of items'; + + public get selectedIds(): Array { + return this.#pickerContext.getSelection(); + } + public set selectedIds(ids: Array) { + this.#pickerContext.setSelection(ids); + } + + @property() + public set value(idsString: string) { + // Its with full purpose we don't call super.value, as thats being handled by the observation of the context selection. + this.selectedIds = idsString.split(/[ ,]+/); + } + + @state() + private _items?: Array; + + #pickerContext = new UmbUserPickerContext(this); + + constructor() { + super(); + + this.addValidator( + 'rangeUnderflow', + () => this.minMessage, + () => !!this.min && this.#pickerContext.getSelection().length < this.min + ); + + this.addValidator( + 'rangeOverflow', + () => this.maxMessage, + () => !!this.max && this.#pickerContext.getSelection().length > this.max + ); + + this.observe(this.#pickerContext.selection, (selection) => (super.value = selection.join(','))); + this.observe(this.#pickerContext.selectedItems, (selectedItems) => (this._items = selectedItems)); + } + + protected getFormElement() { + return undefined; + } + + render() { + return html` + ${this._items?.map((item) => this._renderItem(item))} + this.#pickerContext.openPicker()} label="open" + >Add + `; + } + + private _renderItem(item: UserItemResponseModel) { + if (!item.id) return; + return html` + + + this.#pickerContext.requestRemoveItem(item.id!)} label="Remove ${item.name}" + >Remove + + + `; + } + + static styles = [ + UUITextStyles, + css` + #add-button { + width: 100%; + } + `, + ]; +} + +export default UmbUserInputElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-user-input': UmbUserInputElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/user-input/user-input.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/user-input/user-input.stories.ts new file mode 100644 index 0000000000..6ef641f6ef --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/components/user-input/user-input.stories.ts @@ -0,0 +1,31 @@ +import { Meta, StoryObj } from '@storybook/web-components'; +import './user-input.element'; +import type { UmbUserInputElement } from './user-input.element'; + +const meta: Meta = { + title: 'Components/Inputs/User', + component: 'umb-user-input', + argTypes: { + /* + modalType: { + control: 'inline-radio', + options: ['dialog', 'sidebar'], + defaultValue: 'sidebar', + description: 'The type of modal to use when selecting users', + }, + modalSize: { + control: 'select', + options: ['small', 'medium', 'large', 'full'], + defaultValue: 'small', + description: 'The size of the modal to use when selecting users, only applicable to sidebar not dialog', + }, + */ + }, +}; + +export default meta; +type Story = StoryObj; + +export const Overview: Story = { + args: {}, +}; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/delete/delete.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/delete/delete.action.ts new file mode 100644 index 0000000000..85c96fe127 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/delete/delete.action.ts @@ -0,0 +1,24 @@ +import { html } from 'lit'; + +import { UmbUserRepository } from '../../repository/user.repository'; +import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-action'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; + +export class UmbUserDeleteEntityBulkAction extends UmbEntityBulkActionBase { + #modalContext?: UmbModalContext; + + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { + super(host, repositoryAlias, selection); + + new UmbContextConsumerController(host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.#modalContext = instance; + }); + } + + async execute() { + //TODO: we need bulk actions on the server + alert('Bulk delete is not implemented yet'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/disable/disable.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/disable/disable.action.ts new file mode 100644 index 0000000000..559f9cfeaa --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/disable/disable.action.ts @@ -0,0 +1,14 @@ +import { UmbUserRepository } from '../../repository/user.repository'; +import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-action'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; + +export class UmbDisableUserEntityBulkAction extends UmbEntityBulkActionBase { + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { + super(host, repositoryAlias, selection); + } + + async execute() { + //TODO: Implement + alert('Bulk disable is not implemented yet'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/enable/enable.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/enable/enable.action.ts new file mode 100644 index 0000000000..19ac7e5322 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/enable/enable.action.ts @@ -0,0 +1,14 @@ +import { UmbUserRepository } from '../../repository/user.repository'; +import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-action'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; + +export class UmbEnableUserEntityBulkAction extends UmbEntityBulkActionBase { + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { + super(host, repositoryAlias, selection); + } + + async execute() { + //TODO: Implement + alert('Bulk enable is not implemented yet'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/manifests.ts new file mode 100644 index 0000000000..c55e3c7353 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/manifests.ts @@ -0,0 +1,70 @@ +import { USER_REPOSITORY_ALIAS } from '../repository/manifests'; +import { UmbUserDeleteEntityBulkAction } from './delete/delete.action'; +import { UmbEnableUserEntityBulkAction } from './enable/enable.action'; +import { UmbSetGroupUserEntityBulkAction } from './set-group/set-group.action'; +import { UmbUnlockUserEntityBulkAction } from './unlock/unlock.action'; +import { UmbDisableUserEntityBulkAction } from './disable/disable.action'; +import { ManifestEntityBulkAction } from '@umbraco-cms/backoffice/extensions-registry'; + +const entityType = 'user'; + +const entityActions: Array = [ + { + type: 'entityBulkAction', + alias: 'Umb.EntityBulkAction.User.SetGroup', + name: 'SetGroup User Entity Bulk Action', + weight: 400, + meta: { + label: 'SetGroup', + repositoryAlias: USER_REPOSITORY_ALIAS, + api: UmbSetGroupUserEntityBulkAction, + }, + conditions: { + entityType, + }, + }, + { + type: 'entityBulkAction', + alias: 'Umb.EntityBulkAction.User.Enable', + name: 'Enable User Entity Bulk Action', + weight: 300, + meta: { + label: 'Enable', + repositoryAlias: USER_REPOSITORY_ALIAS, + api: UmbEnableUserEntityBulkAction, + }, + conditions: { + entityType, + }, + }, + { + type: 'entityBulkAction', + alias: 'Umb.EntityBulkAction.User.Unlock', + name: 'Unlock User Entity Bulk Action', + weight: 200, + meta: { + label: 'Unlock', + repositoryAlias: USER_REPOSITORY_ALIAS, + api: UmbUnlockUserEntityBulkAction, + }, + conditions: { + entityType, + }, + }, + { + type: 'entityBulkAction', + alias: 'Umb.EntityBulkAction.User.Disable', + name: 'Disable User Entity Bulk Action', + weight: 100, + meta: { + label: 'Disable', + repositoryAlias: USER_REPOSITORY_ALIAS, + api: UmbDisableUserEntityBulkAction, + }, + conditions: { + entityType, + }, + }, +]; + +export const manifests = [...entityActions]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/set-group/set-group.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/set-group/set-group.action.ts new file mode 100644 index 0000000000..e94974d257 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/set-group/set-group.action.ts @@ -0,0 +1,24 @@ +import { UmbUserRepository } from '../../repository/user.repository'; +import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-action'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; +import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; + +export class UmbSetGroupUserEntityBulkAction extends UmbEntityBulkActionBase { + #modalContext?: UmbModalContext; + + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { + super(host, repositoryAlias, selection); + + new UmbContextConsumerController(host, UMB_MODAL_CONTEXT_TOKEN, (instance) => { + this.#modalContext = instance; + + //TODO: add user group picker modal + }); + } + + async execute() { + //TODO: Implement + alert('Bulk set group is not implemented yet'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/unlock/unlock.action.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/unlock/unlock.action.ts new file mode 100644 index 0000000000..54ae6c49fc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/entity-bulk-actions/unlock/unlock.action.ts @@ -0,0 +1,14 @@ +import { UmbUserRepository } from '../../repository/user.repository'; +import { UmbEntityBulkActionBase } from '@umbraco-cms/backoffice/entity-action'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; + +export class UmbUnlockUserEntityBulkAction extends UmbEntityBulkActionBase { + constructor(host: UmbControllerHostElement, repositoryAlias: string, selection: Array) { + super(host, repositoryAlias, selection); + } + + async execute() { + //TODO: Implement + alert('Bulk unlock is not implemented yet'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/manifests.ts index dd709645d0..59c0a2fe23 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/manifests.ts @@ -1,5 +1,13 @@ import { manifests as repositoryManifests } from './repository/manifests'; import { manifests as workspaceManifests } from './workspace/manifests'; import { manifests as modalManifests } from './modals/manifests'; +import { manifests as sectionViewManifests } from './section-view/manifests'; +import { manifests as entityBulkActionManifests } from './entity-bulk-actions/manifests'; -export const manifests = [...repositoryManifests, ...workspaceManifests, ...modalManifests]; +export const manifests = [ + ...repositoryManifests, + ...workspaceManifests, + ...modalManifests, + ...sectionViewManifests, + ...entityBulkActionManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts index 095e3292fa..17f8ee41dc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts @@ -2,43 +2,43 @@ import { css, html, nothing } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, query, state } from 'lit/decorators.js'; import { UUIInputPasswordElement } from '@umbraco-ui/uui'; -import { UmbInputPickerUserGroupElement } from '../../../../shared/components/input-user-group/input-user-group.element'; import { UmbUserStore, UMB_USER_STORE_CONTEXT_TOKEN } from '../../repository/user.store'; +import { UmbInputPickerUserGroupElement } from '../../../../shared/components/input-user-group/input-user-group.element'; +import { UmbUserRepository } from '../../repository/user.repository'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; -import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbNotificationDefaultData, UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN, } from '@umbraco-cms/backoffice/notification'; +import { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; export type UsersViewType = 'list' | 'grid'; @customElement('umb-create-user-modal') export class UmbCreateUserModalElement extends UmbModalBaseElement { - - @query('#form') private _form!: HTMLFormElement; @state() - private _createdUser?: UserDetails; + private _createdUser?: UserResponseModel; - protected _userStore?: UmbUserStore; - private _notificationContext?: UmbNotificationContext; + @state() + private _createdUserInitialPassword?: string | null; + + #notificationContext?: UmbNotificationContext; + + // TODO: get from extension registry + #userRepository = new UmbUserRepository(this); connectedCallback(): void { super.connectedCallback(); this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (_instance) => { - this._notificationContext = _instance; - }); - - this.consumeContext(UMB_USER_STORE_CONTEXT_TOKEN, (_instance) => { - this._userStore = _instance; + this.#notificationContext = _instance; }); } - private _handleSubmit(e: Event) { + async #onSubmit(e: SubmitEvent) { e.preventDefault(); const form = e.target as HTMLFormElement; @@ -49,28 +49,34 @@ export class UmbCreateUserModalElement extends UmbModalBaseElement { const formData = new FormData(form); - console.log('formData', formData); - const name = formData.get('name') as string; const email = formData.get('email') as string; + //TODO: How should we handle pickers forms? const userGroupPicker = form.querySelector('#userGroups') as UmbInputPickerUserGroupElement; - const userGroups = userGroupPicker?.value || []; + const userGroups = userGroupPicker?.value || ['e5e7f6c8-7f9c-4b5b-8d5d-9e1e5a4f7e4d']; - this._userStore?.invite(name, email, '', userGroups).then((user) => { - if (user) { - this._createdUser = user; - } + // TODO: figure out when to use email or username + const { data } = await this.#userRepository.create({ + name, + email, + userName: email, + userGroupIds: userGroups, }); + + if (data) { + this._createdUser = data.user; + this._createdUserInitialPassword = data.createData.initialPassword; + } } - private _copyPassword() { + #copyPassword() { const passwordInput = this.shadowRoot?.querySelector('#password') as UUIInputPasswordElement; if (!passwordInput || typeof passwordInput.value !== 'string') return; navigator.clipboard.writeText(passwordInput.value); const data: UmbNotificationDefaultData = { message: 'Password copied' }; - this._notificationContext?.peek('positive', { data }); + this.#notificationContext?.peek('positive', { data }); } private _submitForm() { @@ -99,7 +105,7 @@ export class UmbCreateUserModalElement extends UmbModalBaseElement { can share with the user.

-
+ Name @@ -129,10 +135,10 @@ export class UmbCreateUserModalElement extends UmbModalBaseElement { id="password" label="password" name="password" - value="${'PUT GENERATED PASSWORD HERE'}" + value="${this._createdUserInitialPassword}" readonly> - + `; } @@ -171,7 +177,7 @@ export class UmbCreateUserModalElement extends UmbModalBaseElement { `} `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.test.ts deleted file mode 100644 index 3c38038129..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -//TODO: Test has been commented out while we figure out how to setup import maps for the test environment -// import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; -// import UmbWorkspaceViewUsersCreateElement from './workspace-view-users-create.element'; - -// describe('UmbWorkspaceViewUsersCreateElement', () => { -// let element: UmbWorkspaceViewUsersCreateElement; -// beforeEach(async () => { -// element = await fixture(html``); -// }); - -// it('is defined with its own instance', () => { -// expect(element).to.be.instanceOf(UmbWorkspaceViewUsersCreateElement); -// }); - -// it('passes the a11y audit', async () => { -// await expect(element).shadowDom.to.be.accessible(defaultA11yConfig); -// }); -// }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts index acd89430d0..463df6e6fe 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts @@ -2,30 +2,21 @@ import { css, html, nothing } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, query, state } from 'lit/decorators.js'; import { UmbInputPickerUserGroupElement } from '../../../../shared/components/input-user-group/input-user-group.element'; -import { UmbUserStore, UMB_USER_STORE_CONTEXT_TOKEN } from '../../repository/user.store'; +import { UmbUserRepository } from '../../repository/user.repository'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; -import type { UserDetails } from '@umbraco-cms/backoffice/models'; +import type { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; export type UsersViewType = 'list' | 'grid'; @customElement('umb-invite-user-modal') export class UmbInviteUserModalElement extends UmbModalBaseElement { - - @query('#form') private _form!: HTMLFormElement; @state() - private _invitedUser?: UserDetails; + private _invitedUser?: UserResponseModel; - protected _userStore?: UmbUserStore; - - connectedCallback(): void { - super.connectedCallback(); - - this.consumeContext(UMB_USER_STORE_CONTEXT_TOKEN, (usersContext) => { - this._userStore = usersContext; - }); - } + // TODO: get from extension registry + #userRepository = new UmbUserRepository(this); private _handleSubmit(e: Event) { e.preventDefault(); @@ -40,17 +31,29 @@ export class UmbInviteUserModalElement extends UmbModalBaseElement { const name = formData.get('name') as string; const email = formData.get('email') as string; + //TODO: How should we handle pickers forms? const userGroupPicker = form.querySelector('#userGroups') as UmbInputPickerUserGroupElement; - const userGroups = userGroupPicker?.value || []; + const userGroupIds = userGroupPicker?.value || []; const message = formData.get('message') as string; - this._userStore?.invite(name, email, message, userGroups).then((user) => { - if (user) { - this._invitedUser = user; - } + alert('implement invite'); + + // TODO: figure out when to use email or username + /* + const { data } = this.#userRepository.invite({ + name, + email, + userName: email, + message, + userGroupIds, }); + + if (data) { + this._invitedUser = data; + } + */ } private _submitForm() { @@ -144,7 +147,7 @@ export class UmbInviteUserModalElement extends UmbModalBaseElement { `} `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.test.ts deleted file mode 100644 index cf701e9fcc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -//TODO: Test has been commented out while we figure out how to setup import maps for the test environment -// import UmbWorkspaceViewUsersInviteElement from './workspace-view-users-invite.element'; -// import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// describe('UmbWorkspaceViewUsersInviteElement', () => { -// let element: UmbWorkspaceViewUsersInviteElement; -// beforeEach(async () => { -// element = await fixture(html``); -// }); - -// it('is defined with its own instance', () => { -// expect(element).to.be.instanceOf(UmbWorkspaceViewUsersInviteElement); -// }); - -// it('passes the a11y audit', async () => { -// await expect(element).shadowDom.to.be.accessible(defaultA11yConfig); -// }); -// }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.element.ts index 0f9d94eb2e..3b806610de 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.element.ts @@ -1,107 +1,98 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; -import { customElement, state } from 'lit/decorators.js'; -import { UmbUserStore, UMB_USER_STORE_CONTEXT_TOKEN } from '../../repository/user.store'; -import { UmbModalElementPickerBase } from '@umbraco-cms/internal/modal'; -import type { UserDetails } from '@umbraco-cms/backoffice/models'; +import { customElement, property, state } from 'lit/decorators.js'; +import { UmbUserRepository } from '../../repository/user.repository'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UmbModalHandler, UmbUserPickerModalData, UmbUserPickerModalResult } from '@umbraco-cms/backoffice/modal'; +import { createExtensionClass, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extensions-api'; +import { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; +import { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-user-picker-modal') -export class UmbUserPickerModalElement extends UmbModalElementPickerBase { - +export class UmbUserPickerModalElement extends UmbLitElement { + @property({ attribute: false }) + modalHandler?: UmbModalHandler; + + @property({ type: Object, attribute: false }) + data?: UmbUserPickerModalData; @state() - private _users: Array = []; + _selection: Array = []; - private _userStore?: UmbUserStore; + @state() + _multiple = false; - connectedCallback(): void { - super.connectedCallback(); - this.consumeContext(UMB_USER_STORE_CONTEXT_TOKEN, (userStore) => { - this._userStore = userStore; - this._observeUsers(); - }); + @state() + private _users: Array = []; + + #userRepository?: UmbUserRepository; + + constructor() { + super(); + + // TODO: this code is reused in multiple places, so it should be extracted to a function + new UmbObserverController( + this, + umbExtensionsRegistry.getByTypeAndAlias('repository', 'Umb.Repository.User'), + async (repositoryManifest) => { + if (!repositoryManifest) return; + + try { + const result = await createExtensionClass(repositoryManifest, [this]); + this.#userRepository = result; + this.#observeUsers(); + } catch (error) { + throw new Error('Could not create repository with alias: Umb.Repository.User'); + } + } + ); } - private _observeUsers() { - if (!this._userStore) return; - this.observe(this._userStore.getAll(), (users) => (this._users = users)); + async #observeUsers() { + if (!this.#userRepository) return; + // TODO is this the correct end point? + const { data } = await this.#userRepository.requestCollection(); + + if (data) { + this._users = data.items; + } + } + + #submit() { + this.modalHandler?.submit({ selection: this._selection }); + } + + #close() { + this.modalHandler?.reject(); } render() { return html` - + - -
-
- ${this._users.map( - (item) => html` -
this.handleSelection(item.id)} - @keydown=${(e: KeyboardEvent) => this._handleKeydown(e, item.id)} - class=${this.isSelected(item.id) ? 'item selected' : 'item'}> - - ${item.name} -
- ` - )} -
+ ${this._users.map( + (user) => html` + + + Hello + ` + )}
- - + +
-
+ `; } - + static styles = [ UUITextStyles, css` - uui-input { - width: 100%; - } - - hr { - border: none; - border-bottom: 1px solid var(--uui-color-divider); - margin: 16px 0; - } - #item-list { - display: flex; - flex-direction: column; - gap: var(--uui-size-1); - font-size: 1rem; - } - .item { - color: var(--uui-color-interactive); - display: flex; - align-items: center; - padding: var(--uui-size-2); - gap: var(--uui-size-space-5); - cursor: pointer; - position: relative; - border-radius: var(--uui-border-radius); - } - .item.selected { - background-color: var(--uui-color-selected); - color: var(--uui-color-selected-contrast); - } - .item:not(.selected):hover { - background-color: var(--uui-color-surface-emphasis); - color: var(--uui-color-interactive-emphasis); - } - .item.selected:hover { - background-color: var(--uui-color-selected-emphasis); - } - .item:hover uui-avatar { - border-color: var(--uui-color-surface-emphasis); - } - .item.selected uui-avatar { - border-color: var(--uui-color-selected-contrast); - } uui-avatar { border: 2px solid var(--uui-color-surface); + font-size: 12px; } `, ]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.test.ts deleted file mode 100644 index cfe1aad2a3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/user-picker/user-picker-modal.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -//TODO: Test has been commented out while we figure out how to setup import maps for the test environment -// import { UmbPickerLayoutUserElement } from './picker-layout-user.element'; -// import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; - -// describe('UmbPickerUserElement', () => { -// let element: UmbPickerLayoutUserElement; -// beforeEach(async () => { -// element = await fixture(html``); -// }); - -// it('is defined with its own instance', () => { -// expect(element).to.be.instanceOf(UmbPickerLayoutUserElement); -// }); - -// it('passes the a11y audit', async () => { -// await expect(element).shadowDom.to.be.accessible(defaultA11yConfig); -// }); -// }); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/sources/user-collection.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/sources/user-collection.server.data.ts new file mode 100644 index 0000000000..e9d83e6971 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/sources/user-collection.server.data.ts @@ -0,0 +1,32 @@ +import type { UmbUserCollectionFilterModel } from '../../types'; +import { UmbCollectionDataSource } from '@umbraco-cms/backoffice/repository'; +import { UserResponseModel, UserResource } from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for the User that fetches data from the server + * @export + * @class UmbUserCollectionServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbUserCollectionServerDataSource implements UmbCollectionDataSource { + #host: UmbControllerHostElement; + + /** + * Creates an instance of UmbUserCollectionServerDataSource. + * @param {UmbControllerHostElement} host + * @memberof UmbUserCollectionServerDataSource + */ + constructor(host: UmbControllerHostElement) { + this.#host = host; + } + + getCollection() { + return tryExecuteAndNotify(this.#host, UserResource.getUser({})); + } + + filterCollection(filter: UmbUserCollectionFilterModel) { + return tryExecuteAndNotify(this.#host, UserResource.getUserFilter(filter)); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/sources/user.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/sources/user.server.data.ts new file mode 100644 index 0000000000..61c25ed1c6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/sources/user.server.data.ts @@ -0,0 +1,67 @@ +import { UmbUserDetailDataSource } from '../../types'; +import { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; +import { + CreateUserRequestModel, + UpdateUserRequestModel, + UserPresentationBaseModel, + UserResource, + InviteUserRequestModel, +} from '@umbraco-cms/backoffice/backend-api'; +import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for the User that fetches data from the server + * @export + * @class UmbUserServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbUserServerDataSource implements UmbUserDetailDataSource { + #host: UmbControllerHostElement; + + /** + * Creates an instance of UmbUserServerDataSource. + * @param {UmbControllerHostElement} host + * @memberof UmbUserServerDataSource + */ + constructor(host: UmbControllerHostElement) { + this.#host = host; + } + + // Details + createScaffold(parentId: string | null): Promise> { + throw new Error('Method not implemented.'); + } + + get(id: string) { + if (!id) throw new Error('Id is missing'); + return tryExecuteAndNotify(this.#host, UserResource.getUserById({ id })); + } + + insert(data: CreateUserRequestModel) { + return tryExecuteAndNotify(this.#host, UserResource.postUser({ requestBody: data })); + } + + update(id: string, data: UpdateUserRequestModel) { + if (!id) throw new Error('Id is missing'); + + return tryExecuteAndNotify( + this.#host, + UserResource.putUserById({ + id, + requestBody: data, + }) + ); + } + + delete(id: string) { + if (!id) throw new Error('Id is missing'); + return tryExecuteAndNotify(this.#host, UserResource.deleteUserById({ id })); + } + + // Invite + invite(data: InviteUserRequestModel) { + if (!data) throw new Error('Invite data is missing'); + return tryExecuteAndNotify(this.#host, UserResource.postUserInvite({ requestBody: data })); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.repository.ts index a9f65bc59d..0231b9fa7c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.repository.ts @@ -1,11 +1,140 @@ +import { UmbUserCollectionFilterModel, UmbUserDetailDataSource, UmbUserDetailRepository } from '../types'; +import { UMB_USER_STORE_CONTEXT_TOKEN, UmbUserStore } from './user.store'; +import { UmbUserServerDataSource } from './sources/user.server.data'; +import { UmbUserCollectionServerDataSource } from './sources/user-collection.server.data'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { UmbCollectionDataSource, UmbCollectionRepository } from '@umbraco-cms/backoffice/repository'; +import { + CreateUserRequestModel, + InviteUserRequestModel, + UpdateUserRequestModel, + UserResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; +import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; +import { UMB_NOTIFICATION_CONTEXT_TOKEN, UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; // TODO: implement -export class UmbUserRepository { +export class UmbUserRepository implements UmbUserDetailRepository, UmbCollectionRepository { #host: UmbControllerHostElement; + #init; + + #detailSource: UmbUserDetailDataSource; + #detailStore?: UmbUserStore; + + #collectionSource: UmbCollectionDataSource; + + #notificationContext?: UmbNotificationContext; constructor(host: UmbControllerHostElement) { this.#host = host; - console.log(this.#host); + + this.#detailSource = new UmbUserServerDataSource(this.#host); + this.#collectionSource = new UmbUserCollectionServerDataSource(this.#host); + + this.#init = Promise.all([ + new UmbContextConsumerController(this.#host, UMB_USER_STORE_CONTEXT_TOKEN, (instance) => { + this.#detailStore = instance; + }), + + new UmbContextConsumerController(this.#host, UMB_NOTIFICATION_CONTEXT_TOKEN, (instance) => { + this.#notificationContext = instance; + }), + ]); + } + + // COLLECTION + async requestCollection(filter: UmbUserCollectionFilterModel = { skip: 0, take: 100 }) { + //TODO: missing observable + return this.#collectionSource.filterCollection(filter); + } + + async filterCollection(filter: UmbUserCollectionFilterModel) { + return this.#collectionSource.filterCollection(filter); + } + + // DETAILS + createScaffold(parentId: string | null) { + if (parentId === undefined) throw new Error('Parent id is missing'); + return this.#detailSource.createScaffold(parentId); + } + + async requestById(id: string) { + if (!id) throw new Error('Id is missing'); + + const { data, error } = await this.#detailSource.get(id); + + if (data) { + this.#detailStore?.append(data); + } + + return { data, error }; + } + + async byId(id: string) { + if (!id) throw new Error('Key is missing'); + await this.#init; + return this.#detailStore!.byId(id); + } + + async create(userRequestData: CreateUserRequestModel) { + if (!userRequestData) throw new Error('Data is missing'); + + const { data: createdData, error } = await this.#detailSource.insert(userRequestData); + + if (createdData && createdData.userId) { + const { data: user, error } = await this.#detailSource.get(createdData?.userId); + + if (user) { + this.#detailStore?.append(user); + + const notification = { data: { message: `User created` } }; + this.#notificationContext?.peek('positive', notification); + + const hello = { + user, + createData: createdData, + }; + + return { data: hello, error }; + } + } + + return { error }; + } + + async invite(inviteRequestData: InviteUserRequestModel) { + if (!inviteRequestData) throw new Error('Data is missing'); + const { data, error } = await this.#detailSource.invite(inviteRequestData); + } + + async save(id: string, user: UpdateUserRequestModel) { + if (!id) throw new Error('User id is missing'); + if (!user) throw new Error('User update data is missing'); + + const { data, error } = await this.#detailSource.update(id, user); + + if (data) { + this.#detailStore?.append(data); + + const notification = { data: { message: `User saved` } }; + this.#notificationContext?.peek('positive', notification); + } + + return { data, error }; + } + + async delete(id: string) { + if (!id) throw new Error('Id is missing'); + + const { error } = await this.#detailSource.delete(id); + + if (!error) { + this.#detailStore?.remove([id]); + + const notification = { data: { message: `User deleted` } }; + this.#notificationContext?.peek('positive', notification); + } + + return { error }; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts index fa14ef77fb..f9f9f489be 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/repository/user.store.ts @@ -1,10 +1,8 @@ -import type { UserDetails } from '@umbraco-cms/backoffice/models'; -import { UmbArrayState, UmbNumberState } from '@umbraco-cms/backoffice/observable-api'; +import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbEntityDetailStore, UmbStoreBase } from '@umbraco-cms/backoffice/store'; +import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; - -export type UmbUserStoreItemType = UserDetails; +import { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; export const UMB_USER_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbUserStore'); @@ -14,291 +12,37 @@ export const UMB_USER_STORE_CONTEXT_TOKEN = new UmbContextToken('U * @extends {UmbStoreBase} * @description - Data Store for Users */ -export class UmbUserStore extends UmbStoreBase implements UmbEntityDetailStore { - public users = this._data.asObservable(); - - #totalUsers = new UmbNumberState(0); - public readonly totalUsers = this.#totalUsers.asObservable(); +export class UmbUserStore extends UmbStoreBase { + //#data = new UmbArrayState([], (x) => x.id); constructor(host: UmbControllerHostElement) { - super(host, UMB_USER_STORE_CONTEXT_TOKEN.toString(), new UmbArrayState([], (x) => x.id)); - } - - getScaffold(entityType: string, parentId: string | null) { - return { - id: '', - name: '', - icon: '', - type: 'user', - hasChildren: false, - parentId: '', - email: '', - language: '', - status: 'enabled', - updateDate: '8/27/2022', - createDate: '9/19/2022', - failedLoginAttempts: 0, - userGroups: [], - contentStartNodes: [], - mediaStartNodes: [], - } as UserDetails; - } - - getAll() { - // TODO: use Fetcher API. - // TODO: only fetch if the data type is not in the store? - fetch(`/umbraco/backoffice/users/list/items`) - .then((res) => res.json()) - .then((data) => { - this.#totalUsers.next(data.total); - this._data.next(data.items); - }); - - return this.users; + super(host, UMB_USER_STORE_CONTEXT_TOKEN.toString(), new UmbArrayState([], (x) => x.id)); } /** - * @description - Request a User by id. The User is added to the store and is returned as an Observable. - * @param {string} id - * @return {*} {(Observable)} - * @memberof UmbDataTypeStore + * Append a user to the store + * @param {UserResponseModel} user + * @memberof UmbUserStore */ - getByKey(id: string) { - // TODO: use Fetcher API. - // TODO: only fetch if the data type is not in the store? - fetch(`/umbraco/backoffice/users/details/${id}`) - .then((res) => res.json()) - .then((data) => { - this._data.appendOne(data); - }); - - return this._data.getObservablePart((users: Array) => - users.find((user: UmbUserStoreItemType) => user.id === id) - ); + append(user: UserResponseModel) { + this._data.append([user]); } /** - * @description - Request Users by ids. - * @param {string} id - * @return {*} {(Observable)} - * @memberof UmbDataTypeStore + * Get a user by id + * @param {id} string id. + * @memberof UmbUserStore */ - getByKeys(ids: Array) { - const params = ids.map((id) => `id=${id}`).join('&'); - fetch(`/umbraco/backoffice/users/getByKeys?${params}`) - .then((res) => res.json()) - .then((data) => { - this._data.append(data); - }); - - return this._data.getObservablePart((users: Array) => - users.filter((user: UmbUserStoreItemType) => ids.includes(user.id)) - ); + byId(id: UserResponseModel['id']) { + return this._data.getObservablePart((x) => x.find((y) => y.id === id)); } - getByName(name: string) { - name = name.trim(); - name = name.toLocaleLowerCase(); - - const params = `name=${name}`; - fetch(`/umbraco/backoffice/users/getByName?${params}`) - .then((res) => res.json()) - .then((data) => { - this._data.append(data); - }); - - return this._data.getObservablePart((users: Array) => - users.filter((user: UmbUserStoreItemType) => user.name.toLocaleLowerCase().includes(name)) - ); + /** + * Removes data-types in the store with the given uniques + * @param {string[]} uniques + * @memberof UmbUserStore + */ + remove(uniques: Array) { + this._data.remove(uniques); } - - async enableUsers(userKeys: Array) { - // TODO: use Fetcher API. - try { - const res = await fetch('/umbraco/backoffice/users/enable', { - method: 'POST', - body: JSON.stringify(userKeys), - headers: { - 'Content-Type': 'application/json', - }, - }); - const enabledKeys = await res.json(); - const storedUsers = this._data.getValue().filter((user) => enabledKeys.includes(user.id)); - - storedUsers.forEach((user) => { - user.status = 'enabled'; - }); - - this._data.append(storedUsers); - } catch (error) { - console.error('Enable Users failed', error); - } - } - - async updateUserGroup(userKeys: Array, userGroup: string) { - // TODO: use Fetcher API. - try { - const res = await fetch('/umbraco/backoffice/users/updateUserGroup', { - method: 'POST', - body: JSON.stringify({ userKeys, userGroup }), - headers: { - 'Content-Type': 'application/json', - }, - }); - const enabledKeys = await res.json(); - const storedUsers = this._data.getValue().filter((user) => enabledKeys.includes(user.id)); - - storedUsers.forEach((user) => { - if (userKeys.includes(user.id)) { - user.userGroups.push(userGroup); - } else { - user.userGroups = user.userGroups.filter((group: any) => group !== userGroup); - } - }); - - this._data.append(storedUsers); - } catch (error) { - console.error('Add user group failed', error); - } - } - - async removeUserGroup(userKeys: Array, userGroup: string) { - // TODO: use Fetcher API. - try { - const res = await fetch('/umbraco/backoffice/users/enable', { - method: 'POST', - body: JSON.stringify({ userKeys, userGroup }), - headers: { - 'Content-Type': 'application/json', - }, - }); - const enabledKeys = await res.json(); - const storedUsers = this._data.getValue().filter((user) => enabledKeys.includes(user.id)); - - storedUsers.forEach((user) => { - user.userGroups = user.userGroups.filter((group: any) => group !== userGroup); - }); - - this._data.append(storedUsers); - } catch (error) { - console.error('Remove user group failed', error); - } - } - - async disableUsers(userKeys: Array) { - // TODO: use Fetcher API. - try { - const res = await fetch('/umbraco/backoffice/users/disable', { - method: 'POST', - body: JSON.stringify(userKeys), - headers: { - 'Content-Type': 'application/json', - }, - }); - const disabledKeys = await res.json(); - const storedUsers = this._data.getValue().filter((user) => disabledKeys.includes(user.id)); - - storedUsers.forEach((user) => { - user.status = 'disabled'; - }); - - this._data.append(storedUsers); - } catch (error) { - console.error('Disable Users failed', error); - } - } - - async deleteUsers(userKeys: Array) { - // TODO: use Fetcher API. - try { - const res = await fetch('/umbraco/backoffice/users/delete', { - method: 'POST', - body: JSON.stringify(userKeys), - headers: { - 'Content-Type': 'application/json', - }, - }); - const deletedKeys = await res.json(); - this._data.remove(deletedKeys); - } catch (error) { - console.error('Delete Users failed', error); - } - } - - async save(users: Array) { - // TODO: use Fetcher API. - try { - const res = await fetch('/umbraco/backoffice/users/save', { - method: 'POST', - body: JSON.stringify(users), - headers: { - 'Content-Type': 'application/json', - }, - }); - const json = await res.json(); - this._data.append(json); - } catch (error) { - console.error('Save user error', error); - } - } - - async invite(name: string, email: string, message: string, userGroups: Array) { - // TODO: use Fetcher API. - try { - const res = await fetch('/umbraco/backoffice/users/invite', { - method: 'POST', - body: JSON.stringify({ name, email, message, userGroups }), - headers: { - 'Content-Type': 'application/json', - }, - }); - const json = (await res.json()) as UmbUserStoreItemType[]; - this._data.append(json); - return json[0]; - } catch (error) { - console.error('Invite user error', error); - } - - return null; - } - - // public updateUser(user: UserItem) { - // const users = this._users.getValue(); - // const index = users.findIndex((u) => u.id === user.id); - // if (index === -1) return; - // users[index] = { ...users[index], ...user }; - // console.log('updateUser', user, users[index]); - // this._users.next(users); - // this.requestUpdate('users'); - // } - - // public inviteUser(name: string, email: string, userGroup: string, message: string): UserItem { - // const users = this._users.getValue(); - // const user = { - // id: this._users.getValue().length + 1, - // id: uuidv4(), - // name: name, - // email: email, - // status: 'invited', - // language: 'en', - // updateDate: new Date().toISOString(), - // createDate: new Date().toISOString(), - // failedLoginAttempts: 0, - // userGroup: userGroup, - // }; - // this._users.next([...users, user]); - // this.requestUpdate('users'); - - // //TODO: Send invite email with message - // return user; - // } - - // public deleteUser(id: string) { - // const users = this._users.getValue(); - // const index = users.findIndex((u) => u.id === id); - // if (index === -1) return; - // users.splice(index, 1); - // this._users.next(users); - // this.requestUpdate('users'); - // } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/section-view/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/section-view/manifests.ts new file mode 100644 index 0000000000..082ff5fbc1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/section-view/manifests.ts @@ -0,0 +1,22 @@ +import { UMB_USER_SECTION_ALIAS } from '../../user-section/manifests'; +import type { ManifestSectionView } from '@umbraco-cms/backoffice/extensions-registry'; + +const sectionsViews: Array = [ + { + type: 'sectionView', + alias: 'Umb.SectionView.Users', + name: 'Users Section View', + loader: () => import('./users-section-view.element'), + weight: 200, + meta: { + label: 'Users', + pathname: 'users', + icon: 'umb:user', + }, + conditions: { + sections: [UMB_USER_SECTION_ALIAS], + }, + }, +]; + +export const manifests = [...sectionsViews]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/section-view/users-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/section-view/users-section-view.element.ts new file mode 100644 index 0000000000..d70ded9ad6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/section-view/users-section-view.element.ts @@ -0,0 +1,86 @@ +import { css, html } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement } from 'lit/decorators.js'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; + +import '../collection/views/table/user-table-collection-view.element'; +import '../collection/views/grid/user-grid-collection-view.element'; + +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +@customElement('umb-section-view-users') +export class UmbSectionViewUsersElement extends UmbLitElement { + #routes: UmbRoute[] = [ + { + path: 'collection', + component: () => import('../collection/user-collection.element'), + }, + { + path: 'user', + component: () => import('../workspace/user-workspace.element'), + }, + { + path: '**', + redirectTo: 'collection', + }, + ]; + + // // TODO: This must be turned into context api: Maybe its a Collection View (SectionView Collection View)? + // private _userStore?: UmbUserStore; + + // #users = new DeepState(>[]); + // public readonly users = this.#users.asObservable(); + + // #search = new DeepState(''); + // public readonly search = this.#search.asObservable(); + + // constructor() { + // super(); + + // this.consumeContext(UMB_USER_STORE_CONTEXT_TOKEN, (_instance) => { + // this._userStore = _instance; + // this._observeUsers(); + // }); + // } + + // private _observeUsers() { + // if (!this._userStore) return; + + // if (this.#search.getValue()) { + // this.observe(this._userStore.getByName(this.#search.getValue()), (users) => this.#users.next(users)); + // } else { + // this.observe(this._userStore.getAll(), (users) => this.#users.next(users)); + // } + // } + + // public setSearch(value?: string) { + // this.#search.next(value || ''); + // this._observeUsers(); + // this.requestUpdate('search'); + // } + + render() { + return html``; + } + + static styles = [ + UUITextStyles, + css` + :host { + height: 100%; + } + + #router-slot { + height: calc(100% - var(--umb-header-layout-height)); + } + `, + ]; +} + +export default UmbSectionViewUsersElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-section-view-users': UmbSectionViewUsersElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/types.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/types.ts new file mode 100644 index 0000000000..47d72404da --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/types.ts @@ -0,0 +1,41 @@ +import type { + CreateUserRequestModel, + CreateUserResponseModel, + DirectionModel, + InviteUserRequestModel, + UpdateUserRequestModel, + UserOrderModel, + UserResponseModel, + UserStateModel, +} from '@umbraco-cms/backoffice/backend-api'; +import { UmbDataSource, UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; + +export interface UmbCreateUserResponseModel { + user: UserResponseModel; + createData: CreateUserResponseModel; +} + +export interface UmbUserCollectionFilterModel { + skip?: number; + take?: number; + orderBy?: UserOrderModel; + orderDirection?: DirectionModel; + userGroupIds?: string[]; + userStates?: UserStateModel[]; + filter?: string; +} + +export interface UmbUserDetailDataSource + extends UmbDataSource { + invite(data: InviteUserRequestModel): Promise; +} + +export interface UmbUserDetailRepository + extends UmbDetailRepository< + CreateUserRequestModel, + UmbCreateUserResponseModel, + UpdateUserRequestModel, + UserResponseModel + > { + invite(data: InviteUserRequestModel): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/actions/workspace-action-user-save.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/actions/user-workspace-action-save.element.ts similarity index 84% rename from src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/actions/workspace-action-user-save.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/actions/user-workspace-action-save.element.ts index 505187cf1d..15e4700487 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/actions/workspace-action-user-save.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/actions/user-workspace-action-save.element.ts @@ -6,10 +6,8 @@ import { UmbUserWorkspaceContext } from '../user-workspace.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; -@customElement('umb-workspace-action-user-save') -export class UmbWorkspaceActionUserSaveElement extends UmbLitElement { - - +@customElement('umb-user-workspace-action-save') +export class UmbUserWorkspaceActionSaveElement extends UmbLitElement { @state() private _saveButtonState?: UUIButtonState; @@ -45,14 +43,14 @@ export class UmbWorkspaceActionUserSaveElement extends UmbLitElement { label="save" .state="${this._saveButtonState}">`; } - + static styles = [UUITextStyles, css``]; } -export default UmbWorkspaceActionUserSaveElement; +export default UmbUserWorkspaceActionSaveElement; declare global { interface HTMLElementTagNameMap { - 'umb-workspace-action-user-save': UmbWorkspaceActionUserSaveElement; + 'umb-user-workspace-action-save': UmbUserWorkspaceActionSaveElement; } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/manifests.ts index 6716f9d31a..90ff2445d8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/manifests.ts @@ -2,7 +2,7 @@ import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceAction, - ManifestWorkspaceView, + ManifestWorkspaceEditorView, } from '@umbraco-cms/backoffice/extensions-registry'; const workspace: ManifestWorkspace = { @@ -15,7 +15,7 @@ const workspace: ManifestWorkspace = { }, }; -const workspaceViews: Array = []; +const workspaceViews: Array = []; const workspaceActions: Array = [ { type: 'workspaceAction', diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts index a4b7fd3b18..469bf5fba4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts @@ -6,162 +6,115 @@ import { ifDefined } from 'lit/directives/if-defined.js'; import { repeat } from 'lit/directives/repeat.js'; import { UmbCurrentUserStore, UMB_CURRENT_USER_STORE_CONTEXT_TOKEN } from '../../current-user/current-user.store'; +import { getLookAndColorFromUserStatus } from '../../utils'; import { UmbUserWorkspaceContext } from './user-workspace.context'; import { UMB_CHANGE_PASSWORD_MODAL } from '@umbraco-cms/backoffice/modal'; import type { UmbModalContext } from '@umbraco-cms/backoffice/modal'; -import { getLookAndColorFromUserStatus } from '@umbraco-cms/backoffice/utils'; import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import '../../../shared/components/input-user-group/input-user-group.element'; -import '../../../shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element'; -import '../../../shared/components/workspace/workspace-layout/workspace-layout.element'; +import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; +import { UserResponseModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-user-workspace-edit') export class UmbUserWorkspaceEditElement extends UmbLitElement { - - @state() private _currentUser?: UserDetails; - private _currentUserStore?: UmbCurrentUserStore; - private _modalContext?: UmbModalContext; - - private _languages = []; //TODO Add languages - - private _workspaceContext: UmbUserWorkspaceContext = new UmbUserWorkspaceContext(this); - @state() - private _user?: UserDetails; + private _user?: UserResponseModel; - @state() - private _userName = ''; + #currentUserStore?: UmbCurrentUserStore; + #modalContext?: UmbModalContext; + #languages = []; //TODO Add languages + #workspaceContext?: UmbUserWorkspaceContext; constructor() { super(); this.consumeContext(UMB_CURRENT_USER_STORE_CONTEXT_TOKEN, (store) => { - this._currentUserStore = store; - this._observeCurrentUser(); + this.#currentUserStore = store; + this.#observeCurrentUser(); }); - this.observe(this._workspaceContext.data, (user) => { - // TODO: fix type mismatch: - this._user = user as any; - if (user && user.name !== this._userName) { - this._userName = user.name || ''; - } + this.consumeContext(UMB_ENTITY_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#workspaceContext = workspaceContext as UmbUserWorkspaceContext; + this.#observeUser(); }); } - private async _observeCurrentUser() { - if (!this._currentUserStore) return; - - // TODO: do not have static current user service, we need to make a ContextAPI for this. - this.observe(this._currentUserStore.currentUser, (currentUser) => { - this._currentUser = currentUser; - }); + #observeUser() { + if (!this.#workspaceContext) return; + this.observe(this.#workspaceContext.data, (user) => (this._user = user)); } - private _updateUserStatus() { - if (!this._user || !this._workspaceContext) return; - - const isDisabled = this._user.status === 'disabled'; - // TODO: make sure we use the workspace for this: - /* - isDisabled - ? this._workspaceContext.getStore()?.enableUsers([this._user.id]) - : this._workspaceContext.getStore()?.disableUsers([this._user.id]); - */ + #observeCurrentUser() { + if (!this.#currentUserStore) return; + this.observe(this.#currentUserStore.currentUser, (currentUser) => (this._currentUser = currentUser)); } - private _deleteUser() { - if (!this._user || !this._workspaceContext) return; + #onUserStatusChange() { + if (!this._user) return; - // TODO: make sure we use the workspace for this: - //this._workspaceContext.getStore()?.deleteUsers([this._user.id]); + if (this._user.state === UserStateModel.ACTIVE) { + //TODO: This should go directly to the user repository instead of the context so that the request is send immediately. + this.#workspaceContext?.updateProperty('state', UserStateModel.DISABLED); + } - history.pushState(null, '', 'section/users/view/users/overview'); + if (this._user.state === UserStateModel.DISABLED) { + //TODO: This should go directly to the user repository instead of the context so that the request is send immediately. + this.#workspaceContext?.updateProperty('state', UserStateModel.ACTIVE); + } + } + + #onUserDelete() { + //TODO: Delete user and redirect to user list. } // TODO. find a way where we don't have to do this for all workspaces. - private _handleInput(event: UUIInputEvent) { + #onNameChange(event: UUIInputEvent) { if (event instanceof UUIInputEvent) { const target = event.composedPath()[0] as UUIInputElement; if (typeof target?.value === 'string') { - this._updateProperty('name', target.value); + this.#workspaceContext?.updateProperty('name', target.value); } } } - private _updateProperty(propertyName: string, value: unknown) { - this._workspaceContext?.update({ [propertyName]: value }); - } - - private _renderContentStartNodes() { - if (!this._user) return; - - if (this._user.contentStartNodes.length < 1) - return html` - - - - `; - - //TODO Render the name of the content start node instead of it's id. - return repeat( - this._user.contentStartNodes, - (node) => node, - (node) => { - return html` - - - - `; - } - ); - } - - private _changePassword() { - this._modalContext?.open(UMB_CHANGE_PASSWORD_MODAL, { - requireOldPassword: this._currentUserStore?.isAdmin === false, + #onPasswordChange() { + // TODO: check if current user is admin + this.#modalContext?.open(UMB_CHANGE_PASSWORD_MODAL, { + requireOldPassword: false, }); } - private _renderActionButtons() { - if (!this._user) return; + render() { + if (!this._user) return html`User not found`; - const buttons: TemplateResult[] = []; - - if (this._currentUserStore?.isAdmin === false) return nothing; - - if (this._user?.status !== 'invited') - buttons.push( - html` - - ` - ); - - if (this._currentUser?.id !== this._user?.id) - buttons.push(html` `); - - buttons.push( - html` ` - ); - - return buttons; + return html` + + ${this.#renderHeader()} +
+
${this.#renderLeftColumn()}
+
${this.#renderRightColumn()}
+
+
+ `; } - private _renderLeftColumn() { + #renderHeader() { + return html` + + `; + } + + #renderLeftColumn() { if (!this._user) return nothing; return html` @@ -170,7 +123,7 @@ export class UmbUserWorkspaceEditElement extends UmbLitElement { - + @@ -179,15 +132,17 @@ export class UmbUserWorkspaceEditElement extends UmbLitElement { this._updateProperty('userGroups', e.target.value)}> + .value=${this._user.userGroupIds ?? []} + @change=${(e: any) => + this.#workspaceContext?.updateProperty('userGroupIds', e.target.value)}> this._updateProperty('contentStartNodes', e.target.value)} + .value=${this._user.contentStartNodeIds} + @property-value-change=${(e: any) => + this.#workspaceContext?.updateProperty('contentStartNodeIds', e.target.value)} slot="editor"> Content - ${this._renderContentStartNodes()} + ${this.#renderContentStartNodes()}
Media @@ -212,75 +167,116 @@ export class UmbUserWorkspaceEditElement extends UmbLitElement {
`; } - private _renderRightColumn() { - if (!this._user || !this._workspaceContext) return nothing; + #renderRightColumn() { + if (!this._user || !this.#workspaceContext) return nothing; - const statusLook = getLookAndColorFromUserStatus(this._user.status); + const statusLook = getLookAndColorFromUserStatus(this._user.state); return html`

- ${this._renderActionButtons()} + ${this.#renderActionButtons()} +
Status: - ${this._user.status} + ${this._user.state}
- ${this._user?.status === 'invited' + + ${this._user?.state === UserStateModel.INVITED ? html` ` : nothing} -
- Last login: - ${this._user.lastLoginDate || `${this._user.name} has not logged in yet`} -
-
- Failed login attempts - ${this._user.failedLoginAttempts} -
-
- Last lockout date: - ${this._user.lastLockoutDate || `${this._user.name} has not been locked out`} -
-
- Password last changed: - ${this._user.lastLoginDate || `${this._user.name} has not changed password`} -
-
- User created: - ${this._user.createDate} -
-
- User last updated: - ${this._user.updateDate} -
-
- Key: - ${this._user.id} -
+ ${this.#renderInfoItem('Last login', this._user.lastLoginDate || `${this._user.name} has not logged in yet`)} + ${this.#renderInfoItem('Failed login attempts', this._user.failedLoginAttempts)} + ${this.#renderInfoItem( + 'Last lockout date', + this._user.lastlockoutDate || `${this._user.name} has not been locked out` + )} + ${this.#renderInfoItem( + 'Password last changed', + this._user.lastLoginDate || `${this._user.name} has not changed password` + )} + ${this.#renderInfoItem('User created', this._user.createDate)} + ${this.#renderInfoItem('User last updated', this._user.updateDate)} + ${this.#renderInfoItem('Key', this._user.id)}
`; } - render() { - if (!this._user) return html`User not found`; - + #renderInfoItem(label: string, value?: string | number) { return html` - - -
-
${this._renderLeftColumn()}
-
${this._renderRightColumn()}
-
-
+
+ ${label} + ${value} +
`; } - + + #renderActionButtons() { + if (!this._user) return nothing; + + //TODO: Find out if the current user is an admin. If not, show no buttons. + // if (this._currentUserStore?.isAdmin === false) return nothing; + + const buttons: TemplateResult[] = []; + + if (this._user.state !== UserStateModel.INVITED) { + const button = html` + + `; + + buttons.push(button); + } + + if (this._currentUser?.id !== this._user?.id) { + const button = html` + + `; + + buttons.push(button); + } + + buttons.push( + html`` + ); + + return buttons; + } + + #renderContentStartNodes() { + if (!this._user || !this._user.contentStartNodeIds) return; + + if (this._user.contentStartNodeIds.length < 1) + return html` + + + + `; + + //TODO Render the name of the content start node instead of it's id. + return repeat( + this._user.contentStartNodeIds, + (node) => node, + (node) => { + return html` + + + + `; + } + ); + } + static styles = [ UUITextStyles, css` @@ -289,6 +285,13 @@ export class UmbUserWorkspaceEditElement extends UmbLitElement { height: 100%; } + #header { + width: 100%; + display: grid; + grid-template-columns: var(--uui-size-layout-1) 1fr; + padding: var(--uui-size-layout-1); + } + #main { display: grid; grid-template-columns: 1fr 350px; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.context.ts index 66d6589d2c..b305057f64 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.context.ts @@ -1,55 +1,71 @@ -import { UMB_USER_STORE_CONTEXT_TOKEN } from '../repository/user.store'; import { UmbWorkspaceContext } from '../../../shared/components/workspace/workspace-context/workspace-context'; -import { UmbEntityWorkspaceManager } from '../../../shared/components/workspace/workspace-context/entity-manager-controller'; import { UmbUserRepository } from '../repository/user.repository'; import { UmbEntityWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; -import type { UserDetails } from '@umbraco-cms/backoffice/models'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; +import { + UpdateUserGroupRequestModel, + UpdateUserRequestModel, + UserResponseModel, +} from '@umbraco-cms/backoffice/backend-api'; +import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; export class UmbUserWorkspaceContext - extends UmbWorkspaceContext - implements UmbEntityWorkspaceContextInterface + extends UmbWorkspaceContext + implements UmbEntityWorkspaceContextInterface { - #manager = new UmbEntityWorkspaceManager( - this.host, - 'user', - UMB_USER_STORE_CONTEXT_TOKEN - ); - - public readonly data = this.#manager.state.asObservable(); - public readonly name = this.#manager.state.getObservablePart((state) => state?.name); - - // TODO: remove this magic connection, instead create the necessary methods to update parts. - update = this.#manager.state.update; - constructor(host: UmbControllerHostElement) { super(host, new UmbUserRepository(host)); } - setName(name: string) { - this.#manager.state.update({ name: name }); - } - getEntityType = this.#manager.getEntityType; - getUnique = this.#manager.getEntityKey; - getEntityId = this.#manager.getEntityKey; - getStore = this.#manager.getStore; - getData = this.#manager.getData as any; // TODO: fix type mismatch, this will mos likely be handled when switching to repositories. - load = this.#manager.load; - create = this.#manager.create; - save = this.#manager.save; - destroy = this.#manager.destroy; + #data = new UmbObjectState(undefined); + data = this.#data.asObservable(); - getName() { - throw new Error('getName is not implemented for UmbWorkspaceUserContext'); + async load(id: string) { + console.log('load'); + + const { data } = await this.repository.requestById(id); + if (data) { + this.setIsNew(false); + this.#data.update(data); + } } - propertyValueByAlias(alias: string) { - throw new Error('setPropertyValue is not implemented for UmbWorkspaceUserContext'); + getEntityId(): string | undefined { + return this.getData()?.id || ''; } - getPropertyValue(alias: string) { - throw new Error('setPropertyValue is not implemented for UmbWorkspaceUserContext'); + + getEntityType(): string { + return 'user'; } - setPropertyValue(alias: string, value: unknown) { - throw new Error('setPropertyValue is not implemented for UmbWorkspaceUserContext'); + + getData() { + return this.#data.getValue(); + } + + updateProperty( + propertyName: PropertyName, + value: UserResponseModel[PropertyName] + ) { + this.#data.update({ [propertyName]: value }); + } + + async save() { + if (!this.#data.value) return; + if (!this.#data.value.id) return; + + console.log('save', this.#data.value, this.getIsNew()); + + if (this.getIsNew()) { + await this.repository.create(this.#data.value); + } else { + //TODO: temp hack: why does the response model allow for nulls but not the request model? + await this.repository.save(this.#data.value.id, this.#data.value as UpdateUserRequestModel); + } + // If it went well, then its not new anymore?. + this.setIsNew(false); + } + + destroy(): void { + this.#data.complete(); } } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts index 070d1a03dd..864cf1c6c4 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts @@ -4,23 +4,21 @@ import { customElement, state } from 'lit/decorators.js'; import { UmbUserWorkspaceContext } from './user-workspace.context'; import { UmbUserWorkspaceEditElement } from './user-workspace-edit.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { IRoute } from '@umbraco-cms/backoffice/router'; +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import '../../../shared/components/input-user-group/input-user-group.element'; import '../../../shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element'; -import '../../../shared/components/workspace/workspace-layout/workspace-layout.element'; +import '../../../shared/components/workspace/workspace-editor/workspace-editor.element'; @customElement('umb-user-workspace') export class UmbUserWorkspaceElement extends UmbLitElement { - - #workspaceContext = new UmbUserWorkspaceContext(this); #element = new UmbUserWorkspaceEditElement(); @state() - _routes: IRoute[] = [ + _routes: UmbRoute[] = [ { - path: 'edit/:id', + path: ':id', component: () => this.#element, setup: (component, info) => { const id = info.match.params.id; @@ -32,7 +30,7 @@ export class UmbUserWorkspaceElement extends UmbLitElement { render() { return html` `; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/libs/utils/utils.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/utils.test.ts similarity index 52% rename from src/Umbraco.Web.UI.Client/libs/utils/utils.test.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/utils.test.ts index 36bbe2e2a0..56e8f0f197 100644 --- a/src/Umbraco.Web.UI.Client/libs/utils/utils.test.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/utils.test.ts @@ -1,15 +1,15 @@ import { expect } from '@open-wc/testing'; import { InterfaceColor, InterfaceLook } from '@umbraco-ui/uui-base/lib/types'; import { getLookAndColorFromUserStatus } from './utils'; -import type { UserStatus } from '@umbraco-cms/backoffice/models'; +import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; describe('UmbUserExtensions', () => { it('returns correct look and color from a status string', () => { - const testCases: { status: UserStatus; look: InterfaceLook; color: InterfaceColor }[] = [ - { status: 'enabled', look: 'primary', color: 'positive' }, - { status: 'inactive', look: 'primary', color: 'warning' }, - { status: 'invited', look: 'primary', color: 'warning' }, - { status: 'disabled', look: 'primary', color: 'danger' }, + const testCases: { status: UserStateModel; look: InterfaceLook; color: InterfaceColor }[] = [ + { status: UserStateModel.ACTIVE, look: 'primary', color: 'positive' }, + { status: UserStateModel.INACTIVE, look: 'primary', color: 'warning' }, + { status: UserStateModel.INVITED, look: 'primary', color: 'warning' }, + { status: UserStateModel.DISABLED, look: 'primary', color: 'danger' }, ]; testCases.forEach((testCase) => { diff --git a/src/Umbraco.Web.UI.Client/libs/utils/utils.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/utils.ts similarity index 55% rename from src/Umbraco.Web.UI.Client/libs/utils/utils.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/utils.ts index 76da7bba7c..18bfa29ba1 100644 --- a/src/Umbraco.Web.UI.Client/libs/utils/utils.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/utils.ts @@ -1,14 +1,16 @@ import { InterfaceColor, InterfaceLook } from '@umbraco-ui/uui-base/lib/types'; -import type { UserStatus } from '@umbraco-cms/backoffice/models'; +import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -export const getLookAndColorFromUserStatus = (status: UserStatus): { look: InterfaceLook; color: InterfaceColor } => { - switch ((status || '').toLowerCase()) { - case 'invited': - case 'inactive': +export const getLookAndColorFromUserStatus = ( + status?: UserStateModel +): { look: InterfaceLook; color: InterfaceColor } => { + switch (status) { + case UserStateModel.INACTIVE: + case UserStateModel.INVITED: return { look: 'primary', color: 'warning' }; - case 'enabled': + case UserStateModel.ACTIVE: return { look: 'primary', color: 'positive' }; - case 'disabled': + case UserStateModel.DISABLED: return { look: 'primary', color: 'danger' }; default: return { look: 'secondary', color: 'default' }; diff --git a/src/Umbraco.Web.UI.Client/src/core/auth/auth-flow.ts b/src/Umbraco.Web.UI.Client/src/core/auth/auth-flow.ts new file mode 100644 index 0000000000..3ba33d0c15 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/auth/auth-flow.ts @@ -0,0 +1,319 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +import { + BaseTokenRequestHandler, + BasicQueryStringUtils, + FetchRequestor, + LocalStorageBackend, + RedirectRequestHandler, +} from '@openid/appauth'; +import { AuthorizationRequest } from '@openid/appauth/built/authorization_request'; +import { AuthorizationNotifier } from '@openid/appauth/built/authorization_request_handler'; +import { AuthorizationServiceConfiguration } from '@openid/appauth/built/authorization_service_configuration'; +import { + GRANT_TYPE_AUTHORIZATION_CODE, + GRANT_TYPE_REFRESH_TOKEN, + TokenRequest, +} from '@openid/appauth/built/token_request'; +import { TokenResponse } from '@openid/appauth/built/token_response'; +import { LocationLike, StringMap } from '@openid/appauth/built/types'; + +const requestor = new FetchRequestor(); + +/** + * This class is needed to prevent the hash from being parsed as part of the query string. + */ +class UmbNoHashQueryStringUtils extends BasicQueryStringUtils { + parse(input: LocationLike) { + return super.parse(input, false); + } +} + +/** + * This class is used to handle the auth flow through any backend supporting OpenID Connect. + * It needs to know the server url, the client id, the redirect uri and the scope. + * + * For a default Umbraco installation, the server url is the base url of the Umbraco server. + * and the client id is "umbraco-back-office" + * and the scope is "offline_access" + * + * It will: + * - Fetch the service configuration from the server + * - Check if there is a token response in local storage + * - If there is a token response, check if it is valid + * - If it is not valid, check if there is a new authorization to be made + * - If there is a new authorization to be made, complete it + * - If there is no token response, check if there is a new authorization to be made + * - If there is a new authorization to be made, complete it + * - If there is no new authorization to be made, do nothing (= logged in) + * + * It will also: + * - Save the token response in local storage + * - Save the authorization code in local storage + * + * It will also provide methods to: + * - Make a refresh token request + * - Perform an action with fresh tokens + * - Clear the token state (logout) + * + * It should be used as follows: + * 1. Create an instance of this class + * 2. Call the `setInitialState` method on startup + * a. This will fetch the service configuration and check if there is a token response in the storage backend + * b. If there is a token response, it will check if it is valid and if it is not, it will check if there is a new authorization to be made + * which happens when the user is redirected back to the app after logging in + * 3. Call the `makeAuthorizationRequest` method on all pages that need to be authorized + * a. This will redirect the user to the authorization endpoint of the server + * 4. After login, get the latest token before each request to the server by calling the `performWithFreshTokens` method + */ +export class UmbAuthFlow { + // handlers + readonly #notifier: AuthorizationNotifier; + readonly #authorizationHandler: RedirectRequestHandler; + readonly #tokenHandler: BaseTokenRequestHandler; + readonly #storageBackend: LocalStorageBackend; + + // state + #configuration: AuthorizationServiceConfiguration | undefined; + readonly #openIdConnectUrl: string; + readonly #redirectUri: string; + readonly #clientId: string; + readonly #scope: string; + + // tokens + #refreshToken: string | undefined; + #accessTokenResponse: TokenResponse | undefined; + + constructor( + openIdConnectUrl: string, + redirectUri: string, + clientId = 'umbraco-back-office', + scope = 'offline_access' + ) { + this.#openIdConnectUrl = openIdConnectUrl; + this.#redirectUri = redirectUri; + this.#clientId = clientId; + this.#scope = scope; + + this.#notifier = new AuthorizationNotifier(); + this.#tokenHandler = new BaseTokenRequestHandler(requestor); + this.#storageBackend = new LocalStorageBackend(); + this.#authorizationHandler = new RedirectRequestHandler( + this.#storageBackend, + new UmbNoHashQueryStringUtils(), + window.location + ); + + // set notifier to deliver responses + this.#authorizationHandler.setAuthorizationNotifier(this.#notifier); + + // set a listener to listen for authorization responses + this.#notifier.setAuthorizationListener(async (request, response, error) => { + if (error) { + console.error('Authorization error', error); + throw error; + } + + if (response) { + let codeVerifier: string | undefined; + if (request.internal && request.internal.code_verifier) { + codeVerifier = request.internal.code_verifier; + } + + await this.#makeRefreshTokenRequest(response.code, codeVerifier); + await this.performWithFreshTokens(); + await this.#saveTokenState(); + } + }); + } + + /** + * This method will initialize all the state needed for the auth flow. + * + * It will: + * - Fetch the service configuration from the server + * - Check if there is a token response in local storage + * - If there is a token response, check if it is valid + * - If it is not valid, check if there is a new authorization to be made + * - If there is a new authorization to be made, complete it + * - If there is no token response, check if there is a new authorization to be made + * - If there is a new authorization to be made, complete it + * - If there is no new authorization to be made, do nothing + */ + async setInitialState() { + // Ensure there is a connection to the server + await this.fetchServiceConfiguration(); + const tokenResponseJson = await this.#storageBackend.getItem('tokenResponse'); + if (tokenResponseJson) { + const response = new TokenResponse(JSON.parse(tokenResponseJson)); + if (response.isValid()) { + this.#accessTokenResponse = response; + this.#refreshToken = this.#accessTokenResponse.refreshToken; + return; + } + } + + // If no token was found, or if it was invalid, check if there is a new authorization to be made + await this.completeAuthorizationIfPossible(); + } + + /** + * This method will check if there is a new authorization to be made and complete it if there is. + * This method will be called on initialization to check if there is a new authorization to be made. + * It is useful if there is a ?code query string parameter in the URL from the server or if the auth flow + * saved the state in local storage before redirecting the user to the login page. + */ + completeAuthorizationIfPossible() { + return this.#authorizationHandler.completeAuthorizationRequestIfPossible(); + } + + /** + * This method will query the server for the service configuration usually found at /.well-known/openid-configuration. + */ + async fetchServiceConfiguration(): Promise { + const response = await AuthorizationServiceConfiguration.fetchFromIssuer(this.#openIdConnectUrl, requestor); + this.#configuration = response; + } + + /** + * This method will make an authorization request to the server. + * + * @param username The username to use for the authorization request. It will be provided to the OpenID server as a hint. + */ + makeAuthorizationRequest(username?: string): void { + if (!this.#configuration) { + console.log('Unknown service configuration'); + throw new Error('Unknown service configuration'); + } + + const extras: StringMap = { prompt: 'consent', access_type: 'offline' }; + + if (username) { + extras['login_hint'] = username; + } + + // create a request + const request = new AuthorizationRequest( + { + client_id: this.#clientId, + redirect_uri: this.#redirectUri, + scope: this.#scope, + response_type: AuthorizationRequest.RESPONSE_TYPE_CODE, + state: undefined, + extras: extras, + }, + undefined, + true + ); + + this.#authorizationHandler.performAuthorizationRequest(this.#configuration, request); + } + + /** + * This method will check if the user is logged in by validting the timestamp of the stored token. + * If no token is stored, it will return false. + * + * @returns true if the user is logged in, false otherwise. + */ + loggedIn(): boolean { + return !!this.#accessTokenResponse && this.#accessTokenResponse.isValid(); + } + + /** + * This method will sign the user out of the application. + */ + async signOut() { + // forget all cached token state + this.#accessTokenResponse = undefined; + this.#refreshToken = undefined; + await this.#storageBackend.removeItem('tokenResponse'); + } + + /** + * This method will check if the token needs to be refreshed and if so, it will refresh it and return the new access token. + * If the token does not need to be refreshed, it will return the current access token. + * + * @returns The access token for the user. + */ + async performWithFreshTokens(): Promise { + if (!this.#configuration) { + console.log('Unknown service configuration'); + return Promise.reject('Unknown service configuration'); + } + + if (!this.#refreshToken) { + console.log('Missing refreshToken.'); + return Promise.resolve('Missing refreshToken.'); + } + + if (this.#accessTokenResponse && this.#accessTokenResponse.isValid()) { + // do nothing + return Promise.resolve(this.#accessTokenResponse.accessToken); + } + + const request = new TokenRequest({ + client_id: this.#clientId, + redirect_uri: this.#redirectUri, + grant_type: GRANT_TYPE_REFRESH_TOKEN, + code: undefined, + refresh_token: this.#refreshToken, + extras: undefined, + }); + + const response = await this.#tokenHandler.performTokenRequest(this.#configuration, request); + this.#accessTokenResponse = response; + return response.accessToken; + } + + /** + * Save the current token response to local storage. + */ + async #saveTokenState() { + if (this.#accessTokenResponse) { + await this.#storageBackend.setItem('tokenResponse', JSON.stringify(this.#accessTokenResponse.toJson())); + } + } + + /** + * This method will make a token request to the server using the authorization code. + */ + async #makeRefreshTokenRequest(code: string, codeVerifier: string | undefined): Promise { + if (!this.#configuration) { + console.log('Unknown service configuration'); + return Promise.reject(); + } + + const extras: StringMap = {}; + + if (codeVerifier) { + extras.code_verifier = codeVerifier; + } + + // use the code to make the token request. + const request = new TokenRequest({ + client_id: this.#clientId, + redirect_uri: this.#redirectUri, + grant_type: GRANT_TYPE_AUTHORIZATION_CODE, + code: code, + refresh_token: undefined, + extras: extras, + }); + + const response = await this.#tokenHandler.performTokenRequest(this.#configuration, request); + this.#refreshToken = response.refreshToken; + this.#accessTokenResponse = response; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts index 9eb9ba8be8..fbe98cc14f 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts @@ -1,5 +1,5 @@ -import { v4 as uuid } from 'uuid'; import { UmbData } from './data'; +import { UmbId } from '@umbraco-cms/backoffice/id'; import type { Entity } from '@umbraco-cms/backoffice/models'; // Temp mocked database @@ -71,7 +71,7 @@ export class UmbEntityData extends UmbData { return { ...item, name: item.name + ' Copy', - id: uuid(), + id: UmbId.new(), parentId: destinationKey, }; }); diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/template.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/template.data.ts index 54a43fd6d2..12e1459373 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/template.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/template.data.ts @@ -1,6 +1,6 @@ -import { v4 as uuid } from 'uuid'; import { UmbEntityData } from './entity.data'; import { createEntityTreeItem } from './utils'; +import { UmbId } from '@umbraco-cms/backoffice/id'; import { EntityTreeItemResponseModel, PagedEntityTreeItemResponseModel, @@ -101,7 +101,7 @@ class UmbTemplateData extends UmbEntityData { create(templateData: TemplateModelBaseModel) { const template = { $type: '', - id: uuid(), + id: UmbId.new(), ...templateData, }; this.data.push(template); diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/users.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/users.data.ts index 740b6a1957..dc758d954f 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/users.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/users.data.ts @@ -1,2375 +1,179 @@ -import { UmbEntityData } from './entity.data'; -import type { UserDetails } from '@umbraco-cms/backoffice/models'; +import { UmbData } from './data'; +import { PagedUserResponseModel, UserResponseModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; // Temp mocked database -class UmbUsersData extends UmbEntityData { - constructor(data: UserDetails[]) { +class UmbUsersData extends UmbData { + constructor(data: UserResponseModel[]) { super(data); } - getAll() { - return this.data; + getAll(): PagedUserResponseModel { + return { + total: this.data.length, + items: this.data, + }; } - updateUserGroup(ids: string[], userGroup: string) { - this.data.forEach((user) => { - if (ids.includes(user.id)) { - user.userGroups = [...user.userGroups, userGroup]; - } else { - user.userGroups = user.userGroups.filter((group) => group !== userGroup); + getById(id: string): UserResponseModel | undefined { + return this.data.find((user) => user.id === id); + } + + save(saveItem: UserResponseModel) { + const foundIndex = this.data.findIndex((item) => item.id === saveItem.id); + if (foundIndex !== -1) { + // update + this.data[foundIndex] = saveItem; + this.updateData(saveItem); + } else { + // new + this.data.push(saveItem); + } + + return saveItem; + } + + protected updateData(updateItem: UserResponseModel) { + const itemIndex = this.data.findIndex((item) => item.id === updateItem.id); + const item = this.data[itemIndex]; + + console.log('updateData', updateItem, itemIndex, item); + + if (!item) return; + + const itemKeys = Object.keys(item); + const newItem = {}; + + for (const [key] of Object.entries(updateItem)) { + if (itemKeys.indexOf(key) !== -1) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + newItem[key] = updateItem[key]; } + } - this.updateData(user); - }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this.data[itemIndex] = newItem; - return this.data.map((user) => user.id); + console.log('updateData', this.data[itemIndex]); } - enable(ids: string[]) { - const users = this.data.filter((user) => ids.includes(user.id)); - users.forEach((user) => { - user.status = 'enabled'; - this.updateData(user); - }); - return users.map((user) => user.id); - } + // updateUserGroup(ids: string[], userGroup: string) { + // this.data.forEach((user) => { + // if (ids.includes(user.id)) { + // } else { + // } - disable(ids: string[]) { - const users = this.data.filter((user) => ids.includes(user.id)); - users.forEach((user) => { - user.status = 'disabled'; - this.updateData(user); - }); - return users.map((user) => user.id); - } + // this.updateData(user); + // }); + + // return this.data.map((user) => user.id); + // } + + // enable(ids: string[]) { + // const users = this.data.filter((user) => ids.includes(user.id)); + // users.forEach((user) => { + // user.status = 'enabled'; + // this.updateData(user); + // }); + // return users.map((user) => user.id); + // } + + // disable(ids: string[]) { + // const users = this.data.filter((user) => ids.includes(user.id)); + // users.forEach((user) => { + // user.status = 'disabled'; + // this.updateData(user); + // }); + // return users.map((user) => user.id); + // } } -export const data: Array = [ - { - id: 'a953e376-89f8-46d1-bed9-1b47743aa38a', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Lasse Fredslund', - email: 'lrozycki0@technorati.com', - language: 'Bosnian', - status: 'invited', - lastLoginDate: '10/8/2022', - lastLockoutDate: '10/4/2022', - lastPasswordChangeDate: '3/7/2022', - updateDate: '12/1/2021', - createDate: '4/14/2022', - failedLoginAttempts: 895, - userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1'], - }, +export const data: Array = [ { id: 'bca6c733-a63d-4353-a271-9a8b6bcca8bd', type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', + $type: 'UserResponseModel', + contentStartNodeIds: [], + mediaStartNodeIds: [], name: 'Erny Baptista', email: 'ebaptista1@csmonitor.com', - language: 'Kannada', - status: 'disabled', + languageIsoCode: 'Kannada', + state: UserStateModel.ACTIVE, lastLoginDate: '9/10/2022', - lastLockoutDate: '11/23/2021', + lastlockoutDate: '11/23/2021', lastPasswordChangeDate: '1/10/2022', updateDate: '2/10/2022', createDate: '3/13/2022', failedLoginAttempts: 946, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], }, { - id: '9f63996f-71e9-49be-bc21-5a69ea97e72e', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Boris Shovel', - email: 'bshovel2@pen.io', - language: 'Tajik', - status: 'invited', - lastLoginDate: '9/15/2022', - lastLockoutDate: '1/13/2022', - lastPasswordChangeDate: '11/7/2021', - updateDate: '9/20/2022', - createDate: '12/19/2021', - failedLoginAttempts: 915, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: 'ff1d1bff-b6d2-444b-950a-68b5eec46277', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Emalee Danbye', - email: 'edanbye3@economist.com', - language: 'Dari', - status: 'disabled', - lastLoginDate: '11/28/2021', - lastLockoutDate: '8/26/2022', - lastPasswordChangeDate: '10/1/2022', - updateDate: '2/27/2022', - createDate: '4/13/2022', - failedLoginAttempts: 728, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: 'c9cf849f-0536-4e38-a91a-02c8c45a6f47', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Fidel Bastiman', - email: 'fbastiman4@sitemeter.com', - language: 'Dari', - status: 'invited', - lastLoginDate: '9/22/2022', - lastLockoutDate: '10/26/2022', - lastPasswordChangeDate: '10/20/2022', - updateDate: '3/20/2022', - createDate: '12/22/2021', - failedLoginAttempts: 57, - userGroups: ['b847398a-6875-4d7a-9f6d-231256b81471', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], - }, - { - id: 'd9cbd4cd-6950-42b2-be57-1f5829c6dd19', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Roxanne Pitkins', - email: 'rpitkins5@huffingtonpost.com', - language: 'Bengali', - status: 'invited', - lastLoginDate: '1/2/2022', - lastLockoutDate: '6/4/2022', - lastPasswordChangeDate: '4/28/2022', - updateDate: '1/9/2022', - createDate: '3/21/2022', - failedLoginAttempts: 336, - userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', 'b847398a-6875-4d7a-9f6d-231256b81471'], - }, - { - id: '515b2c5c-c195-43f2-8e52-4733572030c7', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: "Ag O'Crowley", - email: 'aocrowley6@apache.org', - language: 'Moldovan', - status: 'enabled', - lastLoginDate: '10/19/2022', - lastLockoutDate: '12/4/2021', - lastPasswordChangeDate: '10/5/2022', - updateDate: '3/25/2022', - createDate: '4/23/2022', - failedLoginAttempts: 197, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: 'db8a0800-28b3-4f0b-9152-37debea6b8d7', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Roddy Tebbutt', - email: 'rtebbutt7@upenn.edu', - language: 'Tok Pisin', - status: 'enabled', - lastLoginDate: '9/29/2022', - lastLockoutDate: '11/5/2021', - lastPasswordChangeDate: '9/14/2022', - updateDate: '4/1/2022', - createDate: '8/11/2022', - failedLoginAttempts: 764, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: '3fe38c9b-b5a3-4897-8507-3f062a25659e', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Sharyl Galland', - email: 'sgalland8@cdc.gov', - language: 'Catalan', - status: 'inactive', - lastLoginDate: '10/23/2022', - lastLockoutDate: '11/20/2021', - lastPasswordChangeDate: '6/14/2022', - updateDate: '6/18/2022', - createDate: '3/8/2022', - failedLoginAttempts: 116, - userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], - }, - { - id: '09e99152-bc3e-449f-9fa1-322ab3390b7d', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'My Ringrose', - email: 'mringrose9@blinklist.com', - language: 'Armenian', - status: 'enabled', - lastLoginDate: '3/31/2022', - lastLockoutDate: '8/1/2022', - lastPasswordChangeDate: '2/27/2022', - updateDate: '2/8/2022', - createDate: '8/9/2022', - failedLoginAttempts: 908, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: '5680bd61-9b58-4ecb-ae06-bdfacebe05f2', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Bart Lumm', - email: 'blumma@wordpress.com', - language: 'Māori', - status: 'disabled', - lastLoginDate: '1/15/2022', - lastLockoutDate: '3/30/2022', - lastPasswordChangeDate: '8/7/2022', - updateDate: '6/26/2022', - createDate: '10/22/2022', - failedLoginAttempts: 564, - userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1'], - }, - { - id: '1c2cb6b5-1b96-47c0-a2b7-f5dd6bd3d325', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Roch Baldam', - email: 'rbaldamb@eventbrite.com', - language: 'Kyrgyz', - status: 'enabled', - lastLoginDate: '3/28/2022', - lastLockoutDate: '3/16/2022', - lastPasswordChangeDate: '12/15/2021', - updateDate: '4/18/2022', - createDate: '8/11/2022', - failedLoginAttempts: 120, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: 'ac6cc4e4-ab38-4920-8646-63c7652fc97a', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Franni Devonport', - email: 'fdevonportc@tinyurl.com', - language: 'Burmese', - status: 'inactive', - lastLoginDate: '8/15/2022', - lastLockoutDate: '3/31/2022', - lastPasswordChangeDate: '2/17/2022', - updateDate: '7/10/2022', - createDate: '3/16/2022', - failedLoginAttempts: 52, - userGroups: ['b847398a-6875-4d7a-9f6d-231256b81471', '2668f09b-320c-48a7-a78a-95047026ec0e'], - }, - { - id: 'a5e5bbe4-acb4-4c40-b15a-eab510338620', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Karalee Guillet', - email: 'kguilletd@de.vu', - language: 'Kurdish', - status: 'invited', - lastLoginDate: '5/14/2022', - lastLockoutDate: '7/6/2022', - lastPasswordChangeDate: '1/26/2022', - updateDate: '12/1/2021', - createDate: '10/19/2022', - failedLoginAttempts: 988, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: 'c775af23-4aec-4d24-a2d1-5b0d666c9eb4', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Lynnet Massimo', - email: 'lmassimoe@fotki.com', - language: 'Swati', - status: 'disabled', - lastLoginDate: '6/8/2022', - lastLockoutDate: '11/4/2021', - lastPasswordChangeDate: '11/25/2021', - updateDate: '5/10/2022', - createDate: '1/21/2022', - failedLoginAttempts: 148, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: '3333e2dc-b8a6-4db3-af00-ac1c1e1d5d9c', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Saraann Boullin', - email: 'sboullinf@reverbnation.com', - language: 'Māori', - status: 'inactive', - lastLoginDate: '12/19/2021', - lastLockoutDate: '10/2/2022', - lastPasswordChangeDate: '1/6/2022', - updateDate: '2/16/2022', - createDate: '12/19/2021', - failedLoginAttempts: 132, - userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], - }, - { - id: '506126e3-2b96-4746-bd0a-1e6b2283021f', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Darrelle Applebee', - email: 'dapplebeeg@indiatimes.com', - language: 'Macedonian', - status: 'inactive', - lastLoginDate: '6/30/2022', - lastLockoutDate: '2/1/2022', - lastPasswordChangeDate: '6/17/2022', - updateDate: '10/22/2022', - createDate: '3/1/2022', - failedLoginAttempts: 229, - userGroups: ['9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', 'b847398a-6875-4d7a-9f6d-231256b81471'], - }, - { - id: 'caf10593-3710-4417-af3d-7015f88f5fe3', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Arline Currom', - email: 'acurromh@aboutads.info', - language: 'Punjabi', - status: 'enabled', - lastLoginDate: '1/18/2022', - lastLockoutDate: '6/29/2022', - lastPasswordChangeDate: '11/27/2021', - updateDate: '5/30/2022', - createDate: '4/7/2022', - failedLoginAttempts: 419, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: 'e2492eeb-bcc2-4c95-8893-27c45c895c9c', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Job Russell', - email: 'jrusselli@networksolutions.com', - language: 'Mongolian', - status: 'inactive', - lastLoginDate: '9/8/2022', - lastLockoutDate: '3/29/2022', - lastPasswordChangeDate: '5/6/2022', - updateDate: '9/23/2022', - createDate: '9/7/2022', - failedLoginAttempts: 924, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: '8c93b359-a719-4453-991c-e2d5bcc965c3', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Helenka Hawkeridge', - email: 'hhawkeridgej@elegantthemes.com', - language: 'Norwegian', - status: 'disabled', - lastLoginDate: '1/24/2022', - lastLockoutDate: '4/6/2022', - lastPasswordChangeDate: '7/20/2022', - updateDate: '5/25/2022', - createDate: '11/15/2021', - failedLoginAttempts: 7, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: '4cd22c7c-baeb-463f-89e5-e0a6bb3ea27e', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Cherida Navarijo', - email: 'cnavarijok@webeden.co.uk', - language: 'Swati', - status: 'inactive', - lastLoginDate: '4/19/2022', - lastLockoutDate: '10/16/2022', - lastPasswordChangeDate: '9/12/2022', - updateDate: '6/30/2022', - createDate: '12/12/2021', - failedLoginAttempts: 178, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: 'ccd03e29-e924-4240-a1e4-b0114c66aae9', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Monte Lissandrini', - email: 'mlissandrinil@dailymail.co.uk', - language: 'English', - status: 'enabled', - lastLoginDate: '1/16/2022', - lastLockoutDate: '10/4/2022', - lastPasswordChangeDate: '4/3/2022', - updateDate: '5/10/2022', - createDate: '7/8/2022', - failedLoginAttempts: 937, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: '7ffa97ca-0702-4bcf-8e32-751bae9aa156', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Cristobal Hincks', - email: 'chincksm@cam.ac.uk', - language: 'Swahili', - status: 'disabled', - lastLoginDate: '1/10/2022', - lastLockoutDate: '11/15/2021', - lastPasswordChangeDate: '7/3/2022', - updateDate: '2/5/2022', - createDate: '11/12/2021', - failedLoginAttempts: 737, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: 'e139ec4b-b49a-48c0-a1a3-1c2e8e95366d', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Darrick Simeoli', - email: 'dsimeolin@craigslist.org', - language: 'Assamese', - status: 'enabled', - lastLoginDate: '6/18/2022', - lastLockoutDate: '6/11/2022', - lastPasswordChangeDate: '1/21/2022', - updateDate: '9/13/2022', - createDate: '12/11/2021', - failedLoginAttempts: 956, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: '30d29d56-cbb2-41fd-9154-94b0f0d9a385', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Vernice Lilford', - email: 'vlilfordo@sohu.com', - language: 'Irish Gaelic', - status: 'invited', - lastLoginDate: '12/2/2021', - lastLockoutDate: '11/27/2021', - lastPasswordChangeDate: '9/3/2022', - updateDate: '1/23/2022', - createDate: '6/17/2022', - failedLoginAttempts: 663, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: '3ecac483-c4df-4971-a357-a0be03c520ca', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Susannah Sans', - email: 'ssansp@linkedin.com', - language: 'Malayalam', - status: 'disabled', - lastLoginDate: '1/13/2022', - lastLockoutDate: '6/20/2022', - lastPasswordChangeDate: '11/2/2021', - updateDate: '7/8/2022', - createDate: '5/7/2022', - failedLoginAttempts: 662, - userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', '2668f09b-320c-48a7-a78a-95047026ec0e'], - }, - { - id: '2dae8bf8-5fdd-4efa-a493-cbec11b179e2', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Richardo Redhole', - email: 'rredholeq@reference.com', - language: 'Pashto', - status: 'inactive', - lastLoginDate: '2/7/2022', - lastLockoutDate: '7/22/2022', - lastPasswordChangeDate: '6/10/2022', - updateDate: '2/5/2022', - createDate: '3/10/2022', - failedLoginAttempts: 933, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: '0397dd89-72c5-4d0b-a544-dc1c9c0a932d', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Patrizia Cicero', - email: 'pciceror@example.com', - language: 'Dari', - status: 'enabled', - lastLoginDate: '9/19/2022', - lastLockoutDate: '9/22/2022', - lastPasswordChangeDate: '7/29/2022', - updateDate: '2/26/2022', - createDate: '4/18/2022', - failedLoginAttempts: 750, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: '4f2f64c1-1b9b-4217-80c7-7760962215af', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Rupert Bradberry', - email: 'rbradberrys@wsj.com', - language: 'German', - status: 'enabled', - lastLoginDate: '11/18/2021', - lastLockoutDate: '12/13/2021', - lastPasswordChangeDate: '3/27/2022', - updateDate: '3/16/2022', - createDate: '7/21/2022', - failedLoginAttempts: 735, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: '6cefa1e1-4302-4003-81df-3fa4759245a4', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Clarabelle Colpus', - email: 'ccolpust@google.de', - language: 'Estonian', - status: 'invited', - lastLoginDate: '9/8/2022', - lastLockoutDate: '11/28/2021', - lastPasswordChangeDate: '12/8/2021', - updateDate: '10/20/2022', - createDate: '9/15/2022', - failedLoginAttempts: 602, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: '2ba9ae27-7860-42ea-b628-c5484b64b2c6', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Kathi Grahamslaw', - email: 'kgrahamslawu@wikispaces.com', - language: 'Bosnian', - status: 'disabled', - lastLoginDate: '9/29/2022', - lastLockoutDate: '6/24/2022', - lastPasswordChangeDate: '11/5/2021', - updateDate: '8/7/2022', - createDate: '7/5/2022', - failedLoginAttempts: 867, - userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', 'b847398a-6875-4d7a-9f6d-231256b81471'], - }, - { - id: 'f4bee7c8-7a94-4937-8e6e-ceb55c9ec8b4', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Athena Vick', - email: 'avickv@netlog.com', - language: 'Kashmiri', - status: 'disabled', - lastLoginDate: '3/24/2022', - lastLockoutDate: '2/1/2022', - lastPasswordChangeDate: '12/10/2021', - updateDate: '9/15/2022', - createDate: '12/13/2021', - failedLoginAttempts: 269, - userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', 'b847398a-6875-4d7a-9f6d-231256b81471'], - }, - { - id: '3ccfeec3-1c96-4205-ae90-3297702d0d59', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Taddeusz Dysert', - email: 'tdysertw@creativecommons.org', - language: 'Māori', - status: 'invited', - lastLoginDate: '5/4/2022', - lastLockoutDate: '7/15/2022', - lastPasswordChangeDate: '5/24/2022', - updateDate: '8/21/2022', - createDate: '2/22/2022', - failedLoginAttempts: 426, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: 'cb0e3a46-1e99-4dc3-a206-462c3d985916', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Brook Leyden', - email: 'bleydenx@ameblo.jp', - language: 'Kashmiri', - status: 'inactive', - lastLoginDate: '5/31/2022', - lastLockoutDate: '12/2/2021', - lastPasswordChangeDate: '1/18/2022', - updateDate: '12/16/2021', - createDate: '8/11/2022', - failedLoginAttempts: 615, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: 'eb5af046-f2af-490f-a195-b0faff73f538', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Elisabet Meggison', - email: 'emeggisony@issuu.com', - language: 'Burmese', - status: 'inactive', - lastLoginDate: '4/13/2022', - lastLockoutDate: '6/12/2022', - lastPasswordChangeDate: '4/29/2022', - updateDate: '9/23/2022', - createDate: '1/7/2022', - failedLoginAttempts: 624, - userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2'], - }, - { - id: '42037971-4e06-41a8-be76-04313571fe54', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Rees Mordecai', - email: 'rmordecaiz@unblog.fr', - language: 'Chinese', - status: 'invited', - lastLoginDate: '9/8/2022', - lastLockoutDate: '8/11/2022', - lastPasswordChangeDate: '6/6/2022', - updateDate: '11/23/2021', - createDate: '12/14/2021', - failedLoginAttempts: 740, - userGroups: ['2668f09b-320c-48a7-a78a-95047026ec0e', '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2'], - }, - { - id: 'd71ba775-2920-42de-b5a1-09104e81cf27', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Pamela Sheering', - email: 'psheering10@joomla.org', - language: 'Gujarati', - status: 'inactive', - lastLoginDate: '4/2/2022', - lastLockoutDate: '9/1/2022', - lastPasswordChangeDate: '10/14/2022', - updateDate: '6/28/2022', - createDate: '11/9/2021', - failedLoginAttempts: 410, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: 'ed94e56b-64d5-43d0-9c9c-7149a0b26657', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Raychel Hazell', - email: 'rhazell11@soup.io', - language: 'Japanese', - status: 'inactive', - lastLoginDate: '2/4/2022', - lastLockoutDate: '2/19/2022', - lastPasswordChangeDate: '10/21/2022', - updateDate: '1/20/2022', - createDate: '9/6/2022', - failedLoginAttempts: 463, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: '8acfe50e-2e15-460d-b368-0510d08fea4c', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Martie Keasey', - email: 'mkeasey12@howstuffworks.com', - language: 'Kazakh', - status: 'enabled', - lastLoginDate: '4/1/2022', - lastLockoutDate: '2/10/2022', - lastPasswordChangeDate: '10/9/2022', - updateDate: '8/20/2022', - createDate: '5/18/2022', - failedLoginAttempts: 686, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: '73401c00-3b05-465b-ab59-8def5af4ec54', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Justus Szapiro', - email: 'jszapiro13@wp.com', - language: 'Persian', - status: 'inactive', - lastLoginDate: '5/5/2022', - lastLockoutDate: '1/20/2022', - lastPasswordChangeDate: '1/27/2022', - updateDate: '4/18/2022', - createDate: '1/30/2022', - failedLoginAttempts: 34, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: 'ffed1abb-aee0-45f1-9915-5ea7da165011', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Thea Blannin', - email: 'tblannin14@flavors.me', - language: 'Gujarati', - status: 'enabled', - lastLoginDate: '2/20/2022', - lastLockoutDate: '7/13/2022', - lastPasswordChangeDate: '10/19/2022', - updateDate: '9/4/2022', - createDate: '11/3/2021', - failedLoginAttempts: 3, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: '754fafb2-ec86-4313-8c5a-26a0a460df70', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Reinhold Moseby', - email: 'rmoseby15@mapquest.com', - language: 'Hungarian', - status: 'inactive', - lastLoginDate: '8/2/2022', - lastLockoutDate: '5/22/2022', - lastPasswordChangeDate: '5/25/2022', - updateDate: '8/15/2022', - createDate: '6/5/2022', - failedLoginAttempts: 197, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: 'eae3c035-1b9d-4d1d-b626-89a7c3b3bc39', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Prudi Waulker', - email: 'pwaulker16@who.int', - language: 'Swedish', - status: 'enabled', - lastLoginDate: '12/26/2021', - lastLockoutDate: '8/4/2022', - lastPasswordChangeDate: '12/7/2021', - updateDate: '12/14/2021', - createDate: '1/9/2022', - failedLoginAttempts: 264, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: '4bbf5669-99ec-4e60-b159-2198990ee8f1', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Kile Espinoy', - email: 'kespinoy17@cdc.gov', - language: 'Bosnian', - status: 'enabled', - lastLoginDate: '6/18/2022', - lastLockoutDate: '9/8/2022', - lastPasswordChangeDate: '5/11/2022', - updateDate: '7/12/2022', - createDate: '6/17/2022', - failedLoginAttempts: 367, - userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], - }, - { - id: 'bc17c986-9869-49f4-baee-d888bf013f27', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Tadeas Fitzer', - email: 'tfitzer18@merriam-webster.com', - language: 'German', - status: 'inactive', - lastLoginDate: '12/11/2021', - lastLockoutDate: '7/11/2022', - lastPasswordChangeDate: '9/22/2022', - updateDate: '5/21/2022', - createDate: '9/27/2022', - failedLoginAttempts: 988, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: 'f015b8a7-35b7-4859-a506-253ee95f92f4', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Murielle Roskams', - email: 'mroskams19@simplemachines.org', - language: 'Azeri', - status: 'inactive', - lastLoginDate: '11/13/2021', - lastLockoutDate: '4/8/2022', - lastPasswordChangeDate: '1/6/2022', - updateDate: '9/1/2022', - createDate: '7/25/2022', - failedLoginAttempts: 113, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: 'b5fd8d4f-eecc-4bea-b841-b4ba3621e8ba', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Clarice Mation', - email: 'cmation1a@geocities.jp', - language: 'Icelandic', - status: 'invited', - lastLoginDate: '6/26/2022', - lastLockoutDate: '11/1/2022', - lastPasswordChangeDate: '7/27/2022', - updateDate: '11/17/2021', - createDate: '7/22/2022', - failedLoginAttempts: 543, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: '0bfe956a-5293-48bf-8c43-fd9be5c8dd19', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Sarajane Mc Caghan', - email: 'smc1b@amazon.com', - language: 'Telugu', - status: 'enabled', - lastLoginDate: '3/6/2022', - lastLockoutDate: '11/11/2021', - lastPasswordChangeDate: '5/13/2022', - updateDate: '3/1/2022', - createDate: '5/9/2022', - failedLoginAttempts: 343, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: 'f2914aaa-de0a-4285-b820-88d22ae7a566', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Aldis Instone', - email: 'ainstone1c@topsy.com', - language: 'Macedonian', - status: 'invited', - lastLoginDate: '1/7/2022', - lastLockoutDate: '9/27/2022', - lastPasswordChangeDate: '6/16/2022', - updateDate: '8/21/2022', - createDate: '9/12/2022', - failedLoginAttempts: 345, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: 'f5489ee0-589d-47e5-8c11-b5e2ef027519', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Riley Pfeffle', - email: 'rpfeffle1d@toplist.cz', - language: 'Quechua', - status: 'enabled', - lastLoginDate: '6/27/2022', - lastLockoutDate: '9/23/2022', - lastPasswordChangeDate: '12/22/2021', - updateDate: '8/22/2022', - createDate: '1/2/2022', - failedLoginAttempts: 838, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: '293074af-8188-4151-b025-2b43f6aa6c2c', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Beverly Andreone', - email: 'bandreone1e@pbs.org', - language: 'Bosnian', - status: 'disabled', - lastLoginDate: '2/13/2022', - lastLockoutDate: '7/6/2022', - lastPasswordChangeDate: '4/4/2022', - updateDate: '6/15/2022', - createDate: '4/16/2022', - failedLoginAttempts: 459, - userGroups: ['2668f09b-320c-48a7-a78a-95047026ec0e', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], - }, - { - id: '93765192-b40f-4bf2-8c06-1d5ffb6989ae', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Katheryn Deedes', - email: 'kdeedes1f@theglobeandmail.com', - language: 'Romanian', - status: 'disabled', - lastLoginDate: '4/21/2022', - lastLockoutDate: '9/1/2022', - lastPasswordChangeDate: '1/18/2022', - updateDate: '2/19/2022', - createDate: '2/16/2022', - failedLoginAttempts: 62, - userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', 'b847398a-6875-4d7a-9f6d-231256b81471'], - }, - { - id: '59f1023c-7ce6-4c78-a1ee-dcb4625b9281', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Carma Soares', - email: 'csoares1g@de.vu', - language: 'Irish Gaelic', - status: 'enabled', - lastLoginDate: '5/28/2022', - lastLockoutDate: '8/14/2022', - lastPasswordChangeDate: '12/13/2021', - updateDate: '11/9/2021', - createDate: '9/5/2022', - failedLoginAttempts: 445, - userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2'], - }, - { - id: '42592a81-f584-4b77-b312-b8e268203c22', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Merwin Forbear', - email: 'mforbear1h@jalbum.net', - language: 'Japanese', - status: 'disabled', - lastLoginDate: '2/23/2022', - lastLockoutDate: '11/17/2021', - lastPasswordChangeDate: '4/1/2022', - updateDate: '12/6/2021', - createDate: '4/24/2022', - failedLoginAttempts: 30, - userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', '2668f09b-320c-48a7-a78a-95047026ec0e'], - }, - { - id: '8ad78a84-8183-4833-9f8b-07b3ea8a881c', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Laurene Kimberly', - email: 'lkimberly1i@prnewswire.com', - language: 'Hungarian', - status: 'inactive', - lastLoginDate: '9/19/2022', - lastLockoutDate: '8/31/2022', - lastPasswordChangeDate: '7/15/2022', - updateDate: '8/19/2022', - createDate: '4/26/2022', - failedLoginAttempts: 988, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: '3f7bc8b5-df8b-4a79-a8bf-f379c63b8d01', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Marketa McGillreich', - email: 'mmcgillreich1j@alexa.com', - language: 'Quechua', - status: 'invited', - lastLoginDate: '2/19/2022', - lastLockoutDate: '9/5/2022', - lastPasswordChangeDate: '2/22/2022', - updateDate: '11/27/2021', - createDate: '6/1/2022', - failedLoginAttempts: 722, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: '09901602-688a-4c83-a977-51c16950a2c1', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Katha Caddell', - email: 'kcaddell1k@domainmarket.com', - language: 'Filipino', - status: 'enabled', - lastLoginDate: '4/3/2022', - lastLockoutDate: '5/5/2022', - lastPasswordChangeDate: '2/20/2022', - updateDate: '10/30/2022', - createDate: '9/18/2022', - failedLoginAttempts: 65, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: '060972c7-9b23-4788-8dc3-c2fcec1d002e', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Alonzo Gallatly', - email: 'agallatly1l@posterous.com', - language: 'Polish', - status: 'enabled', - lastLoginDate: '5/4/2022', - lastLockoutDate: '11/13/2021', - lastPasswordChangeDate: '7/28/2022', - updateDate: '11/9/2021', - createDate: '7/13/2022', - failedLoginAttempts: 326, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: 'ccf7639c-09d9-4de6-88ec-be51be7f9d69', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Sabine Chimenti', - email: 'schimenti1m@ow.ly', - language: 'Spanish', - status: 'enabled', - lastLoginDate: '12/25/2021', - lastLockoutDate: '8/26/2022', - lastPasswordChangeDate: '9/6/2022', - updateDate: '9/9/2022', - createDate: '5/16/2022', - failedLoginAttempts: 468, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: '2c6b24a4-c0d2-4efe-8a09-68b61d2a17ef', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Stephanie Schanke', - email: 'sschanke1n@epa.gov', - language: 'Indonesian', - status: 'disabled', - lastLoginDate: '2/13/2022', - lastLockoutDate: '2/27/2022', - lastPasswordChangeDate: '7/14/2022', - updateDate: '4/14/2022', - createDate: '5/19/2022', - failedLoginAttempts: 177, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: 'ff7a2003-f8d7-4fbc-96cb-ee221bdc01c9', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Lonee Andrusov', - email: 'landrusov1o@pagesperso-orange.fr', - language: 'Haitian Creole', - status: 'inactive', - lastLoginDate: '11/2/2021', - lastLockoutDate: '6/8/2022', - lastPasswordChangeDate: '9/25/2022', - updateDate: '12/14/2021', - createDate: '4/1/2022', - failedLoginAttempts: 485, - userGroups: ['2668f09b-320c-48a7-a78a-95047026ec0e', 'b847398a-6875-4d7a-9f6d-231256b81471'], - }, - { - id: 'b7f7b275-f62d-44ba-a6b0-0e7e83fe4e49', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Darin Rahlof', - email: 'drahlof1p@diigo.com', - language: 'Luxembourgish', - status: 'invited', - lastLoginDate: '5/3/2022', - lastLockoutDate: '5/12/2022', - lastPasswordChangeDate: '1/2/2022', - updateDate: '3/4/2022', - createDate: '5/24/2022', - failedLoginAttempts: 254, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: '18a9a6bc-ae4c-49b0-8afd-43bc214053f4', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Biddy Mellmoth', - email: 'bmellmoth1q@youtu.be', - language: 'Kashmiri', - status: 'disabled', - lastLoginDate: '1/21/2022', - lastLockoutDate: '8/18/2022', - lastPasswordChangeDate: '3/10/2022', - updateDate: '1/18/2022', - createDate: '12/3/2021', - failedLoginAttempts: 892, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: '14fa1c36-1252-433e-a1ad-63cf5c9aba62', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Carissa Wallsam', - email: 'cwallsam1r@t.co', - language: 'Maltese', - status: 'invited', - lastLoginDate: '12/20/2021', - lastLockoutDate: '8/24/2022', - lastPasswordChangeDate: '4/25/2022', - updateDate: '5/2/2022', - createDate: '5/22/2022', - failedLoginAttempts: 474, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: '7cb9327f-6aeb-47af-80b3-4b85abde1f5f', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Jandy Gilffilland', - email: 'jgilffilland1s@usda.gov', - language: 'Telugu', - status: 'invited', - lastLoginDate: '3/7/2022', - lastLockoutDate: '6/30/2022', - lastPasswordChangeDate: '8/30/2022', - updateDate: '6/2/2022', - createDate: '3/14/2022', - failedLoginAttempts: 991, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: '0574e903-ba72-49ee-b838-4eb200e68612', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Cyndy Ragbourne', - email: 'cragbourne1t@clickbank.net', - language: 'Punjabi', - status: 'inactive', - lastLoginDate: '7/7/2022', - lastLockoutDate: '8/20/2022', - lastPasswordChangeDate: '10/23/2022', - updateDate: '2/22/2022', - createDate: '12/2/2021', - failedLoginAttempts: 78, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: '6e4515d6-4a67-4f47-8783-1d074c1d1f75', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Isidro Dysart', - email: 'idysart1u@reverbnation.com', - language: 'Ndebele', - status: 'disabled', - lastLoginDate: '8/10/2022', - lastLockoutDate: '11/23/2021', - lastPasswordChangeDate: '8/13/2022', - updateDate: '11/9/2021', - createDate: '10/18/2022', - failedLoginAttempts: 260, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: '4faa2064-6776-4cc0-8bc1-3ceaa5884a0f', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Aldin Milmore', - email: 'amilmore1v@soundcloud.com', - language: 'Swahili', - status: 'enabled', - lastLoginDate: '6/22/2022', - lastLockoutDate: '2/14/2022', - lastPasswordChangeDate: '5/16/2022', - updateDate: '4/21/2022', - createDate: '9/25/2022', - failedLoginAttempts: 722, - userGroups: ['b847398a-6875-4d7a-9f6d-231256b81471', '2668f09b-320c-48a7-a78a-95047026ec0e'], - }, - { - id: '0cccec0d-d7c4-47bc-97b0-bd55dca42dd7', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Alex Schanke', - email: 'aschanke1w@friendfeed.com', - language: 'Latvian', - status: 'invited', - lastLoginDate: '10/26/2022', - lastLockoutDate: '1/22/2022', - lastPasswordChangeDate: '7/29/2022', - updateDate: '2/12/2022', - createDate: '4/2/2022', - failedLoginAttempts: 309, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: 'd6ffe266-f024-45c2-a1cd-f39bdbc00a5b', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Aundrea Vassie', - email: 'avassie1x@dagondesign.com', - language: 'Armenian', - status: 'disabled', - lastLoginDate: '10/9/2022', - lastLockoutDate: '10/3/2022', - lastPasswordChangeDate: '10/5/2022', - updateDate: '1/10/2022', - createDate: '4/17/2022', - failedLoginAttempts: 552, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: '72d3047a-8c48-4425-ad11-a4a64281e7e5', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Minna Kitley', - email: 'mkitley1y@dmoz.org', - language: 'Kannada', - status: 'inactive', - lastLoginDate: '7/26/2022', - lastLockoutDate: '4/7/2022', - lastPasswordChangeDate: '7/5/2022', - updateDate: '9/24/2022', - createDate: '6/10/2022', - failedLoginAttempts: 37, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: 'ebfe0335-6926-433d-90de-82f9661955f9', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Jada Josskowitz', - email: 'jjosskowitz1z@com.com', - language: 'Hungarian', - status: 'enabled', - lastLoginDate: '2/16/2022', - lastLockoutDate: '12/29/2021', - lastPasswordChangeDate: '12/29/2021', - updateDate: '5/31/2022', - createDate: '7/29/2022', - failedLoginAttempts: 927, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: 'e6e833fb-a872-4364-893c-b6bfc9802043', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Gail Blaxall', - email: 'gblaxall20@arizona.edu', - language: 'Malagasy', - status: 'disabled', - lastLoginDate: '1/15/2022', - lastLockoutDate: '7/28/2022', - lastPasswordChangeDate: '1/4/2022', - updateDate: '3/23/2022', - createDate: '12/25/2021', - failedLoginAttempts: 508, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: 'abd4d295-9ebb-4a0d-bc07-e2a662671e18', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Alethea Feldmann', - email: 'afeldmann21@nba.com', - language: 'Hebrew', - status: 'disabled', - lastLoginDate: '2/15/2022', - lastLockoutDate: '5/12/2022', - lastPasswordChangeDate: '10/28/2022', - updateDate: '5/11/2022', - createDate: '7/16/2022', - failedLoginAttempts: 527, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: '29d42fe1-b465-4dfe-8d29-10286474d625', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Donna Woodley', - email: 'dwoodley22@tuttocitta.it', - language: 'Thai', - status: 'invited', - lastLoginDate: '8/1/2022', - lastLockoutDate: '4/15/2022', - lastPasswordChangeDate: '7/30/2022', - updateDate: '12/19/2021', - createDate: '4/29/2022', - failedLoginAttempts: 61, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: '690535f5-194a-4e32-b569-608fbf279059', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Feodora Blazic', - email: 'fblazic23@abc.net.au', - language: 'Kyrgyz', - status: 'enabled', - lastLoginDate: '2/18/2022', - lastLockoutDate: '11/25/2021', - lastPasswordChangeDate: '9/22/2022', - updateDate: '6/7/2022', - createDate: '8/31/2022', - failedLoginAttempts: 368, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'b847398a-6875-4d7a-9f6d-231256b81471', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: '13b5e542-e779-48df-b7f9-2c7def0e2e55', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Barris Dougary', - email: 'bdougary24@multiply.com', - language: 'Lithuanian', - status: 'disabled', - lastLoginDate: '3/1/2022', - lastLockoutDate: '10/1/2022', - lastPasswordChangeDate: '10/5/2022', - updateDate: '7/1/2022', - createDate: '5/25/2022', - failedLoginAttempts: 982, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: 'af5bfaaf-1597-4ad1-aa1e-206f78a91674', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Bennie Gillbanks', - email: 'bgillbanks25@aboutads.info', - language: 'Swedish', - status: 'inactive', - lastLoginDate: '8/3/2022', - lastLockoutDate: '3/18/2022', - lastPasswordChangeDate: '4/29/2022', - updateDate: '1/4/2022', - createDate: '1/12/2022', - failedLoginAttempts: 868, - userGroups: ['397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], - }, - { - id: '8f39464a-2e49-498b-b8b8-cf2926978e83', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Micaela Davidge', - email: 'mdavidge26@fema.gov', - language: 'Dhivehi', - status: 'inactive', - lastLoginDate: '8/6/2022', - lastLockoutDate: '1/15/2022', - lastPasswordChangeDate: '7/14/2022', - updateDate: '5/21/2022', - createDate: '3/28/2022', - failedLoginAttempts: 931, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: 'ac4785f1-b6f5-4d2d-99e6-f62a96947f8c', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Cassius Vannet', - email: 'cvannet27@wufoo.com', - language: 'Icelandic', - status: 'inactive', - lastLoginDate: '2/22/2022', - lastLockoutDate: '9/28/2022', - lastPasswordChangeDate: '5/24/2022', - updateDate: '7/26/2022', - createDate: '1/30/2022', - failedLoginAttempts: 739, - userGroups: ['2668f09b-320c-48a7-a78a-95047026ec0e', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], - }, - { - id: 'd89ada67-eca1-475a-9273-0c69b56116da', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Rozanne Wren', - email: 'rwren28@flavors.me', - language: 'Filipino', - status: 'disabled', - lastLoginDate: '5/6/2022', - lastLockoutDate: '5/17/2022', - lastPasswordChangeDate: '11/12/2021', - updateDate: '4/9/2022', - createDate: '6/16/2022', - failedLoginAttempts: 682, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: '03ced59c-40b3-482a-8470-b12f56974a0f', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Matthiew McClinton', - email: 'mmcclinton29@diigo.com', - language: 'Croatian', - status: 'invited', - lastLoginDate: '11/14/2021', - lastLockoutDate: '1/11/2022', - lastPasswordChangeDate: '6/19/2022', - updateDate: '7/4/2022', - createDate: '9/21/2022', - failedLoginAttempts: 975, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: 'dcfba56e-5f3c-446b-a4ef-18da66df8181', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Jorry McTear', - email: 'jmctear2a@nytimes.com', - language: 'German', - status: 'inactive', - lastLoginDate: '1/10/2022', - lastLockoutDate: '4/17/2022', - lastPasswordChangeDate: '9/28/2022', - updateDate: '1/21/2022', - createDate: '6/30/2022', - failedLoginAttempts: 357, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: '63be3c07-9178-4c2e-810a-6bbdbbe16dcb', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Beale Filipychev', - email: 'bfilipychev2b@free.fr', - language: 'Tetum', - status: 'disabled', - lastLoginDate: '10/25/2022', - lastLockoutDate: '1/5/2022', - lastPasswordChangeDate: '6/4/2022', - updateDate: '7/17/2022', - createDate: '8/22/2022', - failedLoginAttempts: 482, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: 'c57661ef-8f66-4502-91cb-2069a186ce79', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Gabriel Gun', - email: 'ggun2c@nature.com', - language: 'Albanian', - status: 'inactive', - lastLoginDate: '10/5/2022', - lastLockoutDate: '3/27/2022', - lastPasswordChangeDate: '5/21/2022', - updateDate: '10/17/2022', - createDate: '12/14/2021', - failedLoginAttempts: 958, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: 'b5fbd289-2900-4328-8d1f-0a6780be3585', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Horten Wenban', - email: 'hwenban2d@sciencedirect.com', - language: 'Italian', - status: 'disabled', - lastLoginDate: '2/25/2022', - lastLockoutDate: '7/6/2022', - lastPasswordChangeDate: '10/30/2022', - updateDate: '7/31/2022', - createDate: '12/16/2021', - failedLoginAttempts: 698, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: '9ca26535-5288-4b37-8e3b-96b3530de3d1', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Englebert Littrick', - email: 'elittrick2e@t.co', - language: 'Bulgarian', - status: 'enabled', - lastLoginDate: '6/5/2022', - lastLockoutDate: '9/16/2022', - lastPasswordChangeDate: '7/22/2022', - updateDate: '12/2/2021', - createDate: '9/16/2022', - failedLoginAttempts: 340, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: '19998fc5-2902-4646-9cf2-395404da2b2a', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Maxy Toffel', - email: 'mtoffel2f@fda.gov', - language: 'Tswana', - status: 'inactive', - lastLoginDate: '7/1/2022', - lastLockoutDate: '2/15/2022', - lastPasswordChangeDate: '9/9/2022', - updateDate: '8/28/2022', - createDate: '2/5/2022', - failedLoginAttempts: 264, - userGroups: [ - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'b847398a-6875-4d7a-9f6d-231256b81471', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: '468a904c-f87c-4079-920b-74c6aa3a5242', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Thomasina Concannon', - email: 'tconcannon2g@cloudflare.com', - language: 'Tajik', - status: 'inactive', - lastLoginDate: '11/2/2021', - lastLockoutDate: '3/27/2022', - lastPasswordChangeDate: '12/17/2021', - updateDate: '4/30/2022', - createDate: '10/28/2022', - failedLoginAttempts: 985, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: '60336828-85ed-4b5a-abf6-869d6902ad93', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Jany Manginot', - email: 'jmanginot2h@chron.com', - language: 'Quechua', - status: 'disabled', - lastLoginDate: '6/6/2022', - lastLockoutDate: '2/2/2022', - lastPasswordChangeDate: '2/7/2022', - updateDate: '10/5/2022', - createDate: '4/18/2022', - failedLoginAttempts: 307, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - 'b847398a-6875-4d7a-9f6d-231256b81471', - ], - }, - { - id: '2b0c8ffe-4bcb-4df6-b519-3358a5c90480', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Agace Daughtrey', - email: 'adaughtrey2i@nifty.com', - language: 'Moldovan', - status: 'inactive', - lastLoginDate: '9/14/2022', - lastLockoutDate: '1/9/2022', - lastPasswordChangeDate: '8/25/2022', - updateDate: '12/29/2021', - createDate: '6/26/2022', - failedLoginAttempts: 599, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - ], - }, - { - id: 'c967ff49-f967-449b-9aab-e5ca72255a61', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Debor Maillard', - email: 'dmaillard2j@jigsy.com', - language: 'Norwegian', - status: 'enabled', - lastLoginDate: '10/21/2022', - lastLockoutDate: '8/19/2022', - lastPasswordChangeDate: '2/14/2022', - updateDate: '5/11/2022', - createDate: '12/18/2021', - failedLoginAttempts: 294, - userGroups: [ - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - 'b847398a-6875-4d7a-9f6d-231256b81471', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: '594040ce-c6f7-49e7-8f4a-ffa8c42a2102', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Lurette Armiger', - email: 'larmiger2k@google.pl', - language: 'Greek', - status: 'enabled', - lastLoginDate: '7/13/2022', - lastLockoutDate: '2/28/2022', - lastPasswordChangeDate: '11/7/2021', - updateDate: '6/4/2022', - createDate: '7/19/2022', - failedLoginAttempts: 881, - userGroups: ['b847398a-6875-4d7a-9f6d-231256b81471', '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949'], - }, - { - id: '33806fc1-d4a9-4ddb-8d57-3c087ea1f489', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Melvin Colby', - email: 'mcolby2l@abc.net.au', - language: 'French', - status: 'invited', - lastLoginDate: '11/18/2021', - lastLockoutDate: '11/28/2021', - lastPasswordChangeDate: '10/21/2022', - updateDate: '5/1/2022', - createDate: '5/2/2022', - failedLoginAttempts: 903, - userGroups: [ - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: 'a59a5259-9393-4c49-a5be-56a475b27640', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Junia Hordle', - email: 'jhordle2m@opera.com', - language: 'Albanian', - status: 'enabled', - lastLoginDate: '7/11/2022', - lastLockoutDate: '5/6/2022', - lastPasswordChangeDate: '1/21/2022', - updateDate: '3/7/2022', - createDate: '1/30/2022', - failedLoginAttempts: 482, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - '2668f09b-320c-48a7-a78a-95047026ec0e', - ], - }, - { - id: '9e96841c-131d-420a-bdc8-4ba087f0f11c', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Daveen Seccombe', - email: 'dseccombe2n@blogtalkradio.com', - language: 'Estonian', - status: 'disabled', - lastLoginDate: '1/29/2022', - lastLockoutDate: '11/4/2021', - lastPasswordChangeDate: '2/13/2022', - updateDate: '8/15/2022', - createDate: '8/26/2022', - failedLoginAttempts: 538, - userGroups: [ - 'b847398a-6875-4d7a-9f6d-231256b81471', - '2668f09b-320c-48a7-a78a-95047026ec0e', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - ], - }, - { - id: '84eaae2a-9aa8-4745-b4c3-fad2f5632e85', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Adolphus MacCombe', - email: 'amaccombe2o@xing.com', - language: 'Japanese', - status: 'inactive', - lastLoginDate: '4/5/2022', - lastLockoutDate: '11/14/2021', - lastPasswordChangeDate: '8/10/2022', - updateDate: '3/11/2022', - createDate: '2/27/2022', - failedLoginAttempts: 314, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', - 'b847398a-6875-4d7a-9f6d-231256b81471', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], - }, - { - id: '6fe86358-f3fd-4f7d-8d28-e867562569f2', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Abagael Rivard', - email: 'arivard2p@cnbc.com', - language: 'Somali', - status: 'disabled', - lastLoginDate: '9/12/2022', - lastLockoutDate: '11/28/2021', - lastPasswordChangeDate: '4/3/2022', - updateDate: '8/21/2022', - createDate: '7/31/2022', - failedLoginAttempts: 58, - userGroups: ['c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', 'b847398a-6875-4d7a-9f6d-231256b81471'], - }, - { - id: '365fd725-81c7-48f0-be68-4dbcf15f1ca9', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Angeli Landre', - email: 'alandre2q@telegraph.co.uk', - language: 'Persian', - status: 'disabled', - lastLoginDate: '10/22/2022', - lastLockoutDate: '7/14/2022', - lastPasswordChangeDate: '3/13/2022', - updateDate: '8/15/2022', - createDate: '3/14/2022', - failedLoginAttempts: 788, - userGroups: ['2668f09b-320c-48a7-a78a-95047026ec0e', 'b847398a-6875-4d7a-9f6d-231256b81471'], - }, - { - id: 'b6028623-995e-4eee-8142-723141030692', - type: 'user', - hasChildren: false, - parentId: '', - contentStartNodes: [], - mediaStartNodes: [], - icon: 'umb:user', - name: 'Brett Dommett', - email: 'bdommett2r@wordpress.org', - language: 'Fijian', - status: 'inactive', - lastLoginDate: '8/31/2022', - lastLockoutDate: '10/7/2022', - lastPasswordChangeDate: '2/16/2022', - updateDate: '12/26/2021', - createDate: '2/21/2022', - failedLoginAttempts: 265, - userGroups: [ - '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', - '2668f09b-320c-48a7-a78a-95047026ec0e', - 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', - ], + id: '82e11d3d-b91d-43c9-9071-34d28e62e81d', + type: 'user', + $type: 'UserResponseModel', + contentStartNodeIds: [], + mediaStartNodeIds: [], + name: 'Amelie Walker', + email: 'awalker1@domain.com', + languageIsoCode: 'Japanese', + state: UserStateModel.INACTIVE, + lastLoginDate: '4/12/2023', + lastlockoutDate: '', + lastPasswordChangeDate: '4/1/2023', + updateDate: '4/12/2023', + createDate: '4/12/2023', + failedLoginAttempts: 0, + }, + { + id: 'aa1d83a9-bc7f-47d2-b288-58d8a31f5017', + type: 'user', + $type: 'UserResponseModel', + contentStartNodeIds: [], + mediaStartNodeIds: [], + name: 'Oliver Kim', + email: 'okim1@domain.com', + languageIsoCode: 'Russian', + state: UserStateModel.ACTIVE, + lastLoginDate: '4/11/2023', + lastlockoutDate: '', + lastPasswordChangeDate: '4/5/2023', + updateDate: '4/11/2023', + createDate: '4/11/2023', + failedLoginAttempts: 0, + }, + { + id: 'ff2f4a50-d3d4-4bc4-869d-c7948c160e54', + type: 'user', + $type: 'UserResponseModel', + contentStartNodeIds: [], + mediaStartNodeIds: [], + name: 'Eliana Nieves', + email: 'enieves1@domain.com', + languageIsoCode: 'Spanish', + state: UserStateModel.INVITED, + lastLoginDate: '4/10/2023', + lastlockoutDate: '', + lastPasswordChangeDate: '4/6/2023', + updateDate: '4/10/2023', + createDate: '4/10/2023', + failedLoginAttempts: 0, + }, + { + id: 'c290c6d9-9f12-4838-8567-621b52a178de', + type: 'user', + $type: 'UserResponseModel', + contentStartNodeIds: [], + mediaStartNodeIds: [], + name: 'Jasmine Patel', + email: 'jpatel1@domain.com', + languageIsoCode: 'Hindi', + state: UserStateModel.DISABLED, + lastLoginDate: '4/9/2023', + lastlockoutDate: '', + lastPasswordChangeDate: '4/7/2023', + updateDate: '4/9/2023', + createDate: '4/9/2023', + failedLoginAttempts: 0, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/manifests.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/manifests.handlers.ts index 62d186c1c1..543329b7b5 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/manifests.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/manifests.handlers.ts @@ -58,7 +58,7 @@ export const manifestDevelopmentHandler = rest.get(umbracoPath('/package/manifes name: 'My Custom Package View', js: '/App_Plugins/package-view.js', meta: { - packageName: 'my.package', + packageName: 'Package with a view', }, }, ], diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/package.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/package.handlers.ts index 840dbc0371..554ddcf189 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/package.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/package.handlers.ts @@ -1,5 +1,5 @@ import { rest } from 'msw'; -import { v4 as uuidv4 } from 'uuid'; +import { UmbId } from '@umbraco-cms/backoffice/id'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; import { @@ -54,7 +54,7 @@ export const handlers = [ rest.post(umbracoPath('/package/created'), async (_req, res, ctx) => { //save const data: PackageMigrationStatusResponseModel = await _req.json(); - const newPackage: PackageDefinitionResponseModel = { ...data, id: uuidv4() }; + const newPackage: PackageDefinitionResponseModel = { ...data, id: UmbId.new() }; packageArray.push(newPackage); return res(ctx.status(200), ctx.json(newPackage)); }), diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts index e56784f793..6bc524c5f7 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts @@ -1,111 +1,115 @@ import { rest } from 'msw'; -import { v4 as uuidv4 } from 'uuid'; + import { umbUsersData } from '../data/users.data'; -import type { UserDetails } from '@umbraco-cms/backoffice/models'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +const slug = '/users'; -// TODO: add schema export const handlers = [ - rest.get('/umbraco/backoffice/users/list/items', (req, res, ctx) => { - const items = umbUsersData.getAll(); - - const response = { - total: items.length, - items, - }; + rest.get(umbracoPath(`${slug}`), (req, res, ctx) => { + const response = umbUsersData.getAll(); return res(ctx.status(200), ctx.json(response)); }), - rest.get('/umbraco/backoffice/users/details/:id', (req, res, ctx) => { + rest.get(umbracoPath(`${slug}/:id`), (req, res, ctx) => { const id = req.params.id as string; if (!id) return; - const user = umbUsersData.getById(id); return res(ctx.status(200), ctx.json(user)); }), - rest.get('/umbraco/backoffice/users/getByKeys', (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); - if (ids.length === 0) return; - const users = umbUsersData.getByIds(ids); - - return res(ctx.status(200), ctx.json(users)); - }), - - rest.post('/umbraco/backoffice/users/save', async (req, res, ctx) => { + rest.put(umbracoPath(`${slug}/:id`), async (req, res, ctx) => { const data = await req.json(); if (!data) return; const saved = umbUsersData.save(data); - console.log('saved', saved); - return res(ctx.status(200), ctx.json(saved)); }), - rest.post('/umbraco/backoffice/users/invite', async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; + // rest.get('/umbraco/backoffice/users/getByKeys', (req, res, ctx) => { + // const ids = req.url.searchParams.getAll('id'); + // if (ids.length === 0) return; + // const users = umbUsersData.getByIds(ids); - const newUser: UserDetails = { - id: uuidv4(), - name: data.name, - email: data.email, - status: 'invited', - language: 'en', - updateDate: new Date().toISOString(), - createDate: new Date().toISOString(), - failedLoginAttempts: 0, - parentId: '', - hasChildren: false, - type: 'user', - icon: 'umb:icon-user', - userGroups: data.userGroups, - contentStartNodes: [], - mediaStartNodes: [], - }; + // return res(ctx.status(200), ctx.json(users)); + // }), - const invited = umbUsersData.save(newUser); + // rest.post('/umbraco/backoffice/users/save', async (req, res, ctx) => { + // const data = await req.json(); + // if (!data) return; - console.log('invited', invited); + // const saved = umbUsersData.save(data); - return res(ctx.status(200), ctx.json(invited)); - }), + // console.log('saved', saved); - rest.post>('/umbraco/backoffice/users/enable', async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; + // return res(ctx.status(200), ctx.json(saved)); + // }), - const enabledKeys = umbUsersData.enable(data); + // rest.post('/umbraco/backoffice/users/invite', async (req, res, ctx) => { + // const data = await req.json(); + // if (!data) return; - return res(ctx.status(200), ctx.json(enabledKeys)); - }), + // const newUser: UserDetails = { + // id: uuidv4(), + // name: data.name, + // email: data.email, + // status: 'invited', + // language: 'en', + // updateDate: new Date().toISOString(), + // createDate: new Date().toISOString(), + // failedLoginAttempts: 0, + // parentId: '', + // hasChildren: false, + // type: 'user', + // icon: 'umb:icon-user', + // userGroups: data.userGroups, + // contentStartNodes: [], + // mediaStartNodes: [], + // }; - rest.post>('/umbraco/backoffice/users/disable', async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; + // const invited = umbUsersData.save(newUser); - const enabledKeys = umbUsersData.disable(data); + // console.log('invited', invited); - return res(ctx.status(200), ctx.json(enabledKeys)); - }), + // return res(ctx.status(200), ctx.json(invited)); + // }), - rest.post>('/umbraco/backoffice/users/updateUserGroup', async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; + // rest.post>('/umbraco/backoffice/users/enable', async (req, res, ctx) => { + // const data = await req.json(); + // if (!data) return; - const userKeys = umbUsersData.updateUserGroup(data.userKeys, data.userGroupKey); + // const enabledKeys = umbUsersData.enable(data); - return res(ctx.status(200), ctx.json(userKeys)); - }), + // return res(ctx.status(200), ctx.json(enabledKeys)); + // }), - rest.post>('/umbraco/backoffice/users/delete', async (req, res, ctx) => { - const data = await req.json(); - if (!data) return; + // rest.post>('/umbraco/backoffice/users/disable', async (req, res, ctx) => { + // const data = await req.json(); + // if (!data) return; - const deletedKeys = umbUsersData.delete(data); + // const enabledKeys = umbUsersData.disable(data); - return res(ctx.status(200), ctx.json(deletedKeys)); - }), + // return res(ctx.status(200), ctx.json(enabledKeys)); + // }), + + // rest.post>('/umbraco/backoffice/users/updateUserGroup', async (req, res, ctx) => { + // const data = await req.json(); + // if (!data) return; + + // const userKeys = umbUsersData.updateUserGroup(data.userKeys, data.userGroupKey); + + // return res(ctx.status(200), ctx.json(userKeys)); + // }), + + // rest.post>('/umbraco/backoffice/users/delete', async (req, res, ctx) => { + // const data = await req.json(); + // if (!data) return; + + // const deletedKeys = umbUsersData.delete(data); + + // return res(ctx.status(200), ctx.json(deletedKeys)); + // }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/core/modal/modal-element-picker-base.ts b/src/Umbraco.Web.UI.Client/src/core/modal/modal-element-picker-base.ts index 6cee4e6443..1cb4cacec2 100644 --- a/src/Umbraco.Web.UI.Client/src/core/modal/modal-element-picker-base.ts +++ b/src/Umbraco.Web.UI.Client/src/core/modal/modal-element-picker-base.ts @@ -4,7 +4,7 @@ import { UmbPickerModalData, UmbPickerModalResult } from '@umbraco-cms/backoffic // TODO: we should consider moving this into a class/context instead of an element. // So we don't have to extend an element to get basic picker/selection logic -export class UmbModalElementPickerBase extends UmbModalBaseElement, UmbPickerModalResult> { +export class UmbModalElementPickerBase extends UmbModalBaseElement, UmbPickerModalResult> { @property() selection: Array = []; diff --git a/src/Umbraco.Web.UI.Client/src/core/modal/modal-element.element.ts b/src/Umbraco.Web.UI.Client/src/core/modal/modal-element.element.ts index 005bf6baac..b9052d6d56 100644 --- a/src/Umbraco.Web.UI.Client/src/core/modal/modal-element.element.ts +++ b/src/Umbraco.Web.UI.Client/src/core/modal/modal-element.element.ts @@ -1,18 +1,15 @@ -import { customElement, property } from 'lit/decorators.js'; +import { property } from 'lit/decorators.js'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbModalHandler } from '@umbraco-cms/backoffice/modal'; +import type { UmbModalExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; -@customElement('umb-modal-element') -export class UmbModalBaseElement extends UmbLitElement { +export abstract class UmbModalBaseElement + extends UmbLitElement + implements UmbModalExtensionElement +{ @property({ attribute: false }) modalHandler?: UmbModalHandler; @property({ type: Object, attribute: false }) data?: UmbModalData; } - -declare global { - interface HTMLElementTagNameMap { - 'umb-modal-element': UmbModalBaseElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/error/error.element.ts b/src/Umbraco.Web.UI.Client/src/error/error.element.ts new file mode 100644 index 0000000000..08f5cf6115 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/error/error.element.ts @@ -0,0 +1,140 @@ +import { css, html, nothing, unsafeCSS } from 'lit'; +import { customElement, property } from 'lit/decorators.js'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import type { ProblemDetailsModel } from '@umbraco-cms/backoffice/backend-api'; + +import logoImg from '/umbraco_logomark_white.svg'; +import backgroundImg from '/umbraco_background.jpg'; + +/** + * A full page error element that can be used either solo or for instance as the error 500 page and BootFailed + */ +@customElement('umb-error') +export class UmbErrorElement extends UmbLitElement { + /** + * The error message to display + * + * @attr + */ + @property() + errorMessage?: string; + + /** + * The error to display + * + * @attr + */ + @property() + error?: unknown; + + + + private renderProblemDetails = (problemDetails: ProblemDetailsModel) => html` +

${problemDetails.title}

+

${problemDetails.detail}

+
${problemDetails.stack}
+ `; + + private renderErrorObj = (error: Error) => html` +

${error.name}

+

${error.message}

+
${error.stack}
+ `; + + private isProblemDetails(error: unknown): error is ProblemDetailsModel { + return typeof error === 'object' && error !== null && 'detail' in error && 'title' in error; + } + + private isError(error: unknown): error is Error { + return typeof error === 'object' && error !== null && error instanceof Error; + } + + private renderError(error: unknown) { + if (this.isProblemDetails(error)) { + return this.renderProblemDetails(error); + } else if (this.isError(error)) { + return this.renderErrorObj(error); + } + + return nothing; + } + + render = () => html` +
+ + + +
+ +

Something went wrong

+

${this.errorMessage}

+ ${this.error + ? html` +
+ Details + ${this.renderError(this.error)} +
+ ` + : nothing} +
+
+ `; + + static styles = css` + #background { + position: fixed; + overflow: hidden; + background-position: 50%; + background-repeat: no-repeat; + background-size: cover; + background-image: url('${unsafeCSS(backgroundImg)}'); + width: 100vw; + height: 100vh; + } + + #logo { + position: fixed; + top: var(--uui-size-space-5); + left: var(--uui-size-space-5); + height: 30px; + } + + #logo img { + height: 100%; + } + + #container { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 100vw; + height: 100vh; + } + + #box { + width: 50vw; + padding: var(--uui-size-space-6) var(--uui-size-space-5) var(--uui-size-space-5) var(--uui-size-space-5); + } + + details { + padding: var(--uui-size-space-2) var(--uui-size-space-3); + background: var(--uui-color-surface-alt); + } + + pre { + width: 100%; + overflow: auto; + } + `; +} + +export default UmbErrorElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-error': UmbErrorElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/installer/database/installer-database.element.ts b/src/Umbraco.Web.UI.Client/src/installer/database/installer-database.element.ts index bb0ff6178a..7769f85ae2 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/database/installer-database.element.ts +++ b/src/Umbraco.Web.UI.Client/src/installer/database/installer-database.element.ts @@ -4,6 +4,7 @@ import { customElement, property, query, state } from 'lit/decorators.js'; import { UmbInstallerContext, UMB_INSTALLER_CONTEXT_TOKEN } from '../installer.context'; import { + ApiError, DatabaseInstallResponseModel, DatabaseSettingsPresentationModel, InstallResource, @@ -153,7 +154,9 @@ export class UmbInstallerDatabaseElement extends UmbLitElement { ); if (error) { - this._validationErrorMessage = `The server could not validate the database connection. Details: ${error.detail}`; + this._validationErrorMessage = `The server could not validate the database connection. Details: ${ + error instanceof ApiError ? error.body.detail : error.message + }`; this._installButton.state = 'failed'; return; } diff --git a/src/Umbraco.Web.UI.Client/src/installer/installer.context.ts b/src/Umbraco.Web.UI.Client/src/installer/installer.context.ts index 30b4c7350a..f86701d737 100644 --- a/src/Umbraco.Web.UI.Client/src/installer/installer.context.ts +++ b/src/Umbraco.Web.UI.Client/src/installer/installer.context.ts @@ -124,7 +124,6 @@ export class UmbInstallerContext { if (data) { this._settings.next(data); } else if (error) { - console.error(error.detail, error); this._installStatus.next(error); } } diff --git a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts index b483b5c8e2..71d2ac4a84 100644 --- a/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts +++ b/src/Umbraco.Web.UI.Client/src/upgrader/upgrader.element.ts @@ -3,7 +3,7 @@ import './upgrader-view.element'; import { html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UpgradeResource, UpgradeSettingsResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import { UpgradeResource, UpgradeSettingsResponseModel, ApiError } from '@umbraco-cms/backoffice/backend-api'; import { tryExecute } from '@umbraco-cms/backoffice/resources'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @@ -48,7 +48,7 @@ export class UmbUpgraderElement extends UmbLitElement { if (data) { this.upgradeSettings = data; } else if (error) { - this.errorMessage = error.detail; + this.errorMessage = error instanceof ApiError ? error.body.detail : error.message; } this.fetching = false; @@ -62,7 +62,8 @@ export class UmbUpgraderElement extends UmbLitElement { const { error } = await tryExecute(UpgradeResource.postUpgradeAuthorize()); if (error) { - this.errorMessage = error.detail || 'Unknown error, please try again'; + this.errorMessage = + error instanceof ApiError ? error.body.detail : error.message ?? 'Unknown error, please try again'; } else { history.pushState(null, '', 'section/content'); } diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index e1ba304d5b..b671e95bed 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -19,6 +19,7 @@ "baseUrl": ".", "paths": { "@umbraco-cms/backoffice/backend-api": ["libs/backend-api"], + "@umbraco-cms/backoffice/content-type": ["libs/content-type"], "@umbraco-cms/backoffice/context-api": ["libs/context-api"], "@umbraco-cms/backoffice/controller": ["libs/controller"], "@umbraco-cms/backoffice/css": ["libs/css/custom-properties.css"], @@ -41,6 +42,8 @@ "@umbraco-cms/backoffice/utils": ["libs/utils"], "@umbraco-cms/backoffice/workspace": ["libs/workspace"], "@umbraco-cms/backoffice/picker-input": ["libs/picker-input"], + "@umbraco-cms/backoffice/id": ["libs/id"], + "@umbraco-cms/backoffice/collection": ["libs/collection"], "@umbraco-cms/internal/lit-element": ["src/core/lit-element"], "@umbraco-cms/internal/modal": ["src/core/modal"], "@umbraco-cms/internal/router": ["src/core/router"], diff --git a/src/Umbraco.Web.UI.Client/utils/move-libs.js b/src/Umbraco.Web.UI.Client/utils/move-libs.js index 76c29dade7..08a4111d25 100644 --- a/src/Umbraco.Web.UI.Client/utils/move-libs.js +++ b/src/Umbraco.Web.UI.Client/utils/move-libs.js @@ -22,7 +22,7 @@ cpSync(`${srcDir}/package.json`, `${inputDir}/package.json`, { recursive: true } console.log(`Copied ${srcDir}/package.json to ${inputDir}/package.json`); cpSync(`${srcDir}/README.md`, `${inputDir}/README.md`, { recursive: true }); console.log(`Copied ${srcDir}/README.md to ${inputDir}/README.md`); -cpSync(`${inputDir}/umbraco-package-schema.json`, `${executableDir}/umbraco-json-schema.json`, { recursive: true }); +cpSync(`${inputDir}/umbraco-package-schema.json`, `${executableDir}/umbraco-package-schema.json`, { recursive: true }); console.log(`Copied ${inputDir}/umbraco-package-schema.json to ${executableDir}/umbraco-package-schema.json`); const libs = readdirSync(inputDir); diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs index 9f26fb1b09..0b10a7d1a2 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs +++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs @@ -39,6 +39,7 @@ export default { imports: { 'src/': './src/', '@umbraco-cms/backoffice/backend-api': './libs/backend-api/index.ts', + '@umbraco-cms/backoffice/content-type': './libs/content-type/index.ts', '@umbraco-cms/backoffice/context-api': './libs/context-api/index.ts', '@umbraco-cms/backoffice/controller': './libs/controller/index.ts', '@umbraco-cms/backoffice/element': './libs/element/index.ts', @@ -57,6 +58,8 @@ export default { '@umbraco-cms/backoffice/utils': './libs/utils/index.ts', '@umbraco-cms/backoffice/workspace': './libs/workspace/index.ts', '@umbraco-cms/backoffice/picker-input': './libs/picker-input/index.ts', + '@umbraco-cms/backoffice/id': './libs/id/index.ts', + '@umbraco-cms/backoffice/collection': './libs/collection/index.ts', '@umbraco-cms/internal/lit-element': './src/core/lit-element/index.ts', '@umbraco-cms/internal/modal': './src/core/modal/index.ts', '@umbraco-cms/internal/router': './src/core/router/index.ts',