diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..71989d9 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,404 @@ +# Version: 1.6.2 (Using https://semver.org/) +# Updated: 2020-11-02 +# See https://github.com/RehanSaeed/EditorConfig/releases for release notes. +# See https://github.com/RehanSaeed/EditorConfig for updates to this file. +# See http://EditorConfig.org for more information about .editorconfig files. +# +# Severity-values: none, hint, suggestion, warning, error + +########################################## +# Common Settings +########################################## + +# This file is the top-most EditorConfig file +root = true + +# All Files +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + + +########################################## +# File Extension Settings +########################################## + +# Visual Studio Solution Files +[*.sln] +indent_style = tab + +# Visual Studio XML Project Files +[*.{csproj,vbproj,vcxproj.filters,proj,projitems,shproj}] +indent_size = 2 + +# XML Configuration Files +[*.{xml,config,props,targets,nuspec,resx,ruleset,vsixmanifest,vsct}] +indent_size = 2 + +# JSON Files +[*.{json,json5,webmanifest}] +indent_size = 2 + +# YAML Files +[*.{yml,yaml}] +indent_size = 2 + +# Markdown Files +[*.md] +trim_trailing_whitespace = false + +# Web Files +[*.{htm,html,js,jsm,ts,tsx,css,sass,scss,less,svg,vue}] +indent_size = 2 + +# Batch Files +[*.{cmd,bat}] +end_of_line = crlf + +# Bash Files +[*.sh] +end_of_line = lf + +# Makefiles +[Makefile] +indent_style = tab + + +[*.js] +trim_trailing_whitespace = true + +[*.less] +trim_trailing_whitespace = false + +########################################## +# File Header (Uncomment to support file headers) +# https://docs.microsoft.com/visualstudio/ide/reference/add-file-header +########################################## + +# [*.{cs,csx,cake,vb,vbx}] +file_header_template = Copyright (c) Umbraco.\nSee LICENSE for more details. + +# SA1636: File header copyright text should match +# Justification: .editorconfig supports file headers. If this is changed to a value other than "none", a stylecop.json file will need to added to the project. +# dotnet_diagnostic.SA1636.severity = none + +########################################## +# .NET Language Conventions +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions +########################################## + +# .NET Code Style Settings +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#net-code-style-settings +[*.{cs,csx,cake,vb,vbx}] +# "this." and "Me." qualifiers +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#this-and-me +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion +# Language keywords instead of framework type names for type references +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#language-keywords +dotnet_style_predefined_type_for_locals_parameters_members = true:warning +dotnet_style_predefined_type_for_member_access = true:warning +# Modifier preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#normalize-modifiers +dotnet_style_require_accessibility_modifiers = always:warning +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:warning +visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:warning +dotnet_style_readonly_field = true:warning +# Parentheses preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#parentheses-preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion +# Expression-level preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#expression-level-preferences +dotnet_style_object_initializer = true:warning +dotnet_style_collection_initializer = true:warning +dotnet_style_explicit_tuple_names = true:warning +dotnet_style_prefer_inferred_tuple_names = true:warning +dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning +dotnet_style_prefer_auto_properties = true:warning +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning +dotnet_style_prefer_conditional_expression_over_assignment = false:suggestion +dotnet_style_prefer_conditional_expression_over_return = false:suggestion +dotnet_style_prefer_compound_assignment = true:warning +# Null-checking preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#null-checking-preferences +dotnet_style_coalesce_expression = true:warning +dotnet_style_null_propagation = true:warning +# Parameter preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#parameter-preferences +dotnet_code_quality_unused_parameters = all:warning +# More style options (Undocumented) +# https://github.com/MicrosoftDocs/visualstudio-docs/issues/3641 +dotnet_style_operator_placement_when_wrapping = end_of_line +# https://github.com/dotnet/roslyn/pull/40070 +dotnet_style_prefer_simplified_interpolation = true:warning + +# C# Code Style Settings +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#c-code-style-settings +[*.{cs,csx,cake}] +# Implicit and explicit types +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#implicit-and-explicit-types +csharp_style_var_for_built_in_types = never +csharp_style_var_when_type_is_apparent = never +csharp_style_var_elsewhere = never +# Expression-bodied members +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#expression-bodied-members +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_constructors = never +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_accessors = true:suggestion +csharp_style_expression_bodied_lambdas = true:suggestion +csharp_style_expression_bodied_local_functions = true:suggestion +# Pattern matching +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#pattern-matching +csharp_style_pattern_matching_over_is_with_cast_check = true:warning +csharp_style_pattern_matching_over_as_with_null_check = true:warning +# Inlined variable declarations +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#inlined-variable-declarations +csharp_style_inlined_variable_declaration = true:warning +# Expression-level preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#expression-level-preferences +csharp_prefer_simple_default_expression = true:warning +# "Null" checking preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#c-null-checking-preferences +csharp_style_throw_expression = true:warning +csharp_style_conditional_delegate_call = true:warning +# Code block preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#code-block-preferences +csharp_prefer_braces = false:warning +# Unused value preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#unused-value-preferences +csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +# Index and range preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#index-and-range-preferences +csharp_style_prefer_index_operator = true:warning +csharp_style_prefer_range_operator = true:warning +# Miscellaneous preferences +# https://docs.microsoft.com/visualstudio/ide/editorconfig-language-conventions#miscellaneous-preferences +csharp_style_deconstructed_variable_declaration = true:warning +csharp_style_pattern_local_over_anonymous_function = true:warning +csharp_using_directive_placement = outside_namespace:warning +csharp_prefer_static_local_function = true:warning +csharp_prefer_simple_using_statement = true:suggestion + +########################################## +# .NET Formatting Conventions +# https://docs.microsoft.com/visualstudio/ide/editorconfig-code-style-settings-reference#formatting-conventions +########################################## + +# Organize usings +# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#organize-using-directives +dotnet_sort_system_directives_first = true +# Newline options +# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#new-line-options +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true +# Indentation options +# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#indentation-options +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = no_change +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents_when_block = false +# Spacing options +# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#spacing-options +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_after_comma = true +csharp_space_before_comma = false +csharp_space_after_dot = false +csharp_space_before_dot = false +csharp_space_after_semicolon_in_for_statement = true +csharp_space_before_semicolon_in_for_statement = false +csharp_space_around_declaration_statements = false +csharp_space_before_open_square_brackets = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_square_brackets = false +# Wrapping options +# https://docs.microsoft.com/visualstudio/ide/editorconfig-formatting-conventions#wrap-options +csharp_preserve_single_line_statements = false +csharp_preserve_single_line_blocks = true + +########################################## +# .NET Naming Conventions +# https://docs.microsoft.com/visualstudio/ide/editorconfig-naming-conventions +########################################## + +[*.{cs,csx,cake,vb,vbx}] +dotnet_diagnostic.CS1591.severity = none + +########################################## +# Styles +########################################## + +# camel_case_style - Define the camelCase style +dotnet_naming_style.camel_case_style.capitalization = camel_case +# pascal_case_style - Define the PascalCase style +dotnet_naming_style.pascal_case_style.capitalization = pascal_case +# first_upper_style - The first character must start with an upper-case character +dotnet_naming_style.first_upper_style.capitalization = first_word_upper +# prefix_interface_with_i_style - Interfaces must be PascalCase and the first character of an interface must be an 'I' +dotnet_naming_style.prefix_interface_with_i_style.capitalization = pascal_case +dotnet_naming_style.prefix_interface_with_i_style.required_prefix = I +# prefix_type_parameters_with_t_style - Generic Type Parameters must be PascalCase and the first character must be a 'T' +dotnet_naming_style.prefix_type_parameters_with_t_style.capitalization = pascal_case +dotnet_naming_style.prefix_type_parameters_with_t_style.required_prefix = T +# disallowed_style - Anything that has this style applied is marked as disallowed +dotnet_naming_style.disallowed_style.capitalization = pascal_case +dotnet_naming_style.disallowed_style.required_prefix = ____RULE_VIOLATION____ +dotnet_naming_style.disallowed_style.required_suffix = ____RULE_VIOLATION____ +# internal_error_style - This style should never occur... if it does, it indicates a bug in file or in the parser using the file +dotnet_naming_style.internal_error_style.capitalization = pascal_case +dotnet_naming_style.internal_error_style.required_prefix = ____INTERNAL_ERROR____ +dotnet_naming_style.internal_error_style.required_suffix = ____INTERNAL_ERROR____ + +########################################## +# .NET Design Guideline Field Naming Rules +# Naming rules for fields follow the .NET Framework design guidelines +# https://docs.microsoft.com/dotnet/standard/design-guidelines/index +########################################## + +# All public/protected/protected_internal constant fields must be PascalCase +# https://docs.microsoft.com/dotnet/standard/design-guidelines/field +dotnet_naming_symbols.public_protected_constant_fields_group.applicable_accessibilities = public, protected, protected_internal, internal, private +dotnet_naming_symbols.public_protected_constant_fields_group.required_modifiers = const +dotnet_naming_symbols.public_protected_constant_fields_group.applicable_kinds = field +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.symbols = public_protected_constant_fields_group +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.severity = warning + +# All public/protected/protected_internal static readonly fields must be PascalCase +# https://docs.microsoft.com/dotnet/standard/design-guidelines/field +dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_accessibilities = public, protected, protected_internal +dotnet_naming_symbols.public_protected_static_readonly_fields_group.required_modifiers = static, readonly +dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_kinds = field +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.symbols = public_protected_static_readonly_fields_group +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.severity = warning + +# No other public/protected/protected_internal fields are allowed +# https://docs.microsoft.com/dotnet/standard/design-guidelines/field +dotnet_naming_symbols.other_public_protected_fields_group.applicable_accessibilities = public, protected, protected_internal +dotnet_naming_symbols.other_public_protected_fields_group.applicable_kinds = field +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.symbols = other_public_protected_fields_group +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.style = disallowed_style +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.severity = ignore + +# This rule should never fire. However, it's included for at least two purposes: +# First, it helps to understand, reason about, and root-case certain types of issues, such as bugs in .editorconfig parsers. +# Second, it helps to raise immediate awareness if a new field type is added (as occurred recently in C#). +dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_accessibilities = * +dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_kinds = field +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.symbols = sanity_check_uncovered_field_case_group +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.style = internal_error_style +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.severity = error + +########################################## +# Other Naming Rules +########################################## + +# All of the following must be PascalCase: +# - Namespaces +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-namespaces +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md +# - Classes and Enumerations +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces +# https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/SA1300.md +# - Delegates +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces#names-of-common-types +# - Constructors, Properties, Events, Methods +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-type-members +dotnet_naming_symbols.element_group.applicable_kinds = namespace, class, enum, struct, delegate, event, method, property +dotnet_naming_rule.element_rule.symbols = element_group +dotnet_naming_rule.element_rule.style = pascal_case_style +dotnet_naming_rule.element_rule.severity = warning + +# Interfaces use PascalCase and are prefixed with uppercase 'I' +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces +dotnet_naming_symbols.interface_group.applicable_kinds = interface +dotnet_naming_rule.interface_rule.symbols = interface_group +dotnet_naming_rule.interface_rule.style = prefix_interface_with_i_style +dotnet_naming_rule.interface_rule.severity = warning + +# Generics Type Parameters use PascalCase and are prefixed with uppercase 'T' +# https://docs.microsoft.com/dotnet/standard/design-guidelines/names-of-classes-structs-and-interfaces +dotnet_naming_symbols.type_parameter_group.applicable_kinds = type_parameter +dotnet_naming_rule.type_parameter_rule.symbols = type_parameter_group +dotnet_naming_rule.type_parameter_rule.style = prefix_type_parameters_with_t_style +dotnet_naming_rule.type_parameter_rule.severity = warning + +# Function parameters use camelCase +# https://docs.microsoft.com/dotnet/standard/design-guidelines/naming-parameters +dotnet_naming_symbols.parameters_group.applicable_kinds = parameter +dotnet_naming_rule.parameters_rule.symbols = parameters_group +dotnet_naming_rule.parameters_rule.style = camel_case_style +dotnet_naming_rule.parameters_rule.severity = warning + +# Instance fields use camelCase and are prefixed with '_' +dotnet_naming_rule.instance_fields_should_be_camel_case.severity = warning +dotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields +dotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style +dotnet_naming_symbols.instance_fields.applicable_kinds = field +dotnet_naming_style.instance_field_style.capitalization = camel_case +dotnet_naming_style.instance_field_style.required_prefix = _ + +########################################## +# License +########################################## +# The following applies as to the .editorconfig file ONLY, and is +# included below for reference, per the requirements of the license +# corresponding to this .editorconfig file. +# See: https://github.com/RehanSaeed/EditorConfig +# +# MIT License +# +# Copyright (c) 2017-2019 Muhammad Rehan Saeed +# Copyright (c) 2019 Henry Gabryjelski +# +# Permission is hereby granted, free of charge, to any +# person obtaining a copy of this software and associated +# documentation files (the "Software"), to deal in the +# Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, +# sublicense, and/or sell copies of the Software, and to permit +# persons to whom the Software is furnished to do so, subject +# to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +########################################## diff --git a/.gitignore b/.gitignore index bb84def..5166bef 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,6 @@ bin/ xcopy* Our.Umbraco.TheDashboard.Testsite/ -Artifacts \ No newline at end of file +Artifacts + +Our.Umbraco.TheDashboard/wwwroot/App_Plugins/Our.Umbraco.TheDashboard/dist \ No newline at end of file diff --git a/Our.Umbraco.TheDashboard/Client/.gitignore b/Our.Umbraco.TheDashboard/Client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/Our.Umbraco.TheDashboard/Client/index.html b/Our.Umbraco.TheDashboard/Client/index.html new file mode 100644 index 0000000..283e961 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/index.html @@ -0,0 +1,16 @@ + + + + + + + Vite + Lit + TS + + + + + +

Vite + Lit

+
+ + diff --git a/Our.Umbraco.TheDashboard/Client/openapi-ts.config.ts b/Our.Umbraco.TheDashboard/Client/openapi-ts.config.ts new file mode 100644 index 0000000..563fb04 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/openapi-ts.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from '@hey-api/openapi-ts'; + +export default defineConfig({ + input: 'http://localhost:24760/umbraco/swagger/the-dashboard/swagger.json', + output: 'src/backend-api', + //format : false, + //enums : 'javascript', // Typescript not recommended https://heyapi.vercel.app/openapi-ts/configuration.html#enums + schemas : false, + //lint : false, + //debug: true, + services: { + name: '{{name}}Resource' + } +}); diff --git a/Our.Umbraco.TheDashboard/Client/package-lock.json b/Our.Umbraco.TheDashboard/Client/package-lock.json new file mode 100644 index 0000000..4d1c3d8 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/package-lock.json @@ -0,0 +1,2834 @@ +{ + "name": "the-dashboard-umbraco", + "version": "14.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "the-dashboard-umbraco", + "version": "14.0.0", + "dependencies": { + "lit": "^3.1.2" + }, + "devDependencies": { + "@hey-api/openapi-ts": "^0.45.1", + "@umbraco-cms/backoffice": "^14.0.0-rc3", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.6.1", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.6.1.tgz", + "integrity": "sha512-DxjgKBCoyReu4p5HMvpmgSOfRhhBcuf5V5soDDRgOTZMwsA4KSFzol1abFZgiCTE11L2kKGca5Md9GwDdXVBwQ==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@hey-api/openapi-ts": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.45.1.tgz", + "integrity": "sha512-TT4YC9SshgruHnr/z47LD945hFhefuD6xSfdt9+fv/sU+shP0nPJhNdyt71oMGTAB9h6nsrjC8z84ZnoAGKHrg==", + "dev": true, + "dependencies": { + "@apidevtools/json-schema-ref-parser": "11.6.1", + "c12": "1.10.0", + "camelcase": "8.0.0", + "commander": "12.0.0", + "handlebars": "4.7.8" + }, + "bin": { + "openapi-ts": "bin/index.cjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "typescript": "^5.x" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz", + "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==" + }, + "node_modules/@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", + "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", + "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/diff": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-5.2.1.tgz", + "integrity": "sha512-uxpcuwWJGhe2AR1g8hD9F5OYGCqjqWnBUQFD8gMZsDbv8oPHzxJF6iMO6n8Tk0AdzlxoaaoQhOYlIg/PukVU8g==", + "dev": true, + "peer": true + }, + "node_modules/@types/dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/trusted-types": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true, + "peer": true + }, + "node_modules/@umbraco-cms/backoffice": { + "version": "14.0.0-rc3", + "resolved": "https://registry.npmjs.org/@umbraco-cms/backoffice/-/backoffice-14.0.0-rc3.tgz", + "integrity": "sha512-R8NKkwN1oTb9I2Mb7GlShjkw9+7F3UiyLf3Q3admHl0BVf34TcfE6QCsZAL50FYSewI9umsi48Xdaxx/WtASVg==", + "dev": true, + "engines": { + "node": ">=20.9 <21", + "npm": ">=10.1 < 11" + }, + "peerDependencies": { + "@types/diff": "^5.0.9", + "@types/dompurify": "^3.0.5", + "@types/uuid": "^9.0.8", + "@umbraco-ui/uui": "1.8.0-rc.3", + "@umbraco-ui/uui-css": "1.8.0-rc.0", + "base64-js": "^1.5.1", + "diff": "^5.2.0", + "dompurify": "^3.0.9", + "element-internals-polyfill": "^1.3.10", + "lit": "^3.1.2", + "marked": "^12.0.0", + "monaco-editor": "^0.46.0", + "rxjs": "^7.8.1", + "tinymce": "^6.8.3", + "tinymce-i18n": "^24.1.29", + "uuid": "^9.0.1" + } + }, + "node_modules/@umbraco-ui/uui": { + "version": "1.8.0-rc.3", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.8.0-rc.3.tgz", + "integrity": "sha512-35kEb4xjQY+90cYCC28+wIbk6XPXB504TIr6qDi0Ekl11zN3PvMIyhQooohjKD1FxpwfDNeagiBW56e2LnZJkA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-action-bar": "1.8.0-rc.0", + "@umbraco-ui/uui-avatar": "1.8.0-rc.0", + "@umbraco-ui/uui-avatar-group": "1.8.0-rc.0", + "@umbraco-ui/uui-badge": "1.8.0-rc.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-boolean-input": "1.8.0-rc.0", + "@umbraco-ui/uui-box": "1.8.0-rc.1", + "@umbraco-ui/uui-breadcrumbs": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-button-group": "1.8.0-rc.0", + "@umbraco-ui/uui-button-inline-create": "1.8.0-rc.0", + "@umbraco-ui/uui-card": "1.8.0-rc.0", + "@umbraco-ui/uui-card-block-type": "1.8.0-rc.0", + "@umbraco-ui/uui-card-content-node": "1.8.0-rc.0", + "@umbraco-ui/uui-card-media": "1.8.0-rc.0", + "@umbraco-ui/uui-card-user": "1.8.0-rc.0", + "@umbraco-ui/uui-caret": "1.8.0-rc.0", + "@umbraco-ui/uui-checkbox": "1.8.0-rc.0", + "@umbraco-ui/uui-color-area": "1.8.0-rc.0", + "@umbraco-ui/uui-color-picker": "1.8.0-rc.0", + "@umbraco-ui/uui-color-slider": "1.8.0-rc.0", + "@umbraco-ui/uui-color-swatch": "1.8.0-rc.0", + "@umbraco-ui/uui-color-swatches": "1.8.0-rc.0", + "@umbraco-ui/uui-combobox": "1.8.0-rc.2", + "@umbraco-ui/uui-combobox-list": "1.8.0-rc.0", + "@umbraco-ui/uui-css": "1.8.0-rc.0", + "@umbraco-ui/uui-dialog": "1.8.0-rc.0", + "@umbraco-ui/uui-dialog-layout": "1.8.0-rc.0", + "@umbraco-ui/uui-file-dropzone": "1.8.0-rc.0", + "@umbraco-ui/uui-file-preview": "1.8.0-rc.0", + "@umbraco-ui/uui-form": "1.8.0-rc.0", + "@umbraco-ui/uui-form-layout-item": "1.8.0-rc.0", + "@umbraco-ui/uui-form-validation-message": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0", + "@umbraco-ui/uui-input": "1.8.0-rc.0", + "@umbraco-ui/uui-input-file": "1.8.0-rc.2", + "@umbraco-ui/uui-input-lock": "1.8.0-rc.2", + "@umbraco-ui/uui-input-password": "1.8.0-rc.0", + "@umbraco-ui/uui-keyboard-shortcut": "1.8.0-rc.0", + "@umbraco-ui/uui-label": "1.8.0-rc.0", + "@umbraco-ui/uui-loader": "1.8.0-rc.0", + "@umbraco-ui/uui-loader-bar": "1.8.0-rc.0", + "@umbraco-ui/uui-loader-circle": "1.8.0-rc.0", + "@umbraco-ui/uui-menu-item": "1.8.0-rc.1", + "@umbraco-ui/uui-modal": "1.8.0-rc.3", + "@umbraco-ui/uui-pagination": "1.8.0-rc.2", + "@umbraco-ui/uui-popover": "1.8.0-rc.0", + "@umbraco-ui/uui-popover-container": "1.8.0-rc.0", + "@umbraco-ui/uui-progress-bar": "1.8.0-rc.0", + "@umbraco-ui/uui-radio": "1.8.0-rc.0", + "@umbraco-ui/uui-range-slider": "1.8.0-rc.0", + "@umbraco-ui/uui-ref": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-list": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-data-type": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-document-type": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-form": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-member": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-package": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node-user": "1.8.0-rc.0", + "@umbraco-ui/uui-scroll-container": "1.8.0-rc.0", + "@umbraco-ui/uui-select": "1.8.0-rc.0", + "@umbraco-ui/uui-slider": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-expand": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-folder": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-lock": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-more": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-sort": "1.8.0-rc.0", + "@umbraco-ui/uui-table": "1.8.0-rc.0", + "@umbraco-ui/uui-tabs": "1.8.0-rc.2", + "@umbraco-ui/uui-tag": "1.8.0-rc.0", + "@umbraco-ui/uui-textarea": "1.8.0-rc.0", + "@umbraco-ui/uui-toast-notification": "1.8.0-rc.2", + "@umbraco-ui/uui-toast-notification-container": "1.8.0-rc.2", + "@umbraco-ui/uui-toast-notification-layout": "1.8.0-rc.0", + "@umbraco-ui/uui-toggle": "1.8.0-rc.0", + "@umbraco-ui/uui-visually-hidden": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-action-bar": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.8.0-rc.0.tgz", + "integrity": "sha512-zG53nm7DMLsyu79gehxtuMj/2bEMgKA7lI6qudi7de74/lFvrGhxZ7JqT5RV6pDiriCxsqBd9OlLoynoWMOJow==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button-group": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-avatar": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.8.0-rc.0.tgz", + "integrity": "sha512-UbwoRBRXgtrebNZ1PTvQWqmgMuTSBD4dZ4xEF6mf7s0BRImI+6AoJevx3GETClnRB9UuD1lOR1GyxA7D76PCDA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-avatar-group": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.8.0-rc.0.tgz", + "integrity": "sha512-s+odJUrwkMnDBqqP7ms1AGJznLQOw1XdVTtaJLx926U1932JBdlkDFtlKWPNrvGHRv6nILTVQWiyaz0TP02Lcg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-avatar": "1.8.0-rc.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-badge": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.8.0-rc.0.tgz", + "integrity": "sha512-gG6Lr9dc/6GuHcGVTnb1uJFea95GKqxZHPyp0ljuc1TWUfrX9tKm+QXsHjMwbhpM0GWJUH5iPt0dB7xCsrkTFA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-base": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.8.0-rc.0.tgz", + "integrity": "sha512-C7JhJD0Z5/wGZ/f3E68gdtqIspGK5LaEXN0A9pJtS2ZkdMbUFYo85y8aY9NWGGXDkEXHttMvUHv/ePiFsr/7Gw==", + "dev": true, + "peer": true, + "peerDependencies": { + "lit": ">=2.8.0" + } + }, + "node_modules/@umbraco-ui/uui-boolean-input": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.8.0-rc.0.tgz", + "integrity": "sha512-EFK9GPRa59E94Hp3K32uJGKAlYu2P9nENK9WQ8swCthBtw9a8GL9HxaQxGebgbf1kwkjyoihCYAF229czDe2Xw==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-box": { + "version": "1.8.0-rc.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.8.0-rc.1.tgz", + "integrity": "sha512-5FcG55k0dDYili4JfdOjsNkhAyseyHbqcEKOGmtV110ugvTZpjB/N/Zo49aHNkEIw4FduTLGhP6/2eFjSpLmYA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-css": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-breadcrumbs": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.8.0-rc.0.tgz", + "integrity": "sha512-eubEanIW9LyNSxj53LNb5zCO9Hj23TJEqpYnoci4lSaeaqNOUfpQnn2FYoS8rmvZwnGpBWOq40XSCd1VbNbgbQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-button": { + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.8.0-rc.2.tgz", + "integrity": "sha512-5JAS247c0NdjsOdzdXOqjOEsfb1HxvPWvBc2KUMOi2hjh/TQbp765BXB0lvc5RqePwuJbwogeAhbesLuRvCCwQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-button-group": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.8.0-rc.0.tgz", + "integrity": "sha512-m4+OE/5CLuPikIoPIne2Rvi9cSUcTvz9qne1ZuTHtu/owuYLKA1lp1wCPVGJTkA3zITeLXkMbpuRaCpaKjB6Zw==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-button-inline-create": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.8.0-rc.0.tgz", + "integrity": "sha512-Xz7LGdotdyApJxeEmEU8OiHImS3/4yLEIhD0yjAO1F2i33/9pu6KUmloCq0cYO+3RhbQcdcsmrd+zjQutwBHHg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-card": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.8.0-rc.0.tgz", + "integrity": "sha512-EIS73DSOpbYmpkI1IibbO/cuhZPQulweXy2wfXq1gmeux8rr+frXZtZ+6dsvgpdBIx9K/+WoGPEzpyFg08EYOw==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-card-block-type": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-block-type/-/uui-card-block-type-1.8.0-rc.0.tgz", + "integrity": "sha512-KGODyaGfbJiK8YQczU6yvpW/PFKzu1iKCnURogMsb0qOZHyKUJyddRm1fgFpX+i7RpyR4Cjbmw/Vmnt/oeNenQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-card": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-card-content-node": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.8.0-rc.0.tgz", + "integrity": "sha512-uHo3WY/cAsi87sa0QIR2sUFzUggtM31xKmoLCMm3bUMiDW0Y2lDfwb6mZU6yhykjczhcHuPSxwK1SgsI8bJsPg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-card": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-card-media": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.8.0-rc.0.tgz", + "integrity": "sha512-ISc540E2PZCBkJQLfRL9d2tMjP6GdLsP9+VihVgAKLSkG9+T/dMkbtTWlGX5ehmfaDzDmxXS9XUh8MCkplrRPw==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-card": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-folder": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-card-user": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.8.0-rc.0.tgz", + "integrity": "sha512-VIOGZnhvDO38e4RmQAxWVZFmiuT1FVIdA/DPNmrOiTJte2sWhwYb6mZWihiP1M09ChkhqviwZSkmt+xo2A80ng==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-avatar": "1.8.0-rc.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-card": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-caret": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.8.0-rc.0.tgz", + "integrity": "sha512-9Ko0NUorE4k3Iv49gJjVnSxiHJKUE3ImrgkPxI3GhNw5eUagpOecyl3MKlI/twpkHfY1CCeq7ngUV9+3E2uIiw==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-checkbox": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.8.0-rc.0.tgz", + "integrity": "sha512-zOc35YNojxC1iqezOPnf3vL/WBMhdVPkXUUvVGrWCNMBsTy42JZUt8EDOgiRJu0j1yIrPuQy4NbQJ5NPQCRuLQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-boolean-input": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-color-area": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.8.0-rc.0.tgz", + "integrity": "sha512-xj9uAsh1SPdxmsGeS+k/hM5sFwXA9XuBwgZwvXSGluiOEranTxmGW2Gq9p+dng1CQEyvvRbQ+R12R40wghpPUA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "colord": "^2.9.3" + } + }, + "node_modules/@umbraco-ui/uui-color-picker": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.8.0-rc.0.tgz", + "integrity": "sha512-l5d8Ar9+z4K3GWrD3w2qn5ChnAhFmBcbJglgaKbJ78BFFccB+HYjYB2znMYPyi57+UVxcQPvr6jAz5i8BSisZg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-popover-container": "1.8.0-rc.0", + "colord": "^2.9.3" + } + }, + "node_modules/@umbraco-ui/uui-color-slider": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.8.0-rc.0.tgz", + "integrity": "sha512-eh8XtPthXxl0z0FbyXA4epjiB18ZDnCMJJQ8w5br6d4tQicBPgJhWZQKBrZ1bNRpPaiHTxaA7kJ+mBz1l/DiUA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-color-swatch": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.8.0-rc.0.tgz", + "integrity": "sha512-BdP1GYu8imhrO1KRpputsItIEGzSH44mWG3dRZakrOCyJt6V/nLGpHRymEuh2B0qcd7nDmyfN3mhtRRQ3N328w==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0", + "colord": "^2.9.3" + } + }, + "node_modules/@umbraco-ui/uui-color-swatches": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.8.0-rc.0.tgz", + "integrity": "sha512-HrRS9QZKEinHoiFUfmYNs430OrkkB55r3gDgsVn+LWuiKiYDR3pXO6wYrtvq4+RiviGPMLPEzuInd3GvDI+vlA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-color-swatch": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-combobox": { + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.8.0-rc.2.tgz", + "integrity": "sha512-71AbVcHweB36g3jUCur/PKIKbpSHMvJq2iQou84NgVtO+hBM0PxH2JOsLRCMFG76D8fjIUd03tNp6szBHH1RMQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-combobox-list": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-popover-container": "1.8.0-rc.0", + "@umbraco-ui/uui-scroll-container": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-expand": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-combobox-list": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.8.0-rc.0.tgz", + "integrity": "sha512-UTxJvlhS4zf4XXh4j9FeTEzdLs0U9cuiBFDlNQ5F0gF2LvA9LK/bCszA1iQhKx6umyWv0U+04hXgLTY/MT1Ymg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-css": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.8.0-rc.0.tgz", + "integrity": "sha512-trwLCgJtT91iP2b20QlHWjuj44AF4lWCg4CqBZoT2Z8a5IedqflnQstXCZRYm/F5Re32YGTwlR9lF1rAXqq4gg==", + "dev": true, + "peer": true, + "peerDependencies": { + "lit": ">=2.8.0" + } + }, + "node_modules/@umbraco-ui/uui-dialog": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.8.0-rc.0.tgz", + "integrity": "sha512-B6HW+2wj17wyt4LGI1Zfs9OmMwK5qzDYmrAtx3uo3L+aieQ3QNpmYLJHP7c7xeU4kO0u+GJgBFt/qFRb/iPM1g==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-css": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-dialog-layout": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.8.0-rc.0.tgz", + "integrity": "sha512-uMuLWLQczUWPo5QokKiYJ5CuhVly3T8kYdFaKB+OkVRPIG2GHF1VKvM/JJX6Tx3po1EsehR3wb6JaxY+/BsX0Q==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-file-dropzone": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.8.0-rc.0.tgz", + "integrity": "sha512-8JN8nzoIysub+pxvj3gNhvHRrZmui9SflvF6mMTKpk1uwZxE7LI4HZDhjmczKKDX9MChbzn1bSd8JYaxoA4zzQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file-dropzone": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-file-preview": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.8.0-rc.0.tgz", + "integrity": "sha512-1xQ6R6ZoabFpAkkLWMyndR17j2xbgt0tBk59xFipnBeYsPyWkZd94MV7kl6T98YlxgmPY83+uhMI6qFuTPogiw==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-folder": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-form": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.8.0-rc.0.tgz", + "integrity": "sha512-5NtMr9qfcRNhL+q9UmXjR57/qGxin4x86OFVANb1Y12rx+V2l1MlyTHhGhGyukZX0re3f7DaY8kwg1CvUy9U3w==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-form-layout-item": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.8.0-rc.0.tgz", + "integrity": "sha512-5q8b0DVhbTUUYUaPWQDdjU7+kzWmns1EESA3dOL/2I4DzejfBgU7eGufdVRjlrvQyhPuHHp0wVs4aAL3jF0CCg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-form-validation-message": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-form-validation-message": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.8.0-rc.0.tgz", + "integrity": "sha512-ePlg9BD4PkPvcjD+rCXrkJjAmoctXoVsDnBmhbn0cWbUiSpSX21OVTDiS9XW9Iyb+HOh5Pm0coGGTpF18+yM1A==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-icon": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.8.0-rc.0.tgz", + "integrity": "sha512-qEXgNGhN+hdRRune048zN76EkEpsHrQR3kLW7uYtF0/NSslKQxGLVWhNMK7X2Rw8t9btRmfp9Ib2mwZFNNayQw==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-icon-registry": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.8.0-rc.0.tgz", + "integrity": "sha512-amoA60rpXAciPeepYM4G+pwHDG9llqPuQmTOMv7GchFbjghENDOT3dW9kOQZbSEncUEgHWpsf/Nu8zN2aJmiVw==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-icon-registry-essential": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.8.0-rc.0.tgz", + "integrity": "sha512-0X42o/uet3bjL3v/5i2Q5hxgbkWYK9eTUrmDwBq01PIyw7XKW7Z/5C5Ryi292a3cwEGr0cAwawCLAkiTeIQiwg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-input": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.8.0-rc.0.tgz", + "integrity": "sha512-SuiTzZP0N1qTpivGKhRzVRKumTe6v6F34KGux303tJws7Nng4AW/KEq+QFpzd1nl0NQGQRQ3JaL+StSmgQFYJA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-input-file": { + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.8.0-rc.2.tgz", + "integrity": "sha512-WO4boW7+K4cFF+wo+qunBtiWyfn2XOdd3tl+8M/+lBwmCDIxuLbhrDosZEiUKvhyG4BjZxK1+C5JFqROZSQrkg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-action-bar": "1.8.0-rc.0", + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-file-dropzone": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-input-lock": { + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.8.0-rc.2.tgz", + "integrity": "sha512-k8Dv83zUuEQvQBOFE+oD6tBNXB+UBd6pnQmoqLvohDobWVmjWo8o0vL2AszroLR9XFPGbPE+UpCNODM7OAEw9A==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-input": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-input-password": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.8.0-rc.0.tgz", + "integrity": "sha512-B867GMgEr9/40tobOaO4rGI8fX7n+OZfizJrkxPNYgq9IHXMzbuHWZNiM/vW+uZNDDHDStZYxMa1L2NEfYOypg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0", + "@umbraco-ui/uui-input": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-keyboard-shortcut": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.8.0-rc.0.tgz", + "integrity": "sha512-EwGbFA3TGdc9JydR4wmWCwGgMTksH7bjdBUyCR6Ix2nsekBsxNsfc/vcbHkfzw1u12WEqSZU4CzeNb8vYIldbg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-label": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.8.0-rc.0.tgz", + "integrity": "sha512-lUYd9vmGulWyF4qeWtX4ZwFaSUwP20KsGoXfJmNJ0EF7gSaYrFPJ0Sax2VSeo8BVFzhd1VtOHmLqL4DcQcOn1w==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-loader": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.8.0-rc.0.tgz", + "integrity": "sha512-S3LZCFrnI/F75I6OUVjXJ3E4jTH9o4b4JzE6Xe0V8u+gUfCU4NaAdoOl0x+u01Qh7NlZc318a+HiURP4W2Zr1g==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-loader-bar": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.8.0-rc.0.tgz", + "integrity": "sha512-oJdr5vXP+tny6ZaM7VTV0E50MPuHeO7dbbX+hai+A55KOsSF/ZZrQMB1WZtdcyY3pzWA6AKgvTtRFEbU6nHf7w==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-loader-circle": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.8.0-rc.0.tgz", + "integrity": "sha512-6g0bxqkTnNBAkSdm6EqlMQ0Gm5PDSEBGvGJ1qfyvgr9Rfa1rHR4GpOrz04A+Fobz9dXoCN2xfqNayUDBo4dy2g==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-menu-item": { + "version": "1.8.0-rc.1", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.8.0-rc.1.tgz", + "integrity": "sha512-yccczOwXnODykEgILX/wrg+D3i06L2iAEg8uetFp+NQgMPgLz0SIVyJioNHiGkWnNlvwG/wfNOPT5PTY4LrCQA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-loader-bar": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-expand": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-modal": { + "version": "1.8.0-rc.3", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.8.0-rc.3.tgz", + "integrity": "sha512-QFkGXLweUXzR7KveCNJybaqNIMGbOmb8oP0QnhK0g73yccVBozxjMqdv1Mzl/h17VpCNtNkP+P2pNXNEe8TPoQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-pagination": { + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.8.0-rc.2.tgz", + "integrity": "sha512-T4vw2M5EJliqwy8YI03eA7pg+gcym9fyeO95eGQvriUV6/OB60CrzjEQ2tXREkVQq1oW3RIBEUEikUgRktMpwA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-button-group": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-popover": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.8.0-rc.0.tgz", + "integrity": "sha512-cCeDHzwz67ugMJ4tg56dksHvsG1Zye3KlLTROHFt4qeOpnNcGuA8WDQTTxC7KyzGlxEkVWUkpHT1HxLP60FCFg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-popover-container": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover-container/-/uui-popover-container-1.8.0-rc.0.tgz", + "integrity": "sha512-ErPEkvBvg3AhJnFXn8U32SZG+Tyfq3EyZxEhCwPgv4S7MajOrjz08SLN/2khSqLnqWw5dihRYcBTxcLtw4549g==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-progress-bar": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.8.0-rc.0.tgz", + "integrity": "sha512-OJI7g8jWB2gT++faIjoyGDLGjfjzTXGg4lfvTt5zNGI8JgEUf1CY0j4C3ANoh+cXMwvxiURRGOX/UmmwZzN/uQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-radio": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.8.0-rc.0.tgz", + "integrity": "sha512-lIjFN9ykLOaxcE0aHsO4HJ42X6uqX3L7S8juk8BVHKY2WiocYdW5EXKQ3qMjEkjx1rbhTrr/Ok2Pu7L8YeohJA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-range-slider": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.8.0-rc.0.tgz", + "integrity": "sha512-NuIOyT4F6pWweZj7VSRFrGnxijGayAIa3BhO5+stsw+Cz1EmESgTgV175buVRRhoqMGOAhky1EGnKkD9YYQ0hg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-ref": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.8.0-rc.0.tgz", + "integrity": "sha512-dxf4h5lfpZYpqANRvVD1eR4LrLOqut2oI8O0gLoUG/crObaU0Yta53T4xTVl2aAL7Wjm4cYkj9iQMd/9MJdo1g==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-ref-list": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.8.0-rc.0.tgz", + "integrity": "sha512-vdS3OMNX+r1akhUtuFfW2WfWsDflR7kA9QbVy2R0twvxE2JD5xttXlBybtqGljguks0nBuvUrEgcU3s014mPKQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-ref-node": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.8.0-rc.0.tgz", + "integrity": "sha512-bYoL7u8AixbcA1JRfRJ/l5SfEj0sq9jF8pJzILP5wLpphwthZU8PqUC9jqgvo6RZSOVmtDcVqDsLKpG1t/vT7g==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-ref": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-ref-node-data-type": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.8.0-rc.0.tgz", + "integrity": "sha512-zZk1y8aJBcI+jx6JvqxQc9cuWU2cSSIRcfQeM2HGVriyUBNX5oz2dgfkV6hWJK5Ndc/o6ZrXkWL0CT9X16OKxQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-ref-node-document-type": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.8.0-rc.0.tgz", + "integrity": "sha512-tEBYvuS7XkuRoEMqgJLnMo2BIifivHOrQlyZOyoA4EQsbkQsLPNIYkn+tWDcW/qRK5GSDQGHjRPza0o3E281zA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-ref-node-form": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.8.0-rc.0.tgz", + "integrity": "sha512-Ua25ZReynmdPqEvF0Sx4JClvWn0i2Y1bTo7KE45zm7M30jzhBjVt1LpAayy7mNK84VJY9lEt1vSt5B3rkug7oA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-ref-node-member": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.8.0-rc.0.tgz", + "integrity": "sha512-6gW4G+kvGenCohf0vzd1heUAX2hI6ZmlSfLttdDGggETChUcYQ91sFDe/8r0pOIPGgE6r46B1WgGmFXNMFxMEA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-ref-node-package": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.8.0-rc.0.tgz", + "integrity": "sha512-aSY1MMoNhZI+firF/UrvXrbR3JSNiOtHtrTDMreZTr85wzC82k6gRXmlz+1xvCKooduab3/e/gM+1yPoha85Ng==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-ref-node-user": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.8.0-rc.0.tgz", + "integrity": "sha512-0o6eyHFq2WHiEUaE1FgtVxavHLEwuAByYYesnzx4b2zwO1IHVZEjuaSp5nOJ6vyUdq1zK5TZZJa2LvWIT2uMNQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-ref-node": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-scroll-container": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.8.0-rc.0.tgz", + "integrity": "sha512-zrq/m7x/4gU8eIZYaIe6ED755sQJTsZGCi3IVUjfjFTnqQs5C4vtXczYcefALgYOXHIzatLxyOfF4nilOvpu1Q==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-select": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.8.0-rc.0.tgz", + "integrity": "sha512-Lh4RTjBll7eU/ptCllBWd6XiCEgLNw+rqXwCL4bzEdHLaiZDVaMs9SUWJW8L1eAQcna7aPNewntIrmIv+Z5r0w==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-slider": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.8.0-rc.0.tgz", + "integrity": "sha512-y1tiqp4pGTUReatXkXJcC5TQLQFEiaG9sSxTAbMlKoAgkNuZjM1xhOcJ3mDHqiqaWWznjCFRDlXN62Os8dpdcw==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-symbol-expand": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.8.0-rc.0.tgz", + "integrity": "sha512-rGvYaWeSArxubTf6m1S0Xgt4nLDPT0NOJzWgfI2+LqwpSoanH35Mb9+qXror2BLvog1jXfxwTZz1krqwSM3FwQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-symbol-file": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.8.0-rc.0.tgz", + "integrity": "sha512-urGF7kWtxXxMqbFJkACDs7dPk3o9KfYgLrRSCqUYE8qrz98n0R31BZ9KzrtCma+a2uI17zvFyIuRYd3xvwCilg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-symbol-file-dropzone": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.8.0-rc.0.tgz", + "integrity": "sha512-zWwx1jTQ3Ka4HoZ24EaHyJH3I0ez/qALf8qo5r5lLy4vn3UplunGKcNVFfOUsx6H19GlR4rDuPILIqdXJ4C/BQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-symbol-file-thumbnail": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.8.0-rc.0.tgz", + "integrity": "sha512-KV0gVKXFkYtJaOgwcma1jNBHMXT/xwDSuio4uamwV9GkdvjS1kFQyAMtXqBArWFisuifcfMcnPyZYxxeKx/CfQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-symbol-folder": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.8.0-rc.0.tgz", + "integrity": "sha512-orMaoQIfbhF+gXS5FjW9mujP71GiuePQr/rCNLGWeSJntqudxRp8bjNrcop2kAUoqzK8fAAvaBM7uZTDxVxU5g==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-symbol-lock": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.8.0-rc.0.tgz", + "integrity": "sha512-IJsTvHRPmG0OHnCgRQD69O7eUTDF8s/sY41uMiO9Mhhwf+CpE5R/LUJkMHvMZMCRkwMrSPCsq9cjCMNpalGepQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-symbol-more": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.8.0-rc.0.tgz", + "integrity": "sha512-ELJpdd5XpzYYMh+ZxlESQhZkvH711UoCgOgP4e5ftU8suWUs1Jb34F/7GzppKkMbSKZlfGw7nCx3pz5n3C5ANg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-symbol-sort": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.8.0-rc.0.tgz", + "integrity": "sha512-wH6Qyck706HK36mM0d+B1EWs17bM2Qv/V+DybKu/8DD+QNptOnuSzGkcCbRAV6lo36A3t7/NEru2xxvavBjUcw==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-table": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.8.0-rc.0.tgz", + "integrity": "sha512-TbDlh3qdZDsksjFw18e3emfHeGw8tAApPcPXK78WIN7LNDlKiHDHClan0J/Ul+QLZD4rUDteHJ5C1okYb/jboA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-tabs": { + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.8.0-rc.2.tgz", + "integrity": "sha512-MLtDabiXsOEqOxfgEuqU3ji1XTgY9ABbhqOHC23cFaaGBwlqAbUyi9hAMJhfso406vkQa/9t9A7yK8qpMqKdrA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-popover-container": "1.8.0-rc.0", + "@umbraco-ui/uui-symbol-more": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-tag": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.8.0-rc.0.tgz", + "integrity": "sha512-3opqus5jf4Ou8JNnFOZTl64rRD6n6qffKrPn+mEHTMkUhGQ5/wTKvdfWg4G0lD60aEMzKd7L6rojZydPDLEwFA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-textarea": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.8.0-rc.0.tgz", + "integrity": "sha512-EYOzu5E6BEqacLNoMxYPhFwbjK5xRExI47drDV+LzfyUe3hgFLUCZkIA/Z35vSFN8+HyguT7aaCfpzHhoSbFwA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-toast-notification": { + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.8.0-rc.2.tgz", + "integrity": "sha512-ICvxWZVuDO1X/f1udYgtY1prHYbj26g3ZecKq2V2FVs9Ej5kYNIWU1nVGj6tWkdyKGnVPjoLfYmq/W8i9BJb9g==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-button": "1.8.0-rc.2", + "@umbraco-ui/uui-css": "1.8.0-rc.0", + "@umbraco-ui/uui-icon": "1.8.0-rc.0", + "@umbraco-ui/uui-icon-registry-essential": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-toast-notification-container": { + "version": "1.8.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.8.0-rc.2.tgz", + "integrity": "sha512-iQ1xDQBgKrvTtCAUsT/3DJayCNVPWb+T9B5V+MyfuHnV9qOnmPtchs7l9r8cFwabOO5ZpxMke/tltsgMawwajQ==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-toast-notification": "1.8.0-rc.2" + } + }, + "node_modules/@umbraco-ui/uui-toast-notification-layout": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.8.0-rc.0.tgz", + "integrity": "sha512-ouQ1DlBlf0nkZZEsVIe+8Nz6mca1fjyyi0iypzDvwJq+K6tWm64FuxeqPpwp7M4jkNkcgDPOJqaONtPHQJdLKA==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-css": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-toggle": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.8.0-rc.0.tgz", + "integrity": "sha512-OytTeUPk9X3H4w3vWo1JLG2WK2npoXOUBBKft4WwtN+hUoX9/KquxBrz0qkxdO/jQ4LpSRJopS9SqjNg5mqVug==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0", + "@umbraco-ui/uui-boolean-input": "1.8.0-rc.0" + } + }, + "node_modules/@umbraco-ui/uui-visually-hidden": { + "version": "1.8.0-rc.0", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-visually-hidden/-/uui-visually-hidden-1.8.0-rc.0.tgz", + "integrity": "sha512-ZawyaL4DJsv0e7pyxiJWB5ogCxkn0mrzMimbajp6ZDDQMvAJDiA/I14hcaBVOudzZyTAzNK5xJlbB3ft2TwFdg==", + "dev": true, + "peer": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.8.0-rc.0" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/c12": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-1.10.0.tgz", + "integrity": "sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==", + "dev": true, + "dependencies": { + "chokidar": "^3.6.0", + "confbox": "^0.1.3", + "defu": "^6.1.4", + "dotenv": "^16.4.5", + "giget": "^1.2.1", + "jiti": "^1.21.0", + "mlly": "^1.6.1", + "ohash": "^1.1.3", + "pathe": "^1.1.2", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.0.3", + "rc9": "^2.1.1" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dev": true, + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "peer": true + }, + "node_modules/commander": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", + "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "dev": true + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true + }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", + "dev": true + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dompurify": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.3.tgz", + "integrity": "sha512-5sOWYSNPaxz6o2MUPvtyxTTqR4D3L77pr5rUQoWgD5ROQtVIZQgJkXbo1DLlK3vj11YGw5+LnF4SYti4gZmwng==", + "dev": true, + "peer": true + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/element-internals-polyfill": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/element-internals-polyfill/-/element-internals-polyfill-1.3.11.tgz", + "integrity": "sha512-SQLQNVY4wMdpnP/F/HtalJbpEenQd46Avtjm5hvUdeTs3QU0zHFNX5/AmtQIPPcfzePb0ipCkQGY4GwYJIhLJA==", + "dev": true, + "peer": true + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz", + "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==", + "dev": true, + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.3", + "nypm": "^0.3.8", + "ohash": "^1.1.3", + "pathe": "^1.1.2", + "tar": "^6.2.0" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/lit": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.3.tgz", + "integrity": "sha512-l4slfspEsnCcHVRTvaP7YnkTZEZggNFywLEIhQaGhYDczG+tu/vlgm/KaWIEjIp+ZyV20r2JnZctMb8LeLCG7Q==", + "dependencies": { + "@lit/reactive-element": "^2.0.4", + "lit-element": "^4.0.4", + "lit-html": "^3.1.2" + } + }, + "node_modules/lit-element": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.5.tgz", + "integrity": "sha512-iTWskWZEtn9SyEf4aBG6rKT8GABZMrTWop1+jopsEOgEcugcXJGKuX5bEbkq9qfzY+XB4MAgCaSPwnNpdsNQ3Q==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.1.2" + } + }, + "node_modules/lit-html": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.3.tgz", + "integrity": "sha512-FwIbqDD8O/8lM4vUZ4KvQZjPPNx7V1VhT7vmRB8RBAO0AU6wuTVdoXiu2CivVjEGdugvcbPNBLtPE1y0ifplHA==", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "node_modules/marked": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", + "dev": true, + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.0.tgz", + "integrity": "sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.0", + "ufo": "^1.5.3" + } + }, + "node_modules/monaco-editor": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.46.0.tgz", + "integrity": "sha512-ADwtLIIww+9FKybWscd7OCfm9odsFYHImBRI1v9AviGce55QY8raT+9ihH8jX/E/e6QVSGM+pKj4jSUSRmALNQ==", + "dev": true, + "peer": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-fetch-native": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.8.tgz", + "integrity": "sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==", + "dev": true, + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "execa": "^8.0.1", + "pathe": "^1.1.2", + "ufo": "^1.4.0" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/ohash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", + "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", + "dev": true + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", + "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", + "dev": true, + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.0", + "pathe": "^1.1.2" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "dev": true, + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rollup": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.17.2", + "@rollup/rollup-android-arm64": "4.17.2", + "@rollup/rollup-darwin-arm64": "4.17.2", + "@rollup/rollup-darwin-x64": "4.17.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", + "@rollup/rollup-linux-arm-musleabihf": "4.17.2", + "@rollup/rollup-linux-arm64-gnu": "4.17.2", + "@rollup/rollup-linux-arm64-musl": "4.17.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", + "@rollup/rollup-linux-riscv64-gnu": "4.17.2", + "@rollup/rollup-linux-s390x-gnu": "4.17.2", + "@rollup/rollup-linux-x64-gnu": "4.17.2", + "@rollup/rollup-linux-x64-musl": "4.17.2", + "@rollup/rollup-win32-arm64-msvc": "4.17.2", + "@rollup/rollup-win32-ia32-msvc": "4.17.2", + "@rollup/rollup-win32-x64-msvc": "4.17.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tinymce": { + "version": "6.8.3", + "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-6.8.3.tgz", + "integrity": "sha512-3fCHKAeqT+xNwBVESf6iDbDV0VNwZNmfrkx9c/6Gz5iB8piMfaO6s7FvoiTrj1hf1gVbfyLTnz1DooI6DhgINQ==", + "dev": true, + "peer": true + }, + "node_modules/tinymce-i18n": { + "version": "24.5.8", + "resolved": "https://registry.npmjs.org/tinymce-i18n/-/tinymce-i18n-24.5.8.tgz", + "integrity": "sha512-wNWJl6c7GRdUizQVux34jRSc0rEvcClj0sNO9MsY9pNXem+N7cSLaarFTPIryNpeXcLKJIxYi/IMCI6E+rFbGA==", + "dev": true, + "peer": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true, + "peer": true + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vite": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "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 + } + } +} diff --git a/Our.Umbraco.TheDashboard/Client/package.json b/Our.Umbraco.TheDashboard/Client/package.json new file mode 100644 index 0000000..390f3c8 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/package.json @@ -0,0 +1,22 @@ +{ + "name": "the-dashboard-umbraco", + "private": true, + "version": "14.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build --emptyOutDir", + "watch": "tsc && vite build --watch", + "generate:api": "openapi-ts", + "preview": "vite preview" + }, + "dependencies": { + "lit": "^3.1.2" + }, + "devDependencies": { + "@umbraco-cms/backoffice": "^14.0.0-rc3", + "@hey-api/openapi-ts": "^0.45.1", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } +} diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiError.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiError.ts new file mode 100644 index 0000000..36675d2 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiError.ts @@ -0,0 +1,21 @@ +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; + +export class ApiError extends Error { + public readonly url: string; + public readonly status: number; + public readonly statusText: string; + public readonly body: unknown; + public readonly request: ApiRequestOptions; + + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + super(message); + + this.name = 'ApiError'; + this.url = response.url; + this.status = response.status; + this.statusText = response.statusText; + this.body = response.body; + this.request = request; + } +} \ No newline at end of file diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiRequestOptions.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiRequestOptions.ts new file mode 100644 index 0000000..8f8d4d1 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiRequestOptions.ts @@ -0,0 +1,13 @@ +export type ApiRequestOptions = { + readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; + readonly url: string; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: any; + readonly mediaType?: string; + readonly responseHeader?: string; + readonly errors?: Record; +}; \ No newline at end of file diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiResult.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiResult.ts new file mode 100644 index 0000000..4c58e39 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/ApiResult.ts @@ -0,0 +1,7 @@ +export type ApiResult = { + readonly body: TData; + readonly ok: boolean; + readonly status: number; + readonly statusText: string; + readonly url: string; +}; \ No newline at end of file diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/CancelablePromise.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/CancelablePromise.ts new file mode 100644 index 0000000..ccc082e --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/CancelablePromise.ts @@ -0,0 +1,126 @@ +export class CancelError extends Error { + constructor(message: string) { + super(message); + this.name = 'CancelError'; + } + + public get isCancelled(): boolean { + return true; + } +} + +export interface OnCancel { + readonly isResolved: boolean; + readonly isRejected: boolean; + readonly isCancelled: boolean; + + (cancelHandler: () => void): void; +} + +export class CancelablePromise implements Promise { + private _isResolved: boolean; + private _isRejected: boolean; + private _isCancelled: boolean; + readonly cancelHandlers: (() => void)[]; + readonly promise: Promise; + private _resolve?: (value: T | PromiseLike) => void; + private _reject?: (reason?: unknown) => void; + + constructor( + executor: ( + resolve: (value: T | PromiseLike) => void, + reject: (reason?: unknown) => void, + 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; + + const onResolve = (value: T | PromiseLike): void => { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this._isResolved = true; + if (this._resolve) this._resolve(value); + }; + + const onReject = (reason?: unknown): void => { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this._isRejected = true; + if (this._reject) this._reject(reason); + }; + + const onCancel = (cancelHandler: () => void): void => { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this.cancelHandlers.push(cancelHandler); + }; + + Object.defineProperty(onCancel, 'isResolved', { + get: (): boolean => this._isResolved, + }); + + Object.defineProperty(onCancel, 'isRejected', { + get: (): boolean => this._isRejected, + }); + + Object.defineProperty(onCancel, '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: unknown) => TResult2 | PromiseLike) | null + ): Promise { + return this.promise.then(onFulfilled, onRejected); + } + + public catch( + onRejected?: ((reason: unknown) => TResult | PromiseLike) | null + ): Promise { + return this.promise.catch(onRejected); + } + + public finally(onFinally?: (() => void) | null): Promise { + return this.promise.finally(onFinally); + } + + public cancel(): void { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this._isCancelled = true; + if (this.cancelHandlers.length) { + try { + for (const cancelHandler of this.cancelHandlers) { + cancelHandler(); + } + } catch (error) { + console.warn('Cancellation threw an error', error); + return; + } + } + this.cancelHandlers.length = 0; + if (this._reject) this._reject(new CancelError('Request aborted')); + } + + public get isCancelled(): boolean { + return this._isCancelled; + } +} \ No newline at end of file diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/OpenAPI.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/OpenAPI.ts new file mode 100644 index 0000000..5abda5b --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/OpenAPI.ts @@ -0,0 +1,56 @@ +import type { ApiRequestOptions } from './ApiRequestOptions'; + +type Headers = Record; +type Middleware = (value: T) => T | Promise; +type Resolver = (options: ApiRequestOptions) => Promise; + +export class Interceptors { + _fns: Middleware[]; + + constructor() { + this._fns = []; + } + + eject(fn: Middleware) { + const index = this._fns.indexOf(fn); + if (index !== -1) { + this._fns = [...this._fns.slice(0, index), ...this._fns.slice(index + 1)]; + } + } + + use(fn: Middleware) { + this._fns = [...this._fns, fn]; + } +} + +export type OpenAPIConfig = { + BASE: string; + CREDENTIALS: 'include' | 'omit' | 'same-origin'; + ENCODE_PATH?: ((path: string) => string) | undefined; + HEADERS?: Headers | Resolver | undefined; + PASSWORD?: string | Resolver | undefined; + TOKEN?: string | Resolver | undefined; + USERNAME?: string | Resolver | undefined; + VERSION: string; + WITH_CREDENTIALS: boolean; + interceptors: { + request: Interceptors; + response: Interceptors; + }; +}; + +export const OpenAPI: OpenAPIConfig = { + BASE: '', + CREDENTIALS: 'include', + ENCODE_PATH: undefined, + HEADERS: undefined, + PASSWORD: undefined, + TOKEN: undefined, + USERNAME: undefined, + VERSION: 'Latest', + WITH_CREDENTIALS: false, + interceptors: { + request: new Interceptors(), + response: new Interceptors(), + }, +}; \ No newline at end of file diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/core/request.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/request.ts new file mode 100644 index 0000000..79d04d0 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/core/request.ts @@ -0,0 +1,341 @@ +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import { CancelablePromise } from './CancelablePromise'; +import type { OnCancel } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; + +export const isString = (value: unknown): value is string => { + return typeof value === 'string'; +}; + +export const isStringWithValue = (value: unknown): value is string => { + return isString(value) && value !== ''; +}; + +export const isBlob = (value: any): value is Blob => { + return value instanceof Blob; +}; + +export const isFormData = (value: unknown): value is FormData => { + return value instanceof FormData; +}; + +export const base64 = (str: string): string => { + try { + return btoa(str); + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString('base64'); + } +}; + +export const getQueryString = (params: Record): string => { + const qs: string[] = []; + + const append = (key: string, value: unknown) => { + qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); + }; + + const encodePair = (key: string, value: unknown) => { + if (value === undefined || value === null) { + return; + } + + if (value instanceof Date) { + append(key, value.toISOString()); + } else if (Array.isArray(value)) { + value.forEach(v => encodePair(key, v)); + } else if (typeof value === 'object') { + Object.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v)); + } else { + append(key, value); + } + }; + + Object.entries(params).forEach(([key, value]) => encodePair(key, value)); + + return qs.length ? `?${qs.join('&')}` : ''; +}; + +const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { + const encoder = config.ENCODE_PATH || encodeURI; + + const path = options.url + .replace('{api-version}', config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])); + } + return substring; + }); + + const url = config.BASE + path; + return options.query ? url + getQueryString(options.query) : url; +}; + +export const getFormData = (options: ApiRequestOptions): FormData | undefined => { + if (options.formData) { + const formData = new FormData(); + + const process = (key: string, value: unknown) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value); + } else { + formData.append(key, JSON.stringify(value)); + } + }; + + Object.entries(options.formData) + .filter(([, value]) => value !== undefined && value !== null) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach(v => process(key, v)); + } else { + process(key, value); + } + }); + + return formData; + } + return undefined; +}; + +type Resolver = (options: ApiRequestOptions) => Promise; + +export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { + if (typeof resolver === 'function') { + return (resolver as Resolver)(options); + } + return resolver; +}; + +export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { + const [token, username, password, additionalHeaders] = await Promise.all([ + resolve(options, config.TOKEN), + resolve(options, config.USERNAME), + resolve(options, config.PASSWORD), + resolve(options, config.HEADERS), + ]); + + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + }) + .filter(([, value]) => value !== undefined && value !== null) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record); + + if (isStringWithValue(token)) { + headers['Authorization'] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers['Authorization'] = `Basic ${credentials}`; + } + + if (options.body !== undefined) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return new Headers(headers); +}; + +export const getRequestBody = (options: ApiRequestOptions): unknown => { + if (options.body !== undefined) { + if (options.mediaType?.includes('application/json') || options.mediaType?.includes('+json')) { + return JSON.stringify(options.body); + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { + return options.body; + } else { + return JSON.stringify(options.body); + } + } + return undefined; +}; + +export const sendRequest = async ( + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Headers, + onCancel: OnCancel +): Promise => { + const controller = new AbortController(); + + let request: RequestInit = { + headers, + body: body ?? formData, + method: options.method, + signal: controller.signal, + }; + + if (config.WITH_CREDENTIALS) { + request.credentials = config.CREDENTIALS; + } + + for (const fn of config.interceptors.request._fns) { + request = await fn(request); + } + + onCancel(() => controller.abort()); + + return await fetch(url, request); +}; + +export const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => { + if (responseHeader) { + const content = response.headers.get(responseHeader); + if (isString(content)) { + return content; + } + } + return undefined; +}; + +export const getResponseBody = async (response: Response): Promise => { + if (response.status !== 204) { + try { + const contentType = response.headers.get('Content-Type'); + if (contentType) { + const binaryTypes = ['application/octet-stream', 'application/pdf', 'application/zip', 'audio/', 'image/', 'video/']; + if (contentType.includes('application/json') || contentType.includes('+json')) { + return await response.json(); + } else if (binaryTypes.some(type => contentType.includes(type))) { + return await response.blob(); + } else if (contentType.includes('multipart/form-data')) { + return await response.formData(); + } else if (contentType.includes('text/')) { + return await response.text(); + } + } + } catch (error) { + console.error(error); + } + } + return undefined; +}; + +export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { + const errors: Record = { + 400: 'Bad Request', + 401: 'Unauthorized', + 402: 'Payment Required', + 403: 'Forbidden', + 404: 'Not Found', + 405: 'Method Not Allowed', + 406: 'Not Acceptable', + 407: 'Proxy Authentication Required', + 408: 'Request Timeout', + 409: 'Conflict', + 410: 'Gone', + 411: 'Length Required', + 412: 'Precondition Failed', + 413: 'Payload Too Large', + 414: 'URI Too Long', + 415: 'Unsupported Media Type', + 416: 'Range Not Satisfiable', + 417: 'Expectation Failed', + 418: 'Im a teapot', + 421: 'Misdirected Request', + 422: 'Unprocessable Content', + 423: 'Locked', + 424: 'Failed Dependency', + 425: 'Too Early', + 426: 'Upgrade Required', + 428: 'Precondition Required', + 429: 'Too Many Requests', + 431: 'Request Header Fields Too Large', + 451: 'Unavailable For Legal Reasons', + 500: 'Internal Server Error', + 501: 'Not Implemented', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + 504: 'Gateway Timeout', + 505: 'HTTP Version Not Supported', + 506: 'Variant Also Negotiates', + 507: 'Insufficient Storage', + 508: 'Loop Detected', + 510: 'Not Extended', + 511: 'Network Authentication Required', + ...options.errors, + } + + const error = errors[result.status]; + if (error) { + throw new ApiError(options, result, error); + } + + if (!result.ok) { + const errorStatus = result.status ?? 'unknown'; + const errorStatusText = result.statusText ?? 'unknown'; + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2); + } catch (e) { + return undefined; + } + })(); + + throw new ApiError(options, result, + `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` + ); + } +}; + +/** + * Request method + * @param config The OpenAPI configuration object + * @param options The request options from the service + * @returns CancelablePromise + * @throws ApiError + */ +export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options); + + if (!onCancel.isCancelled) { + let response = await sendRequest(config, options, url, body, formData, headers, onCancel); + + for (const fn of config.interceptors.response._fns) { + response = await fn(response); + } + + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; \ No newline at end of file diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/index.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/index.ts new file mode 100644 index 0000000..3e1f0b3 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/index.ts @@ -0,0 +1,6 @@ +// This file is auto-generated by @hey-api/openapi-ts +export { ApiError } from './core/ApiError'; +export { CancelablePromise, CancelError } from './core/CancelablePromise'; +export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI'; +export * from './services.gen'; +export * from './types.gen'; \ No newline at end of file diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/services.gen.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/services.gen.ts new file mode 100644 index 0000000..4782113 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/services.gen.ts @@ -0,0 +1,42 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import type { CancelablePromise } from './core/CancelablePromise'; +import { OpenAPI } from './core/OpenAPI'; +import { request as __request } from './core/request'; +import type { GetAllRecentActivitiesResponse, GetCountersResponse, GetPendingResponse } from './types.gen'; + +export class TheDashboardResource { + /** + * @returns unknown Success + * @throws ApiError + */ + public static getAllRecentActivities(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/api/the-dashboard/dashboard/get-all-recent-activities' + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getCounters(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/api/the-dashboard/dashboard/get-counters' + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getPending(): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/api/the-dashboard/dashboard/get-pending' + }); + } + +} \ No newline at end of file diff --git a/Our.Umbraco.TheDashboard/Client/src/backend-api/types.gen.ts b/Our.Umbraco.TheDashboard/Client/src/backend-api/types.gen.ts new file mode 100644 index 0000000..351bd8a --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/backend-api/types.gen.ts @@ -0,0 +1,82 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type CountersFrontendModel = { + counters: Array<(DashboardCounterModel)>; +}; + +export type DashboardCounterModel = { + text: string; + count: number; + /** + * Used to provide a click url for a counter, ie linking to a content item or any given URL + */ + clickUrl: string; + /** + * Provides a way to "click" on a element in the backoffice UI by providing a CSS selector. Ie. *[data-element=tab-contentIntro] > a to show the intro dashboard. + */ + clickElement: string; + style: string; +}; + +export type PendingContentNotScheduledFrontendModel = { + count: number; + items: Array<(RecentActivityFrontendModel)>; +}; + +export type RecentActivitiesFrontendModel = { + allItems: Array<(RecentActivityFrontendModel)>; + yourItems: Array<(RecentActivityFrontendModel)>; +}; + +export type RecentActivityFrontendModel = { + activityType: string; + nodeName: string; + nodeId: number; + user: UserFrontendModel; + datestamp: string; + scheduledPublishDate?: string | null; +}; + +export type UserFrontendModel = { + name: string; + avatar: Array<(string)>; +}; + +export type GetAllRecentActivitiesResponse = RecentActivitiesFrontendModel; + +export type GetCountersResponse = CountersFrontendModel; + +export type GetPendingResponse = PendingContentNotScheduledFrontendModel; + +export type $OpenApiTs = { + '/umbraco/api/the-dashboard/dashboard/get-all-recent-activities': { + get: { + res: { + /** + * Success + */ + 200: RecentActivitiesFrontendModel; + }; + }; + }; + '/umbraco/api/the-dashboard/dashboard/get-counters': { + get: { + res: { + /** + * Success + */ + 200: CountersFrontendModel; + }; + }; + }; + '/umbraco/api/the-dashboard/dashboard/get-pending': { + get: { + res: { + /** + * Success + */ + 200: PendingContentNotScheduledFrontendModel; + }; + }; + }; +}; \ No newline at end of file diff --git a/Our.Umbraco.TheDashboard/Client/src/dashboard/manifest.ts b/Our.Umbraco.TheDashboard/Client/src/dashboard/manifest.ts new file mode 100644 index 0000000..acc3243 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/dashboard/manifest.ts @@ -0,0 +1,22 @@ + +const dashboard = { + type: 'dashboard', + alias: 'TheDashboard.Dashboard', + name: 'The Dashboard Dashboard', + weight: 10000, + element : ()=> import('./the-dashboard.element.js'), + meta: { + label: '#theDashboard_tabLabel', + pathname: 'dashboard' + }, + conditions : [ + { + alias : "Umb.Condition.SectionAlias", + match : "Umb.Section.Content" + } + ] +}; + +export const manifests = [ + dashboard +] diff --git a/Our.Umbraco.TheDashboard/Client/src/dashboard/the-dashboard.element.ts b/Our.Umbraco.TheDashboard/Client/src/dashboard/the-dashboard.element.ts new file mode 100644 index 0000000..60d77d0 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/dashboard/the-dashboard.element.ts @@ -0,0 +1,72 @@ +import { LitElement,css,html,customElement} from '@umbraco-cms/backoffice/external/lit';; +import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import '@umbraco-cms/backoffice/components'; +import { TheDashboardResource } from '../backend-api'; + +// const DateTimeOptions: Intl.DateTimeFormatOptions = { +// //weekday: '', +// year: 'numeric', +// month: 'numeric', +// day: 'numeric', +// hour : '2-digit', +// minute : '2-digit', +// hourCycle : 'h24' +// }; + +/** +* the-dashboard-dashboard description +* @element the-dashboard-dashboard +*/ +@customElement('the-dashboard-dashboard') +export class TheDashboardDashboardElement extends UmbElementMixin(LitElement) { + + connectedCallback(): void { + super.connectedCallback(); + + TheDashboardResource.getAllRecentActivities().then((res)=>{ + console.log('recent',res); + }); + TheDashboardResource.getPending().then((res)=>{ + console.log('pending',res); + }); + TheDashboardResource.getCounters().then((res)=>{ + console.log('counter',res); + }); + + } + + render() { + + + return html` +
+ + + +
+ + ` + } + + static styles = [UmbTextStyles, css` + + * { + box-sizing:border-box; + } + :host > div { + padding:20px; + display:flex; + gap:20px; + } + + `] +} + +export default TheDashboardDashboardElement; + +declare global { + interface HTMLElementTagNameMap { + 'the-dashboard-dashboard': TheDashboardDashboardElement; + } +} diff --git a/Our.Umbraco.TheDashboard/Client/src/entry.ts b/Our.Umbraco.TheDashboard/Client/src/entry.ts new file mode 100644 index 0000000..55bf422 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/entry.ts @@ -0,0 +1,21 @@ +import type { UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api'; +import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; +import { registerManifest } from './manifest.js'; +import { OpenAPI } from './backend-api/index.js'; + +export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { + + host.consumeContext(UMB_AUTH_CONTEXT,(auth)=> { + + const config = auth.getOpenApiConfiguration(); + + OpenAPI.BASE = config.base; + OpenAPI.WITH_CREDENTIALS = config.withCredentials; + OpenAPI.CREDENTIALS = config.credentials; + OpenAPI.TOKEN = config.token; + + }); + + registerManifest(extensionRegistry); + +}; diff --git a/Our.Umbraco.TheDashboard/Client/src/localization/en-us.ts b/Our.Umbraco.TheDashboard/Client/src/localization/en-us.ts new file mode 100644 index 0000000..9fda1aa --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/localization/en-us.ts @@ -0,0 +1,40 @@ +import type { UmbLocalizationDictionary } from '@umbraco-cms/backoffice/localization-api'; + +export default { + theDashboard : { + tabLabel : 'Welcome', + + recentActivities : 'Recent activities', + recentActivitiesDescription : 'Shows recent activities from all users in the back office.', + unpublishedContent : 'Unpublished content', + unpublishedContentDescription : 'Shows unpublished content that has not been scheduled for publish.', + pendingContent : 'Pending content', + pendingContentDescription : 'Shows published content with changes that has not been scheduled for publishing.', + yourRecentActivity : 'Your recent activity', + yourRecentActivitiesDescription : 'Shows your own recent activities', + publishedContentNodes : 'Published content nodes', + nodesInRecycleBin : 'Nodes in recycle bin', + membersOnWebsite : 'Members on website', + newMembersLastWeek : 'New members last week', + butNotPublishedOrScheduled : 'but not published or scheduled', + butDidNotPublish : 'but did not publish', + forPublishingAt : 'for publishing at', + to : 'to', + saved : 'saved', + moved : 'moved', + unpublished : 'unpublished', + savedBy : 'saved by', + savedAndScheduled : 'saved and scheduled', + savedAndPublished : 'saved and published', + recycleBin : 'recycle bin', + rolledBack : 'rolled back', + + Saved : 'Saved', + Moved : 'Moved', + Unpublished : 'Unpublished', + SavedAndScheduled : 'Saved and scheduled', + SavedAndPublished : 'Saved and published', + RolledBack : 'Rolled back', + + } +} as UmbLocalizationDictionary diff --git a/Our.Umbraco.TheDashboard/Client/src/localization/sv-se.ts b/Our.Umbraco.TheDashboard/Client/src/localization/sv-se.ts new file mode 100644 index 0000000..309e91b --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/localization/sv-se.ts @@ -0,0 +1,40 @@ +import type { UmbLocalizationDictionary } from '@umbraco-cms/backoffice/localization-api'; + +export default { + theDashboard : { + tabLabel : '', + + recentActivities : '', + recentActivitiesDescription : '', + unpublishedContent : '', + unpublishedContentDescription : '', + pendingContent : '', + pendingContentDescription : '', + yourRecentActivity : '', + yourRecentActivitiesDescription : '', + publishedContentNodes : '', + nodesInRecycleBin : '', + membersOnWebsite : '', + newMembersLastWeek : '', + butNotPublishedOrScheduled : '', + butDidNotPublish : '', + forPublishingAt : '', + to : '', + saved : '', + moved : '', + unpublished : '', + savedBy : '', + savedAndScheduled : '', + savedAndPublished : '', + recycleBin : '', + rolledBack : '', + + Saved : '', + Moved : '', + Unpublished : '', + SavedAndScheduled : '', + SavedAndPublished : '', + RolledBack : '', + + } +} as UmbLocalizationDictionary diff --git a/Our.Umbraco.TheDashboard/Client/src/manifest.ts b/Our.Umbraco.TheDashboard/Client/src/manifest.ts new file mode 100644 index 0000000..9e866db --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/manifest.ts @@ -0,0 +1,33 @@ +import type { ManifestLocalization, UmbBackofficeExtensionRegistry } from "@umbraco-cms/backoffice/extension-registry"; +import { manifests as dashboardManifests } from "./dashboard/manifest.js"; + +const translationManifests : Array = [ + { + type: "localization", + alias: "TheDasboard.Localize.En_US", + name: "English (United States)", + meta: { + "culture": "en-us" + }, + js : ()=> import('./localization/en-us.js') + }, + { + type: "localization", + alias: "TheDasboard.Localize.Sv_SE", + name: "Swedish (Sweden)", + meta: { + "culture": "sv-se" + }, + js : ()=> import('./localization/sv-se.js') + }, +] + +export function registerManifest(registry : UmbBackofficeExtensionRegistry) { + + console.log('register extensions'); + + registry.registerMany([ + ...dashboardManifests, + ...translationManifests + ]); +} diff --git a/Our.Umbraco.TheDashboard/Client/src/vite-env.d.ts b/Our.Umbraco.TheDashboard/Client/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/Our.Umbraco.TheDashboard/Client/tsconfig.json b/Our.Umbraco.TheDashboard/Client/tsconfig.json new file mode 100644 index 0000000..69e31ac --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2020", + "experimentalDecorators": true, + "useDefineForClassFields": false, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/Our.Umbraco.TheDashboard/Client/vite.config.ts b/Our.Umbraco.TheDashboard/Client/vite.config.ts new file mode 100644 index 0000000..92f8151 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Client/vite.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from "vite"; + +export default defineConfig({ + build: { + lib: { + entry: "src/entry.ts", + formats: ["es"], + name : "TheDashboard.Umbraco" + }, + outDir: "../wwwroot/App_Plugins/Our.Umbraco.TheDashboard/dist", + sourcemap: true, + rollupOptions: { + external: [/^@umbraco/] + }, + } +}); diff --git a/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureCookieTractorApiSweggerGenOptions.cs b/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureCookieTractorApiSweggerGenOptions.cs new file mode 100644 index 0000000..30df7ee --- /dev/null +++ b/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureCookieTractorApiSweggerGenOptions.cs @@ -0,0 +1,8 @@ +namespace Our.Umbraco.TheDashboard.Controllers.OpenApi; + +public class TheDashboardApiConfiguration +{ + public const string ApiName = "the-dashboard"; + public const string ApiTitle = "TheDashboard"; + +} diff --git a/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureTheDashboardApiSwaggerGenOptions.cs b/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureTheDashboardApiSwaggerGenOptions.cs new file mode 100644 index 0000000..72fb4ed --- /dev/null +++ b/Our.Umbraco.TheDashboard/Controllers/OpenApi/ConfigureTheDashboardApiSwaggerGenOptions.cs @@ -0,0 +1,29 @@ +using System; +using System.IO; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace Our.Umbraco.TheDashboard.Controllers.OpenApi; + +public class ConfigureTheDashboardApiSwaggerGenOptions : IConfigureOptions +{ + public void Configure(SwaggerGenOptions swaggerGenOptions) + { + swaggerGenOptions.SwaggerDoc( + TheDashboardApiConfiguration.ApiName, + new OpenApiInfo + { + Title = TheDashboardApiConfiguration.ApiTitle, + Version = "Latest", + Description = $"Backoffice API for The Dashboard, for our internal use contracts might break at any time." + }); + + + swaggerGenOptions.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "Our.Umbraco.TheDashboard.xml")); + + swaggerGenOptions.CustomOperationIds(e => $"{e.ActionDescriptor.RouteValues["action"]}"); + + } +} diff --git a/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardRouteAttribute.cs b/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardRouteAttribute.cs new file mode 100644 index 0000000..854ed01 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardRouteAttribute.cs @@ -0,0 +1,12 @@ +using Microsoft.AspNetCore.Mvc; +using Umbraco.Cms.Core; + +namespace Our.Umbraco.TheDashboard.Controllers.OpenApi; + +public class TheDashboardRouteAttribute : RouteAttribute +{ + public TheDashboardRouteAttribute(string template) + : base($"[{Constants.Web.AttributeRouting.BackOfficeToken}]/api/the-dashboard/" + template.TrimStart('/')) + { + } +} diff --git a/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardSchemaIdHandler.cs b/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardSchemaIdHandler.cs new file mode 100644 index 0000000..c813758 --- /dev/null +++ b/Our.Umbraco.TheDashboard/Controllers/OpenApi/TheDashboardSchemaIdHandler.cs @@ -0,0 +1,17 @@ +using Umbraco.Cms.Api.Common.OpenApi; + +namespace Our.Umbraco.TheDashboard.Controllers.OpenApi; + +internal class TheDashboardSchemaIdHandler : SchemaIdHandler +{ + public override bool CanHandle(Type type) + { + if (type.Namespace?.StartsWith("Our.Umbraco.TheDashboard") is true) + return true; + + return false; + + } + + public override string Handle(Type type) => UmbracoSchemaId(type); +} diff --git a/Our.Umbraco.TheDashboard/Controllers/TheDasboardController.cs b/Our.Umbraco.TheDashboard/Controllers/TheDasboardController.cs index c3c2389..d27aaa5 100644 --- a/Our.Umbraco.TheDashboard/Controllers/TheDasboardController.cs +++ b/Our.Umbraco.TheDashboard/Controllers/TheDasboardController.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Net.Http; using Microsoft.AspNetCore.Mvc; @@ -13,134 +13,148 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Web.Common.Attributes; +using Microsoft.AspNetCore.Authorization; +using Our.Umbraco.TheDashboard.Controllers.OpenApi; +using Umbraco.Cms.Api.Common.Attributes; +using Umbraco.Cms.Api.Common.Filters; +using Umbraco.Cms.Core; +using Umbraco.Cms.Web.Common.Authorization; +using Microsoft.AspNetCore.Http; -namespace Our.Umbraco.TheDashboard.Controllers +namespace Our.Umbraco.TheDashboard.Controllers; + +internal static class EndpointCampaignConfiguration { - [IsBackOffice] - public class TheDashboardController : ControllerBase - { - private readonly AppCaches _appCaches; - private readonly IScopeProvider _scopeProvider; - private readonly ITheDashboardService _dashboardService; - private readonly DashboardCountersCollection _dashboardCountersCollection; - private readonly IUserService _userService; - private readonly IBackOfficeSecurity _security; - private readonly IEntityService _entityService; - private readonly IHttpClientFactory _httpClientFactory; - - public TheDashboardController(AppCaches appCaches, - IScopeProvider scopeProvider, - ITheDashboardService dashboardService, - DashboardCountersCollection dashboardCountersCollection, - IUserService userService, - IBackOfficeSecurity security, - IEntityService entityService, - IHttpClientFactory httpClientFactory - ) - { - _appCaches = appCaches; - _scopeProvider = scopeProvider; - _dashboardService = dashboardService; - _dashboardCountersCollection = dashboardCountersCollection; - _userService = userService; - _security = security; - _entityService = entityService; - _httpClientFactory = httpClientFactory; - } + public const string RouteSegment = "dashboard"; + public const string GroupName = "TheDashboard"; +} + +[ApiController] +[PluginController("TheDashboard")] +[Authorize(Policy = AuthorizationPolicies.BackOfficeAccess)] +[JsonOptionsName(Constants.JsonOptionsNames.BackOffice)] +[MapToApi(TheDashboardApiConfiguration.ApiName)] +[TheDashboardRoute(EndpointCampaignConfiguration.RouteSegment)] +[ApiExplorerSettings(GroupName = EndpointCampaignConfiguration.GroupName)] +public class TheDashboardController : ControllerBase +{ + private readonly AppCaches _appCaches; + private readonly IScopeProvider _scopeProvider; + private readonly ITheDashboardService _dashboardService; + private readonly DashboardCountersCollection _dashboardCountersCollection; + private readonly IUserService _userService; + private readonly IBackOfficeSecurity _security; + private readonly IEntityService _entityService; + private readonly IHttpClientFactory _httpClientFactory; + + public TheDashboardController(AppCaches appCaches, + IScopeProvider scopeProvider, + ITheDashboardService dashboardService, + DashboardCountersCollection dashboardCountersCollection, + IUserService userService, + IBackOfficeSecurity security, + IEntityService entityService, + IHttpClientFactory httpClientFactory + ) + { + _appCaches = appCaches; + _scopeProvider = scopeProvider; + _dashboardService = dashboardService; + _dashboardCountersCollection = dashboardCountersCollection; + _userService = userService; + _security = security; + _entityService = entityService; + _httpClientFactory = httpClientFactory; + } - [HttpGet] - public RecentActivitiesFrontendModel GetAllRecentActivities() - { + [HttpGet("get-all-recent-activities")] + [ProducesResponseType(typeof(RecentActivitiesFrontendModel), StatusCodes.Status200OK)] + public RecentActivitiesFrontendModel GetAllRecentActivities() + { - var model = new RecentActivitiesFrontendModel(); - model.AllItems = new List(); - model.YourItems = new List(); + var model = new RecentActivitiesFrontendModel(); + model.AllItems = new List(); + model.YourItems = new List(); - var allRecentDtos = _dashboardService.GetEntries(); + var allRecentDtos = _dashboardService.GetEntries(); - var accessService = new UserToNodeAccessHelper(_security.CurrentUser, _userService,_entityService,_appCaches, allRecentDtos); - var filteredDtos = allRecentDtos.Where(x => accessService.HasAccessTo(x)).ToList(); + var accessService = new UserToNodeAccessHelper(_security.CurrentUser, _userService,_entityService,_appCaches, allRecentDtos); + var filteredDtos = allRecentDtos.Where(x => accessService.HasAccessTo(x)).ToList(); - model.AllItems = CreateFrontendModelsFrom(filteredDtos); + model.AllItems = CreateFrontendModelsFrom(filteredDtos); - // filter to only my own - var filteredMyActivitiesDtos = filteredDtos.Where(x => x.UserId == _security.CurrentUser.Id).ToList(); - model.YourItems = CreateFrontendModelsFrom(filteredMyActivitiesDtos); + // filter to only my own + var filteredMyActivitiesDtos = filteredDtos.Where(x => x.UserId == _security.CurrentUser.Id).ToList(); + model.YourItems = CreateFrontendModelsFrom(filteredMyActivitiesDtos); - return model; - } + return model; + } - [HttpGet] - public PendingContentNotScheduledFrontendModel GetPending() - { - var model = new PendingContentNotScheduledFrontendModel(); - model.Items = new List(); + [HttpGet("get-pending")] + [ProducesResponseType(typeof(PendingContentNotScheduledFrontendModel), StatusCodes.Status200OK)] + public PendingContentNotScheduledFrontendModel GetPending() + { + var model = new PendingContentNotScheduledFrontendModel(); + model.Items = new List(); - var allRecentDtos = _dashboardService.GetPending(); + var allRecentDtos = _dashboardService.GetPending(); - var accessService = new UserToNodeAccessHelper(_security.CurrentUser, _userService,_entityService,_appCaches, allRecentDtos); - var filteredDtos = allRecentDtos.Where(x => accessService.HasAccessTo(x)).ToList(); + var accessService = new UserToNodeAccessHelper(_security.CurrentUser, _userService,_entityService,_appCaches, allRecentDtos); + var filteredDtos = allRecentDtos.Where(x => accessService.HasAccessTo(x)).ToList(); - model.Items = CreateFrontendModelsFrom(filteredDtos); - model.Count = model.Items.Count; - return model; - } + model.Items = CreateFrontendModelsFrom(filteredDtos); + model.Count = model.Items.Count; + return model; + } + [HttpGet("get-counters")] + [ProducesResponseType(typeof(CountersFrontendModel), StatusCodes.Status200OK)] + public CountersFrontendModel GetCounters() + { + var model = new CountersFrontendModel(); - private List CreateFrontendModelsFrom(List dtos) + using (var scope = _scopeProvider.CreateScope()) { - var maxCount = 10; - var mapper = new LogEntryToRecentActivityMapper(_appCaches,_httpClientFactory); - - // Should return a list of models containing unique items for the nodeId. - var list = new List(); - - for (int i = 0; i < dtos.Count; i++) + foreach (var counter in _dashboardCountersCollection) { - var dto = dtos[i]; - // If we already have a item in the list with the same nodeId this means that the latest activity - // for this nodeid already has been added. - if (!list.Any(x => x.NodeId == dto.NodeId)) - { - // try to create a view model, this will return null when the model is not of a valid type. - var vm = mapper.Map(dto); - if (vm != null) - { - list.Add(vm); - } - } - - if(list.Count >= maxCount) - return list; - + model.Counters.Add(counter.GetModel(scope)); } - - return list; - } - + return model; + } - public string GetMyRecentActivities() - { - return ""; - } + private List CreateFrontendModelsFrom(List dtos) + { + var maxCount = 10; + var mapper = new LogEntryToRecentActivityMapper(_appCaches, _httpClientFactory); - public CountersFrontendModel GetCounters() - { - var model = new CountersFrontendModel(); + // Should return a list of models containing unique items for the nodeId. + var list = new List(); - using (var scope = _scopeProvider.CreateScope()) + for (int i = 0; i < dtos.Count; i++) + { + var dto = dtos[i]; + // If we already have a item in the list with the same nodeId this means that the latest activity + // for this nodeid already has been added. + if (!list.Any(x => x.NodeId == dto.NodeId)) { - foreach (var counter in _dashboardCountersCollection) + // try to create a view model, this will return null when the model is not of a valid type. + var vm = mapper.Map(dto); + if (vm != null) { - model.Counters.Add(counter.GetModel(scope)); + list.Add(vm); } } - return model; + if (list.Count >= maxCount) + return list; + } + return list; + } -} \ No newline at end of file + +} diff --git a/Our.Umbraco.TheDashboard/Our.Umbraco.TheDashboard.csproj b/Our.Umbraco.TheDashboard/Our.Umbraco.TheDashboard.csproj index ae7789b..1137db1 100644 --- a/Our.Umbraco.TheDashboard/Our.Umbraco.TheDashboard.csproj +++ b/Our.Umbraco.TheDashboard/Our.Umbraco.TheDashboard.csproj @@ -1,31 +1,34 @@ - - - net8.0 - true - / - . - Our.Umbraco.TheDashboard - Our.Umbraco.TheDashboard - Content dashboard for Umbraco - The Dashboard for Umbraco - umbraco umbraco-marketplace dashboard activities plugin package - 14.0.0 - Markus Johansson - Copyright (c) Obviuse AB - Obviuse AB / Enkel Media Stockholm AB - https://github.com/enkelmedia/TheDashboard - https://github.com/enkelmedia/TheDashboard - git - README.md - MIT - + + + net8.0 + enable + enable + true + / + . + True + Our.Umbraco.TheDashboard + Our.Umbraco.TheDashboard + Content dashboard for Umbraco + The Dashboard for Umbraco + umbraco umbraco-marketplace dashboard activities plugin package + 14.0.0 + Markus Johansson + Copyright (c) Obviuse AB + Obviuse AB / Enkel Media Stockholm AB + https://github.com/enkelmedia/TheDashboard + https://github.com/enkelmedia/TheDashboard + git + README.md + MIT + - - - - + + + + - - - + + + diff --git a/Our.Umbraco.TheDashboard/TheDashboardComposer.cs b/Our.Umbraco.TheDashboard/TheDashboardComposer.cs index 718a3c9..918979c 100644 --- a/Our.Umbraco.TheDashboard/TheDashboardComposer.cs +++ b/Our.Umbraco.TheDashboard/TheDashboardComposer.cs @@ -1,10 +1,12 @@ -using Our.Umbraco.TheDashboard.Counters.Implement; +using Our.Umbraco.TheDashboard.Counters.Implement; using Our.Umbraco.TheDashboard.Extensions; using Our.Umbraco.TheDashboard.Services; using Umbraco.Cms.Core.Composing; using Umbraco.Cms.Core.DependencyInjection; using Microsoft.Extensions.DependencyInjection; +using Our.Umbraco.TheDashboard.Controllers.OpenApi; using Our.Umbraco.TheDashboard.Counters.Collections; +using Umbraco.Cms.Api.Common.OpenApi; namespace Our.Umbraco.TheDashboard { @@ -23,6 +25,14 @@ public void Compose(IUmbracoBuilder builder) // Just using this to make sure that it works and are used in the package builder.TheDashboardCounters().Append(); +#if DEBUG + // SWAGGER - Only use in debug build to avoid exposing in production messing up things in the core. + builder.Services.ConfigureOptions(); + builder.Services.AddSingleton(); +#endif + + } + } -} \ No newline at end of file +} diff --git a/Our.Umbraco.TheDashboard/wwwroot/App_Plugins/Our.Umbraco.TheDashboard/umbraco-package.json b/Our.Umbraco.TheDashboard/wwwroot/App_Plugins/Our.Umbraco.TheDashboard/umbraco-package.json new file mode 100644 index 0000000..326eeab --- /dev/null +++ b/Our.Umbraco.TheDashboard/wwwroot/App_Plugins/Our.Umbraco.TheDashboard/umbraco-package.json @@ -0,0 +1,14 @@ +{ + "$schema": "../../../../Our.Umbraco.TheDashboard.Testsite/umbraco-package-schema.json", + "name": "TheDashboard", + "version": "14.0.0", + "extensions": [ + { + "type": "entryPoint", + "alias": "TheDashboard.EntryPoint", + "name": "TheDashboard Entry Point", + "js": "/App_Plugins/Our.Umbraco.TheDashboard/dist/the-dashboard-umbraco.js", + "weight": 13000 + } + ] +}