From 36863a41c3dcdc1c23f0edd8e56ed79a3986fc42 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Fri, 22 Sep 2023 13:28:46 +0200 Subject: [PATCH 01/14] [WIP] Create Umbraco/Bellissima Package --- .../UmbracoPackageRcl/UmbracoPackage.csproj | 17 + templates/UmbracoPackageRcl/package-lock.json | 1705 +++++++++++++++++ templates/UmbracoPackageRcl/package.json | 19 + .../src/dashboard/my-welcome-dashboard.ts | 61 + .../src/property-editor/my-card.element.ts | 25 + .../property-editor/my-property-editor-ui.ts | 52 + templates/UmbracoPackageRcl/tsconfig.json | 24 + templates/UmbracoPackageRcl/vite.config.ts | 16 + .../wwwroot/umbraco-package.json | 27 +- 9 files changed, 1945 insertions(+), 1 deletion(-) create mode 100644 templates/UmbracoPackageRcl/package-lock.json create mode 100644 templates/UmbracoPackageRcl/package.json create mode 100644 templates/UmbracoPackageRcl/src/dashboard/my-welcome-dashboard.ts create mode 100644 templates/UmbracoPackageRcl/src/property-editor/my-card.element.ts create mode 100644 templates/UmbracoPackageRcl/src/property-editor/my-property-editor-ui.ts create mode 100644 templates/UmbracoPackageRcl/tsconfig.json create mode 100644 templates/UmbracoPackageRcl/vite.config.ts diff --git a/templates/UmbracoPackageRcl/UmbracoPackage.csproj b/templates/UmbracoPackageRcl/UmbracoPackage.csproj index 1cbdd209e505..b83faff2fafa 100644 --- a/templates/UmbracoPackageRcl/UmbracoPackage.csproj +++ b/templates/UmbracoPackageRcl/UmbracoPackage.csproj @@ -24,4 +24,21 @@ + + + + + + + + + + + + + + + + + diff --git a/templates/UmbracoPackageRcl/package-lock.json b/templates/UmbracoPackageRcl/package-lock.json new file mode 100644 index 000000000000..fea10c2a2efd --- /dev/null +++ b/templates/UmbracoPackageRcl/package-lock.json @@ -0,0 +1,1705 @@ +{ + "name": "umbraco-create-package-template", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "umbraco-create-package-template", + "version": "0.0.0", + "dependencies": { + "lit": "^2.8.0" + }, + "devDependencies": { + "@umbraco-cms/backoffice": "^14.0.0--preview003", + "typescript": "^5.2.2", + "vite": "^4.4.9" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz", + "integrity": "sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==" + }, + "node_modules/@lit/reactive-element": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.3.tgz", + "integrity": "sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.0.0" + } + }, + "node_modules/@openid/appauth": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@openid/appauth/-/appauth-1.3.1.tgz", + "integrity": "sha512-e54kpi219wES2ijPzeHe1kMnT8VKH8YeTd1GAn9BzVBmutz3tBgcG1y8a4pziNr4vNjFnuD4W446Ua7ELnNDiA==", + "dev": true, + "dependencies": { + "@types/base64-js": "^1.3.0", + "@types/jquery": "^3.5.5", + "base64-js": "^1.5.1", + "follow-redirects": "^1.13.3", + "form-data": "^4.0.0", + "opener": "^1.5.2" + } + }, + "node_modules/@types/base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ZmI0sZGAUNXUfMWboWwi4LcfpoVUYldyN6Oe0oJ5cCsHDU/LlRq8nQKPXhYLOx36QYSW9bNIb1vvRrD6K7Llgw==", + "dev": true + }, + "node_modules/@types/jquery": { + "version": "3.5.19", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.19.tgz", + "integrity": "sha512-KFbmk+dXfphHGuVCmlopgcNRCegN/21mkeoD4BzuJhVH0SJW3Uo2mLuAwb6oqTNV79EsRp6J7yC1BbKymjpx/g==", + "dev": true, + "dependencies": { + "@types/sizzle": "*" + } + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, + "node_modules/@types/trusted-types": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", + "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==" + }, + "node_modules/@umbraco-cms/backoffice": { + "version": "14.0.0--preview003", + "resolved": "https://www.myget.org/F/umbracoprereleases/npm/@umbraco-cms/backoffice/-/@umbraco-cms/backoffice-14.0.0--preview003.tgz", + "integrity": "sha1-9dKp9yP9w1NkwhoAa32uXh2tEd8=", + "dev": true, + "license": "MIT", + "dependencies": { + "@openid/appauth": "^1.3.1", + "@umbraco-ui/uui": "1.4.0-rc.2", + "@umbraco-ui/uui-css": "1.4.0-rc.2", + "element-internals-polyfill": "^1.3.7", + "lit": "^2.8.0", + "lodash-es": "4.17.21", + "monaco-editor": "^0.41.0", + "rxjs": "^7.8.1", + "tinymce": "^6.6.1", + "tinymce-i18n": "^23.8.7", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=18.14 <19", + "npm": ">=9.5 < 10" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui/-/uui-1.4.0-rc.2.tgz", + "integrity": "sha512-MmIB4GKhH+KUYOVm1p1RH8pumr6Jn9S46BWeDIRpK0JldszXR6EggLNl7ZxtVf43tEIBN7i+36079+7lHpA04Q==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-action-bar": "1.4.0-rc.2", + "@umbraco-ui/uui-avatar": "1.4.0-rc.2", + "@umbraco-ui/uui-avatar-group": "1.4.0-rc.2", + "@umbraco-ui/uui-badge": "1.4.0-rc.2", + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-boolean-input": "1.4.0-rc.2", + "@umbraco-ui/uui-box": "1.4.0-rc.2", + "@umbraco-ui/uui-breadcrumbs": "1.4.0-rc.2", + "@umbraco-ui/uui-button": "1.4.0-rc.2", + "@umbraco-ui/uui-button-group": "1.4.0-rc.2", + "@umbraco-ui/uui-button-inline-create": "1.4.0-rc.2", + "@umbraco-ui/uui-card": "1.4.0-rc.2", + "@umbraco-ui/uui-card-content-node": "1.4.0-rc.2", + "@umbraco-ui/uui-card-media": "1.4.0-rc.2", + "@umbraco-ui/uui-card-user": "1.4.0-rc.2", + "@umbraco-ui/uui-caret": "1.4.0-rc.2", + "@umbraco-ui/uui-checkbox": "1.4.0-rc.2", + "@umbraco-ui/uui-color-area": "1.4.0-rc.2", + "@umbraco-ui/uui-color-picker": "1.4.0-rc.2", + "@umbraco-ui/uui-color-slider": "1.4.0-rc.2", + "@umbraco-ui/uui-color-swatch": "1.4.0-rc.2", + "@umbraco-ui/uui-color-swatches": "1.4.0-rc.2", + "@umbraco-ui/uui-combobox": "1.4.0-rc.2", + "@umbraco-ui/uui-combobox-list": "1.4.0-rc.2", + "@umbraco-ui/uui-css": "1.4.0-rc.2", + "@umbraco-ui/uui-dialog": "1.4.0-rc.2", + "@umbraco-ui/uui-dialog-layout": "1.4.0-rc.2", + "@umbraco-ui/uui-file-dropzone": "1.4.0-rc.2", + "@umbraco-ui/uui-file-preview": "1.4.0-rc.2", + "@umbraco-ui/uui-form": "1.4.0-rc.2", + "@umbraco-ui/uui-form-layout-item": "1.4.0-rc.2", + "@umbraco-ui/uui-form-validation-message": "1.4.0-rc.2", + "@umbraco-ui/uui-icon": "1.4.0-rc.2", + "@umbraco-ui/uui-icon-registry": "1.4.0-rc.2", + "@umbraco-ui/uui-icon-registry-essential": "1.4.0-rc.2", + "@umbraco-ui/uui-input": "1.4.0-rc.2", + "@umbraco-ui/uui-input-file": "1.4.0-rc.2", + "@umbraco-ui/uui-input-lock": "1.4.0-rc.2", + "@umbraco-ui/uui-input-password": "1.4.0-rc.2", + "@umbraco-ui/uui-keyboard-shortcut": "1.4.0-rc.2", + "@umbraco-ui/uui-label": "1.4.0-rc.2", + "@umbraco-ui/uui-loader": "1.4.0-rc.2", + "@umbraco-ui/uui-loader-bar": "1.4.0-rc.2", + "@umbraco-ui/uui-loader-circle": "1.4.0-rc.2", + "@umbraco-ui/uui-menu-item": "1.4.0-rc.2", + "@umbraco-ui/uui-modal": "1.4.0-rc.2", + "@umbraco-ui/uui-pagination": "1.4.0-rc.2", + "@umbraco-ui/uui-popover": "1.4.0-rc.2", + "@umbraco-ui/uui-progress-bar": "1.4.0-rc.2", + "@umbraco-ui/uui-radio": "1.4.0-rc.2", + "@umbraco-ui/uui-range-slider": "1.4.0-rc.2", + "@umbraco-ui/uui-ref": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-list": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node-data-type": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node-document-type": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node-form": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node-member": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node-package": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node-user": "1.4.0-rc.2", + "@umbraco-ui/uui-scroll-container": "1.4.0-rc.2", + "@umbraco-ui/uui-select": "1.4.0-rc.2", + "@umbraco-ui/uui-slider": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-expand": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-file": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-file-dropzone": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-folder": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-lock": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-more": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-sort": "1.4.0-rc.2", + "@umbraco-ui/uui-table": "1.4.0-rc.2", + "@umbraco-ui/uui-tabs": "1.4.0-rc.2", + "@umbraco-ui/uui-tag": "1.4.0-rc.2", + "@umbraco-ui/uui-textarea": "1.4.0-rc.2", + "@umbraco-ui/uui-toast-notification": "1.4.0-rc.2", + "@umbraco-ui/uui-toast-notification-container": "1.4.0-rc.2", + "@umbraco-ui/uui-toast-notification-layout": "1.4.0-rc.2", + "@umbraco-ui/uui-toggle": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-action-bar": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-action-bar/-/uui-action-bar-1.4.0-rc.2.tgz", + "integrity": "sha512-bxbRzcvE+q8pqtKykV+CrtQCqcYd/YBGWMekMhnbmOjK/oILzCjvcqXUA0uY1QEFXpGfCfidEOxU2cXvEUZ/zg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-button-group": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-avatar": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar/-/uui-avatar-1.4.0-rc.2.tgz", + "integrity": "sha512-J+pXoik+BXOItTBiMMTEYDSKCVZ362zALXvasgnA5uJh2yOxKYOuP0BA6u9kfQYTBE6gPrwQrGEMYb21L1X9aw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-avatar-group": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-avatar-group/-/uui-avatar-group-1.4.0-rc.2.tgz", + "integrity": "sha512-ieHln2EgmSzldn9W/HT9J3cA2zefuFpTinqtccsqgVQFCyrUSaWKGlj4T7gbTK81Vsla1FRPcwdM18pVmMPr2Q==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-avatar": "1.4.0-rc.2", + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-badge": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-badge/-/uui-badge-1.4.0-rc.2.tgz", + "integrity": "sha512-/Fvkz+NuaFnvulY++OV1cEqDtriyQy3+smL0K5tNWzUz2sjZZ+LKVdNRJV1HCDk5oc1wcGOKemnAcpBmqFED7A==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-base": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-base/-/uui-base-1.4.0-rc.2.tgz", + "integrity": "sha512-L5dc2J/PrA4oXyhgUly9tFo+UxAMHSdLTksGujOiiOloOrtklPzJXIu18V3fziivd/WHv+C2ix7415FJok6cOA==", + "dev": true, + "dependencies": { + "lit": "^2.3.1" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-boolean-input": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-boolean-input/-/uui-boolean-input-1.4.0-rc.2.tgz", + "integrity": "sha512-+uOjBvvZ5GM0oj8JUIht1F3HjQOKmDi/0Kll2Ph1b3Q5326e4Jlt+JEh/MsZZ/CZNnY8nuFw+SRryxcvI5uVfA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-box": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-box/-/uui-box-1.4.0-rc.2.tgz", + "integrity": "sha512-mmhsXTsBojqeD2cVuYu6+aUtt1ouRBza1hSKZ5b4Zjd/3xgT/xHSj/v/Q+xYLnr7nAG7MGVSCoBK3jSbsa+cMg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-css": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-breadcrumbs": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-breadcrumbs/-/uui-breadcrumbs-1.4.0-rc.2.tgz", + "integrity": "sha512-vT3ANz1c7yTRrmLvqLReil5h8aLKV8C9GWjw5Phxxu061KRelaWy82+zk9FRwM+2NgdnPbSqCmMoQrsVD3fzcA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-button": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button/-/uui-button-1.4.0-rc.2.tgz", + "integrity": "sha512-G3pOW37jH6bmDBfc0DiQ3BEFgJ8N6qn3wqSwg9mL5FD0oecayk/pZuzFYYoSwls898j/WPq2nAwIkUxVq5evmg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-icon-registry-essential": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-button-group": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-group/-/uui-button-group-1.4.0-rc.2.tgz", + "integrity": "sha512-wk9JsVpkSRP9jqSWpVp/97Omhvl3fo+F/zlcp39rCN+li8gad2ezhKkXEsF4zKPmjS8T/CuA9Kd9evEQSd3uPA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-button-inline-create": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-button-inline-create/-/uui-button-inline-create-1.4.0-rc.2.tgz", + "integrity": "sha512-tU3fVMWO8ZjDxnQvRJI0wHiISC30cfW61YjRCSf+n7z2oMQ4/4fVbVMbKHznlFe7phjAAitqCbjzSIIiweNfPA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-card": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card/-/uui-card-1.4.0-rc.2.tgz", + "integrity": "sha512-+rC6kfUug3TQkkm+92KsDWPs1COPzEd0jAPccjThvEZuAf1WlENNOkiS6AzlsjhnOBRGf0WJe/lItDZK5mSe1Q==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-card-content-node": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-content-node/-/uui-card-content-node-1.4.0-rc.2.tgz", + "integrity": "sha512-/Ht8m1iUo/9QInPOqB3nN6hsdL8xrP8j8Duvh+egruUVzcu5wjUrUvzmgA6X/ZxZNmzKd8mAgSQoE2jqcGO0Wg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-card": "1.4.0-rc.2", + "@umbraco-ui/uui-icon": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-card-media": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-media/-/uui-card-media-1.4.0-rc.2.tgz", + "integrity": "sha512-CzzLKLMQ4j1C3PY4K3lo3qLqsegSOLX7oYsVUQMLk75ct2xIgNn/e+cuHBDfXR31+mkwzaOzhAAeDnrkDYe6YA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-card": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-file": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-folder": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-card-user": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-card-user/-/uui-card-user-1.4.0-rc.2.tgz", + "integrity": "sha512-/pY8QAw8P601Zdg0HGH4/V3R/TKEaj8k53sOvKfXyfouJ74VHIA95EU1cMIgKzZzOv/+Zq/gHt0Goql29gEaCg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-avatar": "1.4.0-rc.2", + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-card": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-caret": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-caret/-/uui-caret-1.4.0-rc.2.tgz", + "integrity": "sha512-hb9Nk/Gqih9S19fjUIYTZJ8+q0xXFJfMY7RlS8l8TmPVJAr77U6/lZYLDDG/wLgYkYszqeEeS5Z6GyQXYK+hEQ==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-checkbox": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-checkbox/-/uui-checkbox-1.4.0-rc.2.tgz", + "integrity": "sha512-fvwFeflja04PhViXRMo+f3swdnAb3HjfVtLFeFus+F928hkJnWgvSF8jJX19OfItu/5vSBVgvCOVgiGZ8KTn4w==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-boolean-input": "1.4.0-rc.2", + "@umbraco-ui/uui-icon-registry-essential": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-color-area": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-area/-/uui-color-area-1.4.0-rc.2.tgz", + "integrity": "sha512-f2icfmIguNOJ7BqottgwRhuiSrPcyb7/WXt1MT9WYeXWjn5aXMFGf6rzU3QSqnF+S8CqdB+BdtZErWEg6oCBtA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "colord": "^2.9.3" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-color-picker": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-picker/-/uui-color-picker-1.4.0-rc.2.tgz", + "integrity": "sha512-SEeOXY+q1pRzFJMgv/RC/zQdZyP9ULLn5AvIUkJ31loMaAiNPP72RKg9PVhiuIhyHMMUKigJm9B+IBUuJ6Wf4w==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "colord": "^2.9.3" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-color-slider": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-slider/-/uui-color-slider-1.4.0-rc.2.tgz", + "integrity": "sha512-z43+sDRsRTbB9XDLozXcjm4mKSrks3GanO+wf7KU4/IyRR1934LQGDDwkNf90CHf7wl1uIIp4+0ICr1JpIdwng==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-color-swatch": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatch/-/uui-color-swatch-1.4.0-rc.2.tgz", + "integrity": "sha512-xmjmcI2+sC8q/tT+hyvL2gKHB6ceWw5Tjo1HbwkBtqSUJvpSc26VkX/GuP1zyyHcNUGuvBJnUYoGJ10pQAUdsw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-icon-registry-essential": "1.4.0-rc.2", + "colord": "^2.9.3" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-color-swatches": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-color-swatches/-/uui-color-swatches-1.4.0-rc.2.tgz", + "integrity": "sha512-lI94yrS6RHtVdkFKEkJXlPwrUtmOcCMp4xsUlNDHvY8LFVqKtXeKHx8xH7hT/Mu6RlAmXvrjq2SZS0YJD8t/1A==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-color-swatch": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-combobox": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox/-/uui-combobox-1.4.0-rc.2.tgz", + "integrity": "sha512-BmhZ9ppYU3gmoo1YreLE2JYRsgNe8gSHb0EJTeviCAXWCT3o1Ta9Jnx0pQiV3rmGKjR45QyIR3FUttXlDOCOEw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-button": "1.4.0-rc.2", + "@umbraco-ui/uui-combobox-list": "1.4.0-rc.2", + "@umbraco-ui/uui-icon": "1.4.0-rc.2", + "@umbraco-ui/uui-scroll-container": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-combobox-list": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-combobox-list/-/uui-combobox-list-1.4.0-rc.2.tgz", + "integrity": "sha512-yFU2/UuWDr/Xshaf68cIpC+smvf/hNa2Gm4FLu/3qpDGYNe8KEy2wKpGD0rvBtuveS3Tn0ZxY+AvrOucomRCxw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-css": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-css/-/uui-css-1.4.0-rc.2.tgz", + "integrity": "sha512-6vXzFjDl4Etxvc+YHUV3hcjh+K+cNOOkdVhNBupHZLwLbEq9xznlJqmjgj2pdn5gXrHM5hY5mzBuX03iK0dpaw==", + "dev": true, + "dependencies": { + "lit": "^2.2.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-dialog": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog/-/uui-dialog-1.4.0-rc.2.tgz", + "integrity": "sha512-MbgeFbbCoBGQbN8mbXsR2tP4Pi2mA+4rRTd0cnu2EfmfzcEcJ10l72aKpLPwB5+wIbKNVocQhyZMZT1tdAkcng==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-css": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-dialog-layout": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-dialog-layout/-/uui-dialog-layout-1.4.0-rc.2.tgz", + "integrity": "sha512-veuSmSRI0tq5GHF6T3ifyhx3zM1zANMNV+EpKcgi2OhiV4I806y6pgNr3HQQxhyi54f51nY/IKEw2Y0ZZ5y4oQ==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-file-dropzone": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-dropzone/-/uui-file-dropzone-1.4.0-rc.2.tgz", + "integrity": "sha512-cOGqcxxSSlEyeFDPVfRQA7ItefrPu/Iw0A2NqvtvMF/igklm1htrMWAJY0ur7UXGhr+EQCvUICna2Ox0lpXg6Q==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-file-dropzone": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-file-preview": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-file-preview/-/uui-file-preview-1.4.0-rc.2.tgz", + "integrity": "sha512-0qBcfl8oL7vraE8XeLMM+DkfT2/Ej7dV4BPkEqWjZenEusRvd5KFWitNNR41NN7lLGdL7ATk7mjzX70oFgyzPQ==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-file": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-file-thumbnail": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-folder": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-form": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form/-/uui-form-1.4.0-rc.2.tgz", + "integrity": "sha512-GBFGOjdJ7+LmrKN0//DoxkXqTWhLfV7HMg8FALyceX51/WwnNYxiHon1VyetIHiRlxa/n1NqUBKz4KC94D73ug==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-form-layout-item": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-layout-item/-/uui-form-layout-item-1.4.0-rc.2.tgz", + "integrity": "sha512-IAYsu5pmtGRi+/WQ3Dos7oAYkOKfp/IMeItupCpzUgXJOETjXOnSqe0yaW3FVqRiZtjHzPOnyZE4IX9vCiNXpg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-form-validation-message": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-form-validation-message": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-form-validation-message/-/uui-form-validation-message-1.4.0-rc.2.tgz", + "integrity": "sha512-LfhYTgAN+7s8ce8NtmI1Os+V9YLUKTJgdtHmchzEazmwycClXpasoSbvTNaMlbIlLXpv1lRk/MDTtlS9UvZC/g==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-icon": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon/-/uui-icon-1.4.0-rc.2.tgz", + "integrity": "sha512-hKZ5RSPT/Iw1CwV75v09aHf6nZe5vc6wv0XaTdXvYFMf73GK+DANYG1q+vEuiDbu8dmnz4v95YY3h2J6rDFmXw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-icon-registry": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry/-/uui-icon-registry-1.4.0-rc.2.tgz", + "integrity": "sha512-Yd16qscWN3zlScm7anrn2EjcmWHrld+M++U32IULQaw7Fs81nekZ03lyLXeTbsU7vQIWYrg+UfTGnumCbe2Esw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-icon": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-icon-registry-essential": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-icon-registry-essential/-/uui-icon-registry-essential-1.4.0-rc.2.tgz", + "integrity": "sha512-XiwbdoVt9z4/bzU8RtlIcITDcQQeVFw7dXY2saBtSWuLTh7qTMHOeRRRw1CIX1zyFQkaMGMoZu3eaH/7pEna8A==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-icon-registry": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-input": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input/-/uui-input-1.4.0-rc.2.tgz", + "integrity": "sha512-hPkb4z4L6vbWTiBZHQuOJULyYMvSPib3ZxQYBb5goNpogaoidZIkqsHHcZPazSf+976UyYM6yZWQt5WziJiXVQ==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-input-file": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-file/-/uui-input-file-1.4.0-rc.2.tgz", + "integrity": "sha512-BDbpr5ncidoSmn6GM1NAlCPkMRqcucKQFMo5hmlEv55ktNvZ8miD0BaQWi4TXDgQeuEJOXRqKGCng4W9AH5wPA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-action-bar": "1.4.0-rc.2", + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-button": "1.4.0-rc.2", + "@umbraco-ui/uui-file-dropzone": "1.4.0-rc.2", + "@umbraco-ui/uui-icon": "1.4.0-rc.2", + "@umbraco-ui/uui-icon-registry-essential": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-input-lock": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-lock/-/uui-input-lock-1.4.0-rc.2.tgz", + "integrity": "sha512-TMLPzS3SwOgQKqDpH/RX7sYvtsYgW8gG2tullhNn+J8d63gSGWhYk1fLoT87a3fs9ClOWL1xEnXxq7CqveLjlg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-button": "1.4.0-rc.2", + "@umbraco-ui/uui-icon": "1.4.0-rc.2", + "@umbraco-ui/uui-input": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-input-password": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-input-password/-/uui-input-password-1.4.0-rc.2.tgz", + "integrity": "sha512-wSoejiCDsXKbUG5wj3PuU2NjUFp+Fab58yRwaZDkqDcJ8yhKP3/vYYPGaRBw28Hz6RNSt4uut/lKkczCDAPalg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-icon-registry-essential": "1.4.0-rc.2", + "@umbraco-ui/uui-input": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-keyboard-shortcut": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-keyboard-shortcut/-/uui-keyboard-shortcut-1.4.0-rc.2.tgz", + "integrity": "sha512-obEctCv+zKBFHrZeKo8OSTI9BQnKIt15zuLmG3xnPqu33bzjP2ubPGJnnCdKeoglX7LALR8D6RpqEFZvp08hTQ==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-label": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-label/-/uui-label-1.4.0-rc.2.tgz", + "integrity": "sha512-1YZi66DRRkuo9p2dwKNut35UCi3v32UIsQ6Mrx5/D9rlnuy/4sk36NZ3twbtKWAoQl8DII0TsjwnkQJOppEBzA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-loader": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader/-/uui-loader-1.4.0-rc.2.tgz", + "integrity": "sha512-4NX5PoRSwcEEvukWf9v1TlWU5kyvigLL7HNsaOKyq7AYe6JHWTej/xMwWOFPuRt8poFnIZZzDAvE/P1GEAg16w==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-loader-bar": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-bar/-/uui-loader-bar-1.4.0-rc.2.tgz", + "integrity": "sha512-ffSrpofNpj6jjI/wTmoG0guDIgub1NpOCTil1JO8cPnsBFL9HFLFK4xblnBbU/lZ6C33aoRfu4IDfH0ux2y0Ww==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-loader-circle": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-loader-circle/-/uui-loader-circle-1.4.0-rc.2.tgz", + "integrity": "sha512-Kqb9k8JHS5qORqa4mZSzpaPh1He2rEEeEOD72DkLtBW01EhpRjMO3cRVxOmHY90AvWAMJkywRKXB7b7PFYV7nA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-menu-item": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-menu-item/-/uui-menu-item-1.4.0-rc.2.tgz", + "integrity": "sha512-GtxDbYcH1WJgY36kODThaLOwvePH1CYZCmFaN6Mv85n8gVbmCogI6NVgjp3eYZX5aBBqnw+NC5l7/UpETJn9dA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-loader-bar": "1.4.0-rc.2", + "@umbraco-ui/uui-symbol-expand": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-modal": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-modal/-/uui-modal-1.4.0-rc.2.tgz", + "integrity": "sha512-RNGEkHeqcM8dVqG5Fjzjo+ir4iREe8Wb0xTAkSyL1+paCOq9pNyYKptln4eFWsfop5L9Ia8DHKyV4AS3JBNE8w==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-pagination": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-pagination/-/uui-pagination-1.4.0-rc.2.tgz", + "integrity": "sha512-1u6PEnAM5MMYPdEGgoyHxXihL/Mx+TE667tsAcKE7hGaMuUfd2rbvJcCYmdJSn8v4VuvHiDOyL70nUME97+jEQ==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-button": "1.4.0-rc.2", + "@umbraco-ui/uui-button-group": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-popover": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-popover/-/uui-popover-1.4.0-rc.2.tgz", + "integrity": "sha512-QiZlK8Idk8ygSrO5SH9sl6dVjGwB7uP2VLPiOA5kCMGTiJU1JpvIFtw1flmNkQPxcV/r96xrUxePtXqhQLN4pw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-progress-bar": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-progress-bar/-/uui-progress-bar-1.4.0-rc.2.tgz", + "integrity": "sha512-Uepscoo9nMaWJ7XCei0Q7O93R01Po6J5DuGhsWZP/BBEzhanGqtt6XXQzoppM9U8Bpmvs6Q/bmJ37my7E5whOg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-radio": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-radio/-/uui-radio-1.4.0-rc.2.tgz", + "integrity": "sha512-EfUd4/OETuyrr6Y6wBQ2Muan05ZR+XfmYIg99FI6vocT4hlSGQp9Nu+J8EhQobjPcA2K630Q2aIQddydMKjKUA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-range-slider": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-range-slider/-/uui-range-slider-1.4.0-rc.2.tgz", + "integrity": "sha512-eV2k7bUAMvJ+wUYSm8fFf28OicM590GL2+1Em9An5UMvnnN0bq+Y0H0nP038P3+/38Ea92Tm+iIY7/EeaZC/Ug==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-ref": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref/-/uui-ref-1.4.0-rc.2.tgz", + "integrity": "sha512-BzU8U/pXWAyaBtsndnhNgYLEuZC5mnoOv+CouxmcUpi9Onb5XTS6lOgO2Onoee0gzmjtH72fv2PeJPJPnXTV1g==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-ref-list": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-list/-/uui-ref-list-1.4.0-rc.2.tgz", + "integrity": "sha512-BlTelLG7V1tCRsrPo7lf6V3Dp2L++9hFCZu8a26hirvEsczcWkUxclFrZnZw7I0+DyVvWli9yd89yJH8XL3bfw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-ref-node": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node/-/uui-ref-node-1.4.0-rc.2.tgz", + "integrity": "sha512-NjxTgQA5AmS1CpcJLyUKiebDz3J1iy+rAWWWzpfY1QaJdi2GtSYS57HzawFsb6GJEoxxMNWGomNz3KhD1Pm7dQ==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-icon": "1.4.0-rc.2", + "@umbraco-ui/uui-ref": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-ref-node-data-type": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-data-type/-/uui-ref-node-data-type-1.4.0-rc.2.tgz", + "integrity": "sha512-mSLVI3uA4lI9PQvK6TCOjm5ek/JClZk3RXJgitXYcJFwpGeQsXyq9F3whjs3E90kSAfaLhaNfo/6375QxTCUjw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-ref-node-document-type": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-document-type/-/uui-ref-node-document-type-1.4.0-rc.2.tgz", + "integrity": "sha512-sMsXYkLyHtSXMol4pWsnYkqbGg0rY4Yc4glRUaWj4IAEfSJi3jPex6Ti+qzNy3we/rQ+8h2QIISigHiREX6yYg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-ref-node-form": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-form/-/uui-ref-node-form-1.4.0-rc.2.tgz", + "integrity": "sha512-OzK68p0op0tKC1EHRIQ8wGb8v59KubZPy2k7GHmfKdpWcgQzYRiAscif1ACRUNXYaZ27+M0dRc+fJbCP5w/HRg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-ref-node-member": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-member/-/uui-ref-node-member-1.4.0-rc.2.tgz", + "integrity": "sha512-jE7R4h5n0dlMzciTHjmK3C+CQDpCHOx0gPxB/xA+vCmrinGrE1DXfqALk5TTZqrcfRZ53L6KspkXv8ozVMLQdg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-ref-node-package": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-package/-/uui-ref-node-package-1.4.0-rc.2.tgz", + "integrity": "sha512-2R8/HL4pitnSiTTtGYv+iqOW2/dQDq32zVxSuvm6EUkQuKZeDEiQ+zAVsnjAViIMRRrkEiCiANPFkAXu5tEp3A==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-ref-node-user": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-ref-node-user/-/uui-ref-node-user-1.4.0-rc.2.tgz", + "integrity": "sha512-bJrNXJ0GCQG7GLhCsxEExc9wAOptg9rYevTkNLs1MuvRM7TFn7Nj8weAxxVewAM0ZocWwu1oNDD/Rri+eV713g==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-ref-node": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-scroll-container": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-scroll-container/-/uui-scroll-container-1.4.0-rc.2.tgz", + "integrity": "sha512-clwL4+7QcNVFEHKtF4Tp1H7tj4Ed0mGct/eApGGCfv1vpXD1uir05TZ57AaAt9DORIUdKAnYzjPGBB6QvZKihA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-select": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-select/-/uui-select-1.4.0-rc.2.tgz", + "integrity": "sha512-8afwgw8WZ93uWeE/WPtvMKyZy/Ey4gVrkh8rF3ZD+czCxYvoZ+gnF25IcpARTkfc3Dy9Cte1c0uoXlJUu8cCVg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-slider": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-slider/-/uui-slider-1.4.0-rc.2.tgz", + "integrity": "sha512-ze9bKW/HuMnb5kun74tATPjYOUUcwZH+0oadAJBtw5CGJ4uTlwl9caEe32NYBgc731V3BrHHoy0FNFb5RxyCJg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-symbol-expand": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-expand/-/uui-symbol-expand-1.4.0-rc.2.tgz", + "integrity": "sha512-hflDXOAKyIfsWVpaTnBi6s1XiCcuvR+2E836Jeh7txdDzz1MHbdh0Aze6XhhtBQUPtKXFSHXPp7v1YZRJVp4vg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-symbol-file": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file/-/uui-symbol-file-1.4.0-rc.2.tgz", + "integrity": "sha512-raHWXxPD1bTlB0q/CUMJblBPSQTRfJF9tMTTFocYVj9/7cf1N8yxayKqmsb+cEfZR76D1NkhwxMODkVyGIee2Q==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-symbol-file-dropzone": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-dropzone/-/uui-symbol-file-dropzone-1.4.0-rc.2.tgz", + "integrity": "sha512-wNXlISiShZkqtX4+4OSznI+RfwEg1N8nJTFraehREv1atQ7rmfiKBcb63+j/s2hOmBtYCsPsE6x/YRRlsm4myg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-symbol-file-thumbnail": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-file-thumbnail/-/uui-symbol-file-thumbnail-1.4.0-rc.2.tgz", + "integrity": "sha512-SgBJJmUB+S8Bitpq9UCueLb5JKPxkWo0W08EKbnmKqNsmhLfNihYsjz83EZFr6vfKJQL9lJRn/TO0skZziq0Xw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-symbol-folder": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-folder/-/uui-symbol-folder-1.4.0-rc.2.tgz", + "integrity": "sha512-s4rMNMpRe72PJZ92RZHLeDdMrRWu+oLWqm2cEUJC55Xx/ssz2p/4zu8UmqNoS38BylrA9C381Jqnv95Cp0pqVA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-symbol-lock": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-lock/-/uui-symbol-lock-1.4.0-rc.2.tgz", + "integrity": "sha512-4+Yo8icGlt+1S7iZWVoID0V0igsU48WxDTVqWLzuaAJ8jtGnyEAICPhWD+/tpQKkhR0ZSRSg06kq3gClJkxyIw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-symbol-more": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-more/-/uui-symbol-more-1.4.0-rc.2.tgz", + "integrity": "sha512-1APpGHIowaZxDM1K68W9u+D7S11t2bcBxs53uNhj1QOaeaHX5R7LYEKYu6mb1DQsQ/dfFXXSw9Sg4sabOEJSAQ==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-symbol-sort": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-symbol-sort/-/uui-symbol-sort-1.4.0-rc.2.tgz", + "integrity": "sha512-0IgGAX046wD5Qc1UM3rSGlYNw5fD8RA9EHPGxm3TgiVmNlTgLsSQEk0Syv4lhZZZl0SEWppwwTupJUm+2/PeTg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-table": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-table/-/uui-table-1.4.0-rc.2.tgz", + "integrity": "sha512-CYzCHOr98WUjBHJooZCsiT8wX7felNHiX4WBOoRE3qheuXUjmBEQryoiHLe+ceYTjngINZN7IrWetcR0QSelqg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-tabs": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tabs/-/uui-tabs-1.4.0-rc.2.tgz", + "integrity": "sha512-g/2O7pDyF0k6HHzsBcnTDstylXwmW8DyfNlyp7/HcUZjaxcs5hN55OIlJohzOsPhyBiGscHHOzVBU32yIlAR7g==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-tag": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-tag/-/uui-tag-1.4.0-rc.2.tgz", + "integrity": "sha512-A9tj3ITwcfdsJqkDQvG10fNz8hz1PJikuFN2CqGM+A1h1KXXYZ9zg/jnHq7LBJL+uBwfRlTgxbH97dYPGxou3A==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-textarea": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-textarea/-/uui-textarea-1.4.0-rc.2.tgz", + "integrity": "sha512-Z2NKAu52KragOQOf89kiFoHq5wKA+w9A5Is6L21hDycbnKH7lxsfddqAhmlc4axMTSo/rBjGa/KVoAmyzGblfw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-toast-notification": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification/-/uui-toast-notification-1.4.0-rc.2.tgz", + "integrity": "sha512-rxVAoncACM1SotUhBD0fNiwgiVb7Lj/2PPxO50YFFP1p9+DbnG7PYfzxXwSxqisQ8d+DyO0nVQa4YE6XscjRMA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-button": "1.4.0-rc.2", + "@umbraco-ui/uui-css": "1.4.0-rc.2", + "@umbraco-ui/uui-icon": "1.4.0-rc.2", + "@umbraco-ui/uui-icon-registry-essential": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-toast-notification-container": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-container/-/uui-toast-notification-container-1.4.0-rc.2.tgz", + "integrity": "sha512-cS65Cl8dSpZcj1fEXODQ0Jj/j+pCQwuWIyAKsWFpuaIDv2cW7K4SxTuqlFdiIMvHPnyKRvlsdulwle3UVFTBHA==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-toast-notification": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-toast-notification-layout": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toast-notification-layout/-/uui-toast-notification-layout-1.4.0-rc.2.tgz", + "integrity": "sha512-9iK3uX1pe1UdJi/uF9yttbJvzEcwADhd187CLZdVYaZgM0Qj9cir2r5mqigak7iAqw9/t45QfME4e+B7mAmwLg==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-css": "1.4.0-rc.2" + } + }, + "node_modules/@umbraco-cms/backoffice/node_modules/@umbraco-ui/uui-toggle": { + "version": "1.4.0-rc.2", + "resolved": "https://registry.npmjs.org/@umbraco-ui/uui-toggle/-/uui-toggle-1.4.0-rc.2.tgz", + "integrity": "sha512-qXKImYh+WG0Vau73U7eCizO8sUHguzC2EEqC4BmoDEs5rXDg8ny4gTPLKqln8YPlGMvmir0Xu4/XcNMstfN+hw==", + "dev": true, + "dependencies": { + "@umbraco-ui/uui-base": "1.4.0-rc.2", + "@umbraco-ui/uui-boolean-input": "1.4.0-rc.2" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "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" + } + ] + }, + "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 + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/element-internals-polyfill": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/element-internals-polyfill/-/element-internals-polyfill-1.3.8.tgz", + "integrity": "sha512-nymTA/NftVOlS6UjLCL8lKUm8MEgt6TXntQqGGKt+er4dzS9eU88zaGUHLTYVgdfifQ8JQFGbQERMvxse5GMrA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "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/lit": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.8.0.tgz", + "integrity": "sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==", + "dependencies": { + "@lit/reactive-element": "^1.6.0", + "lit-element": "^3.3.0", + "lit-html": "^2.8.0" + } + }, + "node_modules/lit-element": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.3.tgz", + "integrity": "sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.1.0", + "@lit/reactive-element": "^1.3.0", + "lit-html": "^2.8.0" + } + }, + "node_modules/lit-html": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.8.0.tgz", + "integrity": "sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/monaco-editor": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.41.0.tgz", + "integrity": "sha512-1o4olnZJsiLmv5pwLEAmzHTE/5geLKQ07BrGxlF4Ri/AXAc2yyDGZwHjiTqD8D/ROKUZmwMA28A+yEowLNOEcA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", + "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.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "3.29.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.2.tgz", + "integrity": "sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "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, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinymce": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-6.6.1.tgz", + "integrity": "sha512-n1ub/Jq6c5o2mju6A1HPFoR5/X7eH8720yDzLchg4MbKKJg6tthTGr+lBPHzQyrImwbfo7LVgx28mN5InzVMmw==", + "dev": true + }, + "node_modules/tinymce-i18n": { + "version": "23.8.7", + "resolved": "https://registry.npmjs.org/tinymce-i18n/-/tinymce-i18n-23.8.7.tgz", + "integrity": "sha512-VIWuHdwzWFJzHxOLd5Ao7Fj/W2fKajQxI5dzJc2M2k6l0LCTtfnGQkK47ADlU7Yttqbd1QlcJt1yfi957/EAtw==", + "dev": true + }, + "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 + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "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" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + } + } +} diff --git a/templates/UmbracoPackageRcl/package.json b/templates/UmbracoPackageRcl/package.json new file mode 100644 index 000000000000..66d514667ca3 --- /dev/null +++ b/templates/UmbracoPackageRcl/package.json @@ -0,0 +1,19 @@ +{ + "name": "UmbracoPackage", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "tsc && vite build --watch", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "lit": "^2.8.0" + }, + "devDependencies": { + "@umbraco-cms/backoffice": "^14.0.0--preview003", + "typescript": "^5.2.2", + "vite": "^4.4.9" + } +} diff --git a/templates/UmbracoPackageRcl/src/dashboard/my-welcome-dashboard.ts b/templates/UmbracoPackageRcl/src/dashboard/my-welcome-dashboard.ts new file mode 100644 index 000000000000..1812ddaf4685 --- /dev/null +++ b/templates/UmbracoPackageRcl/src/dashboard/my-welcome-dashboard.ts @@ -0,0 +1,61 @@ +import { LitElement, html, css } from 'lit'; +import { customElement, property } from 'lit/decorators.js'; +import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; +import { UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; + +@customElement('my-welcome-dashboard') +export default class MyWelcomeDashboard extends UmbElementMixin(LitElement) { + #notificationContext?: typeof UMB_NOTIFICATION_CONTEXT_TOKEN.TYPE; + + @property() private hitCount: number = 0; + @property() private buttonColor: string = 'positive'; + @property() private icon: string = 'umb:handtool'; + @property() private disabled: boolean = false + + constructor() { + super(); + this.consumeContext(UMB_NOTIFICATION_CONTEXT_TOKEN, (_instance) => { + this.#notificationContext = _instance; + }); + } + + #onClick = () => { + if (this.hitCount > 11) { + this.disabled = true; + } else if (this.hitCount > 8) { + this.#notificationContext?.peek('danger', { data: { message: 'Please stop' } }); + this.buttonColor = 'danger'; + this.icon = 'umb:alert'; + } else if (this.hitCount > 4) { + this.#notificationContext?.peek('warning', { data: { message: 'Okay, that\'s enough' } }); + this.buttonColor = 'warning'; + } else { + this.#notificationContext?.peek('positive', { data: { message: '#h5yr' } }); + } + this.hitCount++; + } + + render() { + return html` + +

A TypeScript Lit Dashboard

+ +
+ `; + } + + static styles = [ + css` + :host { + display: block; + padding: var(--uui-size-layout-1); + } + ` + ] +} + +declare global { + interface HTMLElementTagNameMap { + 'my-welcome-dashboard': MyWelcomeDashboard; + } +} \ No newline at end of file diff --git a/templates/UmbracoPackageRcl/src/property-editor/my-card.element.ts b/templates/UmbracoPackageRcl/src/property-editor/my-card.element.ts new file mode 100644 index 000000000000..398f71359b16 --- /dev/null +++ b/templates/UmbracoPackageRcl/src/property-editor/my-card.element.ts @@ -0,0 +1,25 @@ +import {UUICardElement} from "@umbraco-cms/backoffice/external/uui"; +import {css} from "lit"; +import {customElement, property} from "lit/decorators.js"; + +@customElement("my-card") +export class MyCardElement extends UUICardElement { + + @property() + value!: string; + + constructor() { + super(); + this.selectable = true; + } + + static styles = [ + ...UUICardElement.styles, + css` + :host { + padding: 1rem; + width: 200px; + } + ` + ] +} \ No newline at end of file diff --git a/templates/UmbracoPackageRcl/src/property-editor/my-property-editor-ui.ts b/templates/UmbracoPackageRcl/src/property-editor/my-property-editor-ui.ts new file mode 100644 index 000000000000..d7e11facea52 --- /dev/null +++ b/templates/UmbracoPackageRcl/src/property-editor/my-property-editor-ui.ts @@ -0,0 +1,52 @@ +import {LitElement, html, css} from "lit"; +import { customElement, property } from "lit/decorators.js"; +import { UmbPropertyEditorExtensionElement } from "@umbraco-cms/backoffice/extension-registry"; + +import type {MyCardElement} from "./my-card.element.ts"; +import './my-card.element.js'; + +@customElement("my-property-editor-ui") +export class MyPropertyEditorUiElement + extends LitElement + implements UmbPropertyEditorExtensionElement +{ + @property({ type: String }) + public value = ""; + + #onCardSelected(evt: Event) { + const card = evt.target as MyCardElement; + this.value = card.value ?? ""; + this.dispatchEvent(new CustomEvent("property-value-change")); + } + + render() { + return html` +
+ VISA + MasterCard +
+ `; + } + + static styles = [ + css` + :host { + display: block; + } + + .cards { + display: flex; + flex-direction: row; + gap: 1rem; + } + ` + ] +} + +export default MyPropertyEditorUiElement; + +declare global { + interface HTMLElementTagNameMap { + "my-property-editor-ui": MyPropertyEditorUiElement; + } +} \ No newline at end of file diff --git a/templates/UmbracoPackageRcl/tsconfig.json b/templates/UmbracoPackageRcl/tsconfig.json new file mode 100644 index 000000000000..69e31ac92882 --- /dev/null +++ b/templates/UmbracoPackageRcl/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/templates/UmbracoPackageRcl/vite.config.ts b/templates/UmbracoPackageRcl/vite.config.ts new file mode 100644 index 000000000000..ce01078c2bc0 --- /dev/null +++ b/templates/UmbracoPackageRcl/vite.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from "vite"; + +export default defineConfig({ + build: { + lib: { + entry: ["src/property-editor/my-property-editor-ui.ts", "src/dashboard/my-welcome-dashboard.ts"], // your web component source file + formats: ["es"], + }, + outDir: "wwwroot/dist", // your web component will be saved in this location + sourcemap: true, + emptyOutDir: true, + rollupOptions: { + external: [/^@umbraco/], + }, + }, +}); diff --git a/templates/UmbracoPackageRcl/wwwroot/umbraco-package.json b/templates/UmbracoPackageRcl/wwwroot/umbraco-package.json index 153f0b057678..3d33c111c526 100644 --- a/templates/UmbracoPackageRcl/wwwroot/umbraco-package.json +++ b/templates/UmbracoPackageRcl/wwwroot/umbraco-package.json @@ -1,6 +1,31 @@ { + "$schema": "../../umbraco-package-schema.json", "id": "UmbracoPackage", "name": "UmbracoPackage", + "version": "0.1.0", "allowPackageTelemetry": true, - "extensions": [] + "extensions": [ + { + "type": "dashboard", + "alias": "My.Dashboard.MyExtension", + "name": "My Dashboard", + "js": "/App_Plugins/UmbracoPackage/dist/my-welcome-dashboard.js", + "meta": { + "label": "My Dashboard", + "pathname": "my-dashboard" + } + }, + { + "type": "propertyEditorUi", + "alias": "My.PropertyEditorUi", + "name": "My Property Editor UI", + "js": "/App_Plugins/UmbracoPackage/dist/my-property-editor-ui.js", + "meta": { + "label": "My Property Editor UI", + "icon": "umb:list", + "group": "common", + "propertyEditorSchemaAlias": "Umbraco.TextBox" + } + } + ] } From a2355915214562a6b2f2c808e45e680bd1e1bf59 Mon Sep 17 00:00:00 2001 From: Erik-Jan Westendorp Date: Mon, 12 Aug 2024 10:18:20 +0200 Subject: [PATCH 02/14] Add Content-Security-Policy (CSP) health check (#16830) * Add CSP Header Check * Update src/Umbraco.Core/EmbeddedResources/Lang/en.xml Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com> * Update src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com> --------- Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com> --- src/Umbraco.Core/Constants-HealthChecks.cs | 1 + .../EmbeddedResources/Lang/en.xml | 6 ++++ .../EmbeddedResources/Lang/en_us.xml | 6 ++++ .../HealthChecks/Checks/Security/CspCheck.cs | 31 +++++++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 src/Umbraco.Core/HealthChecks/Checks/Security/CspCheck.cs diff --git a/src/Umbraco.Core/Constants-HealthChecks.cs b/src/Umbraco.Core/Constants-HealthChecks.cs index bb18145401e9..d4b35f4e0492 100644 --- a/src/Umbraco.Core/Constants-HealthChecks.cs +++ b/src/Umbraco.Core/Constants-HealthChecks.cs @@ -52,6 +52,7 @@ public static class Security [Obsolete("This link is not used anymore in the XSS protected check.")] public const string XssProtectionCheck = "https://umbra.co/healthchecks-xss-protection"; public const string ExcessiveHeadersCheck = "https://umbra.co/healthchecks-excessive-headers"; + public const string CspHeaderCheck = "https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP"; public static class HttpsCheck { diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml index 893ab7c242d6..c05ea72cfcac 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en.xml @@ -467,6 +467,12 @@ You can read about this on the Mozilla website ]]> X-XSS-Protection was not found.]]> + + Content-Security-Policy (CSP) was found. ]]> + + + Content-Security-Policy (CSP) used to prevent cross-site scripting (XSS) attacks and other code injection vulnerabilities was not found.]]> + %0%.]]> No headers revealing information about the website technology were found. diff --git a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml index 69558f72dace..dec3809f8dc5 100644 --- a/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml +++ b/src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml @@ -455,6 +455,12 @@ You can read about this on the Mozilla website ]]> X-XSS-Protection was not found.]]> + + Content-Security-Policy (CSP) was found. ]]> + + + Content-Security-Policy (CSP) used to prevent cross-site scripting (XSS) attacks and other code injection vulnerabilities was not found.]]> + %0%.]]> No headers revealing information about the website technology were found. diff --git a/src/Umbraco.Core/HealthChecks/Checks/Security/CspCheck.cs b/src/Umbraco.Core/HealthChecks/Checks/Security/CspCheck.cs new file mode 100644 index 000000000000..1ac8cf56f4b6 --- /dev/null +++ b/src/Umbraco.Core/HealthChecks/Checks/Security/CspCheck.cs @@ -0,0 +1,31 @@ +// Copyright (c) Umbraco. +// See LICENSE for more details. + +using Umbraco.Cms.Core.Hosting; +using Umbraco.Cms.Core.Services; + +namespace Umbraco.Cms.Core.HealthChecks.Checks.Security; + +/// +/// Health check for the recommended production setup regarding the content-security-policy header. +/// +[HealthCheck( + "10BEBF47-C128-4C5E-9680-5059BEAFBBDF", + "Content Security Policy (CSP)", + Description = "Checks whether the site contains a Content-Security-Policy (CSP) header.", + Group = "Security")] +public class CspCheck : BaseHttpHeaderCheck +{ + private const string LocalizationPrefix = "contentSecurityPolicy"; + + /// + /// Initializes a new instance of the class. + /// + public CspCheck(IHostingEnvironment hostingEnvironment, ILocalizedTextService textService) + : base(hostingEnvironment, textService, "Content-Security-Policy", LocalizationPrefix, false, false) + { + } + + /// + protected override string ReadMoreLink => Constants.HealthChecks.DocumentationLinks.Security.CspHeaderCheck; +} From 3a9ef3810bdc063be16bded4877957065e964dbc Mon Sep 17 00:00:00 2001 From: Peter <45105665+PeterKvayt@users.noreply.github.com> Date: Wed, 14 Aug 2024 22:07:36 +0200 Subject: [PATCH 03/14] Making method ExecuteAsync virtual. (#16496) Co-authored-by: Kvyatkovsky, Petr --- .../HostedServices/RecurringHostedServiceBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Infrastructure/HostedServices/RecurringHostedServiceBase.cs b/src/Umbraco.Infrastructure/HostedServices/RecurringHostedServiceBase.cs index a35f7aa956ec..c6f21738c2d8 100644 --- a/src/Umbraco.Infrastructure/HostedServices/RecurringHostedServiceBase.cs +++ b/src/Umbraco.Infrastructure/HostedServices/RecurringHostedServiceBase.cs @@ -129,7 +129,7 @@ public virtual Task StopAsync(CancellationToken cancellationToken) /// Executes the task. /// /// The task state. - public async void ExecuteAsync(object? state) + public virtual async void ExecuteAsync(object? state) { try { From 80b8b2a4ed8a9a247618f6e53561f797f6aec173 Mon Sep 17 00:00:00 2001 From: Jason Elkin Date: Thu, 15 Aug 2024 09:51:27 +0200 Subject: [PATCH 04/14] Issue-15712: MemberDefaultLockoutTimeInMinutes fix. --- src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs b/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs index c19053240dbf..624c0eeeb1d9 100644 --- a/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs +++ b/src/Umbraco.Infrastructure/Security/IdentityMapDefinition.cs @@ -112,7 +112,7 @@ private void Map(IMember source, MemberIdentityUser target) target.PasswordConfig = source.PasswordConfiguration; target.IsApproved = source.IsApproved; target.SecurityStamp = source.SecurityStamp; - DateTime? lockedOutUntil = source.LastLockoutDate?.AddMinutes(_securitySettings.UserDefaultLockoutTimeInMinutes); + DateTime? lockedOutUntil = source.LastLockoutDate?.AddMinutes(_securitySettings.MemberDefaultLockoutTimeInMinutes); target.LockoutEnd = source.IsLockedOut ? (lockedOutUntil ?? DateTime.MaxValue).ToUniversalTime() : null; target.Comments = source.Comments; target.LastLockoutDateUtc = source.LastLockoutDate == DateTime.MinValue From 9338395a59b767852e967de2a3020eca11214583 Mon Sep 17 00:00:00 2001 From: Emanuel Gustafzon <104900900+EmanuelGustafzon@users.noreply.github.com> Date: Fri, 16 Aug 2024 21:59:10 +0200 Subject: [PATCH 05/14] Stripped username before login (#16921) * Stripped username before login --- src/Umbraco.Web.Common/Security/UmbracoSignInManager.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.Common/Security/UmbracoSignInManager.cs b/src/Umbraco.Web.Common/Security/UmbracoSignInManager.cs index f0ab7e02e29c..b0b2622e168d 100644 --- a/src/Umbraco.Web.Common/Security/UmbracoSignInManager.cs +++ b/src/Umbraco.Web.Common/Security/UmbracoSignInManager.cs @@ -165,7 +165,8 @@ public override async Task PasswordSignInAsync(TUser user, string public override async Task PasswordSignInAsync(string userName, string password, bool isPersistent, bool lockoutOnFailure) { // override to handle logging/events - TUser? user = await UserManager.FindByNameAsync(userName); + string strippedUsername = userName.Trim(); + TUser? user = await UserManager.FindByNameAsync(strippedUsername); if (user == null) { return await HandleSignIn(null, userName, SignInResult.Failed); From 3b6fbf1a4cfff9c08617aa404ab99df4a0c48dec Mon Sep 17 00:00:00 2001 From: Matthew Care Date: Sat, 17 Aug 2024 16:00:24 +0200 Subject: [PATCH 06/14] Cache a dictionary of dictionaries (#15908) * Re-commit change Re-commit change after merge * Fix issues after merge Update usings after merge * Re-delete obsolete Remove the obsolete method --- src/Umbraco.Web.Common/UmbracoHelper.cs | 64 +++++++++++++++++-------- 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web.Common/UmbracoHelper.cs b/src/Umbraco.Web.Common/UmbracoHelper.cs index ec726148ecc6..9b1a9c627527 100644 --- a/src/Umbraco.Web.Common/UmbracoHelper.cs +++ b/src/Umbraco.Web.Common/UmbracoHelper.cs @@ -4,6 +4,7 @@ using Umbraco.Cms.Core.Models.PublishedContent; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Core.Templates; +using Umbraco.Extensions; namespace Umbraco.Cms.Web.Common; @@ -18,7 +19,7 @@ public class UmbracoHelper private readonly IUmbracoComponentRenderer _componentRenderer; private readonly ICultureDictionaryFactory _cultureDictionaryFactory; private readonly IPublishedContentQuery _publishedContentQuery; - private ICultureDictionary? _cultureDictionary; + private readonly Dictionary _cultureDictionaries = []; private IPublishedContent? _currentPage; @@ -103,29 +104,29 @@ public async Task RenderTemplateAsync(int contentId, int? al /// /// Returns the dictionary value for the key specified /// - /// - /// - public string? GetDictionaryValue(string key) => CultureDictionary[key]; + /// Key of dictionary item. + /// The dictionary value, should one exist. + public string? GetDictionaryValue(string key) => GetDictionaryValue(key, Thread.CurrentThread.CurrentUICulture); /// /// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value /// - /// key of dictionary item + /// Key of dictionary item. /// the specific culture on which the result well be back upon - /// + /// The dictionary value, should one exist. public string? GetDictionaryValue(string key, CultureInfo specificCulture) { - _cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture); - return GetDictionaryValue(key); + ICultureDictionary cultureDictionary = GetCultureDictionary(specificCulture); + return cultureDictionary[key]; } /// /// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value /// - /// key of dictionary item - /// fall back text if dictionary item is empty - Name altText to match Umbraco.Field - /// + /// key of dictionary item. + /// fall back text if dictionary item is empty - Name altText to match Umbraco.Field. + /// Returns the dictionary value, or a default value if none exists. public string GetDictionaryValueOrDefault(string key, string defaultValue) { var dictionaryValue = GetDictionaryValue(key); @@ -140,26 +141,51 @@ public string GetDictionaryValueOrDefault(string key, string defaultValue) /// /// Returns the dictionary value for the key specified, and if empty returns the specified default fall back value /// - /// key of dictionary item - /// the specific culture on which the result well be back upon - /// fall back text if dictionary item is empty - Name altText to match Umbraco.Field - /// + /// Key of dictionary item. + /// The specific culture on which the result well be back upon. + /// Fall back text if dictionary item is empty - Name altText to match Umbraco.Field. + /// Returns the dictionary value, or a default value if none exists. public string GetDictionaryValueOrDefault(string key, CultureInfo specificCulture, string defaultValue) { - _cultureDictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture); - var dictionaryValue = GetDictionaryValue(key); + var dictionaryValue = GetDictionaryValue(key, specificCulture); if (string.IsNullOrWhiteSpace(dictionaryValue)) { dictionaryValue = defaultValue; } + return dictionaryValue; } + /// + /// Gets the ICultureDictionary for the current UI Culture for access to dictionary items + /// + public ICultureDictionary CultureDictionary => GetCultureDictionary(Thread.CurrentThread.CurrentUICulture); /// - /// Returns the ICultureDictionary for access to dictionary items + /// Gets the ICultureDictionary for access to dictionary items for a specific culture /// - public ICultureDictionary CultureDictionary => _cultureDictionary ??= _cultureDictionaryFactory.CreateDictionary(); + /// The culture of the culture dictionary you want to retrieve. + /// Returns the culture dictionary for the specified culture. + public ICultureDictionary GetCultureDictionary(CultureInfo specificCulture) + { + CreateCultureDictionary(specificCulture); + return _cultureDictionaries.GetValue(specificCulture)!; + } + + /// + /// Creates a culture dictionary for a specific culture if it doesn't already exist + /// + /// The culture to create a culture dictionary for. + internal void CreateCultureDictionary(CultureInfo specificCulture) + { + if (_cultureDictionaries.ContainsKey(specificCulture)) + { + return; + } + + ICultureDictionary dictionary = _cultureDictionaryFactory.CreateDictionary(specificCulture); + _cultureDictionaries.Add(specificCulture, dictionary); + } #endregion From e8051978e975deafe57511d8939c003ea2347a94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Aug 2024 09:11:32 +0000 Subject: [PATCH 07/14] Bump axios from 1.6.5 to 1.7.4 in /tests/Umbraco.Tests.AcceptanceTest Bumps [axios](https://github.com/axios/axios) from 1.6.5 to 1.7.4. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v1.6.5...v1.7.4) --- updated-dependencies: - dependency-name: axios dependency-type: indirect ... Signed-off-by: dependabot[bot] --- tests/Umbraco.Tests.AcceptanceTest/package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json index 264945f43c03..80c133b99623 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/package-lock.json +++ b/tests/Umbraco.Tests.AcceptanceTest/package-lock.json @@ -182,12 +182,12 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } From 862e45eca3710f56446cb214dee5d174fb193b9e Mon Sep 17 00:00:00 2001 From: Jason Elkin Date: Thu, 22 Aug 2024 21:01:21 +0100 Subject: [PATCH 08/14] Ignore Visual Studio's generated launchSettings file. --- tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/.gitignore diff --git a/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/.gitignore b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/.gitignore new file mode 100644 index 000000000000..ff99115ae5ae --- /dev/null +++ b/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/.gitignore @@ -0,0 +1,2 @@ +# Ignore Visual Studio's generated launchSettings file. +Properties/launchSettings.json From 385a5345b1dcd1fbc20afb854cfeff1c36f52210 Mon Sep 17 00:00:00 2001 From: Terence Burridge Date: Wed, 20 Mar 2024 17:58:48 +0000 Subject: [PATCH 09/14] Update valid reasons not to have a template on a content node to include having a redirect field --- src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs b/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs index d8fbca45d48e..c46bb890b147 100644 --- a/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs +++ b/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs @@ -128,11 +128,12 @@ private async Task CheckNoTemplateAsync( IPublishedRequest request = def.PublishedRequest; // Here we need to check if there is no hijacked route and no template assigned but there is a content item. - // If this is the case we want to return a blank page. + // If this is the case we want to return a blank page, the only exception being if the content item has a redirect field present. // We also check if templates have been disabled since if they are then we're allowed to render even though there's no template, // for example for json rendering in headless. if (request.HasPublishedContent() && !request.HasTemplate() + && !request.IsRedirect() && !_umbracoFeatures.Disabled.DisableTemplates && !hasHijackedRoute) { From 148d51bf8c7b1bbd48555f24320e7d26f61acfd5 Mon Sep 17 00:00:00 2001 From: Emma L Garland Date: Tue, 27 Aug 2024 11:29:02 +0100 Subject: [PATCH 10/14] Remove warnings from Umbraco.Web.UI (#16958) * Fixed warning SA1119 for Umbraco.Web.UI project (unnecessary parenthesis) * Remove parenthesis (startup no longer exists) --------- Co-authored-by: Emma Garland --- src/Umbraco.Web.UI/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI/Program.cs b/src/Umbraco.Web.UI/Program.cs index e91f6ba60de8..aa718b5ec337 100644 --- a/src/Umbraco.Web.UI/Program.cs +++ b/src/Umbraco.Web.UI/Program.cs @@ -11,7 +11,7 @@ await app.BootUmbracoAsync(); -#if (UseHttpsRedirect) +#if UseHttpsRedirect app.UseHttpsRedirection(); #endif From 98e9a300bc81e485eb2afc95af93c28ad3a1cea9 Mon Sep 17 00:00:00 2001 From: Emma L Garland Date: Tue, 27 Aug 2024 17:56:09 +0100 Subject: [PATCH 11/14] Treat warnings as errors for initial projects (#15019) * Treat warnings as errors for Umbraco.Cms, Umbraco.Cms.Api.Common and Umbraco.Cms.Api.Delivery projects. * Treat warnings as errors for Umbraco.Cms.Imaging.ImageSharp and Umbraco.Cms.Imaging.ImageSharp2 projects * Treat warnings as errors for Umbraco.Cms.Persistence.EFCore.Sqlite, Umbraco.Cms.Persistence.EFCore.SqlServer and Umbraco.Cms.StaticAssets * Treat warnings as errors for Umbraco.Cms.Targets * Treat warnings as errors for templates/Umbraco.Templates and Umbraco.JsonSchema * More projects with warnings as errors. * Reverted warnings as errors due to some file changes since the update. * Remove unwanted tag * Removed warnings as errors on TestData project * Implement warnings as errors in props file, and exclude specific warnings where appropriate as per PR review suggestions. * Reverted spaces * Revert "Reverted spaces" This reverts commit 3734c45e2270c3324768b33e459aefcc6a8c4739. * Update sdk version to fully support Umbraco.code 2.2.0 dependency on Microsoft.CodeAnalysis.CSharp.Workspaces 4.10.0 * Ignore PathToLongErrors for now in static assets --------- Co-authored-by: Emma Garland Co-authored-by: Sven Geusens --- Directory.Build.props | 1 + global.json | 2 +- src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj | 1 - .../Umbraco.Cms.Api.Delivery.csproj | 5 ++++- .../Umbraco.Cms.Api.Management.csproj | 5 ++++- .../Umbraco.Cms.Imaging.ImageSharp.csproj | 1 - .../Umbraco.Cms.Imaging.ImageSharp2.csproj | 1 - .../Umbraco.Cms.Persistence.EFCore.SqlServer.csproj | 1 - .../Umbraco.Cms.Persistence.EFCore.Sqlite.csproj | 1 - .../Umbraco.Cms.Persistence.EFCore.csproj | 8 ++++++-- .../Umbraco.Cms.Persistence.SqlServer.csproj | 7 ++++++- .../Umbraco.Cms.Persistence.Sqlite.csproj | 5 ++++- .../Umbraco.Cms.StaticAssets.csproj | 7 ++++++- src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj | 6 +++++- src/Umbraco.Cms/Umbraco.Cms.csproj | 1 - src/Umbraco.Core/Umbraco.Core.csproj | 5 ++++- src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj | 5 ++++- src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj | 5 ++++- .../Umbraco.PublishedCache.NuCache.csproj | 5 ++++- src/Umbraco.Web.Common/Umbraco.Web.Common.csproj | 5 ++++- src/Umbraco.Web.UI/Umbraco.Web.UI.csproj | 4 ++++ src/Umbraco.Web.Website/Umbraco.Web.Website.csproj | 5 ++++- tests/Umbraco.TestData/Umbraco.TestData.csproj | 5 +++++ .../Umbraco.Tests.Benchmarks.csproj | 5 ++++- tests/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj | 5 ++++- .../Umbraco.Tests.Integration.csproj | 5 ++++- .../Umbraco.Tests.UnitTests.csproj | 5 ++++- tools/Umbraco.JsonSchema/Umbraco.JsonSchema.csproj | 5 ++++- 28 files changed, 90 insertions(+), 26 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 5f3055125f9c..81e3c40a9bf8 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -14,6 +14,7 @@ en-US enable nullable + true enable true false diff --git a/global.json b/global.json index 391ba3c2a30b..e972eb192ac6 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.100", + "version": "8.0.300", "rollForward": "latestFeature" } } diff --git a/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj b/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj index 523d6f4982bf..a73fc1657455 100644 --- a/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj +++ b/src/Umbraco.Cms.Api.Common/Umbraco.Cms.Api.Common.csproj @@ -3,7 +3,6 @@ Umbraco CMS - API Common Contains the bits and pieces that are shared between the Umbraco CMS APIs. - diff --git a/src/Umbraco.Cms.Api.Delivery/Umbraco.Cms.Api.Delivery.csproj b/src/Umbraco.Cms.Api.Delivery/Umbraco.Cms.Api.Delivery.csproj index 8948a49a1a7b..5e32b81eeb25 100644 --- a/src/Umbraco.Cms.Api.Delivery/Umbraco.Cms.Api.Delivery.csproj +++ b/src/Umbraco.Cms.Api.Delivery/Umbraco.Cms.Api.Delivery.csproj @@ -3,7 +3,10 @@ Umbraco CMS - Delivery API Contains the presentation layer for the Umbraco CMS Delivery API. - + + + ASP0019 + diff --git a/src/Umbraco.Cms.Api.Management/Umbraco.Cms.Api.Management.csproj b/src/Umbraco.Cms.Api.Management/Umbraco.Cms.Api.Management.csproj index 37ab3611deb9..88ee0cef62e3 100644 --- a/src/Umbraco.Cms.Api.Management/Umbraco.Cms.Api.Management.csproj +++ b/src/Umbraco.Cms.Api.Management/Umbraco.Cms.Api.Management.csproj @@ -7,7 +7,10 @@ Umbraco.Cms.Api.Management Umbraco.Cms.Api.Management - + + + false + diff --git a/src/Umbraco.Cms.Imaging.ImageSharp/Umbraco.Cms.Imaging.ImageSharp.csproj b/src/Umbraco.Cms.Imaging.ImageSharp/Umbraco.Cms.Imaging.ImageSharp.csproj index 549ea5cb4001..77aed066d81c 100644 --- a/src/Umbraco.Cms.Imaging.ImageSharp/Umbraco.Cms.Imaging.ImageSharp.csproj +++ b/src/Umbraco.Cms.Imaging.ImageSharp/Umbraco.Cms.Imaging.ImageSharp.csproj @@ -3,7 +3,6 @@ Umbraco CMS - Imaging - ImageSharp Adds imaging support using ImageSharp/ImageSharp.Web to Umbraco CMS. - diff --git a/src/Umbraco.Cms.Imaging.ImageSharp2/Umbraco.Cms.Imaging.ImageSharp2.csproj b/src/Umbraco.Cms.Imaging.ImageSharp2/Umbraco.Cms.Imaging.ImageSharp2.csproj index c51308267545..16bac191d5ec 100644 --- a/src/Umbraco.Cms.Imaging.ImageSharp2/Umbraco.Cms.Imaging.ImageSharp2.csproj +++ b/src/Umbraco.Cms.Imaging.ImageSharp2/Umbraco.Cms.Imaging.ImageSharp2.csproj @@ -3,7 +3,6 @@ Umbraco CMS - Imaging - ImageSharp 2 Adds imaging support using ImageSharp/ImageSharp.Web version 2 to Umbraco CMS. - diff --git a/src/Umbraco.Cms.Persistence.EFCore.SqlServer/Umbraco.Cms.Persistence.EFCore.SqlServer.csproj b/src/Umbraco.Cms.Persistence.EFCore.SqlServer/Umbraco.Cms.Persistence.EFCore.SqlServer.csproj index 7e6fc6153d94..a43a5f01f225 100644 --- a/src/Umbraco.Cms.Persistence.EFCore.SqlServer/Umbraco.Cms.Persistence.EFCore.SqlServer.csproj +++ b/src/Umbraco.Cms.Persistence.EFCore.SqlServer/Umbraco.Cms.Persistence.EFCore.SqlServer.csproj @@ -3,7 +3,6 @@ Umbraco CMS - Persistence - Entity Framework Core - SQL Server migrations Adds support for Entity Framework Core SQL Server migrations to Umbraco CMS. - diff --git a/src/Umbraco.Cms.Persistence.EFCore.Sqlite/Umbraco.Cms.Persistence.EFCore.Sqlite.csproj b/src/Umbraco.Cms.Persistence.EFCore.Sqlite/Umbraco.Cms.Persistence.EFCore.Sqlite.csproj index 36751bb86947..f847ef478601 100644 --- a/src/Umbraco.Cms.Persistence.EFCore.Sqlite/Umbraco.Cms.Persistence.EFCore.Sqlite.csproj +++ b/src/Umbraco.Cms.Persistence.EFCore.Sqlite/Umbraco.Cms.Persistence.EFCore.Sqlite.csproj @@ -3,7 +3,6 @@ Umbraco CMS - Persistence - Entity Framework Core - SQLite migrations Adds support for Entity Framework Core SQLite migrations to Umbraco CMS. - diff --git a/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj b/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj index 4500c2812b74..d5fc7229b04f 100644 --- a/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj +++ b/src/Umbraco.Cms.Persistence.EFCore/Umbraco.Cms.Persistence.EFCore.csproj @@ -3,8 +3,12 @@ Umbraco CMS - Persistence - Entity Framework Core Adds support for Entity Framework Core to Umbraco CMS. - - + + + IDE0270,CS0108,CS1998 + + diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj b/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj index 75e2a6fe602a..d62aea6ceb78 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj +++ b/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj @@ -3,7 +3,12 @@ Umbraco CMS - Persistence - SQL Server Adds support for SQL Server to Umbraco CMS. - + + + SA1405,SA1121,SA1117,SA1116,IDE1006,CS0618,IDE0270,IDE0057,IDE0054,CSO618,IDE0048,CS1574 + diff --git a/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj b/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj index f9755aad616c..0c39c66d6453 100644 --- a/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj +++ b/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj @@ -3,7 +3,10 @@ Umbraco CMS - Persistence - SQLite Adds support for SQLite to Umbraco CMS. - + + + CS0114 + diff --git a/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj b/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj index ff487ca66aea..80b7bc0211b0 100644 --- a/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj +++ b/src/Umbraco.Cms.StaticAssets/Umbraco.Cms.StaticAssets.csproj @@ -6,6 +6,11 @@ / + + + NU5123 + + @@ -66,4 +71,4 @@ - + \ No newline at end of file diff --git a/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj b/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj index b83a582ade9a..e9e0df050df0 100644 --- a/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj +++ b/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj @@ -5,7 +5,11 @@ false false - + + + IDE0270,CS0108,CS1998 + diff --git a/src/Umbraco.Cms/Umbraco.Cms.csproj b/src/Umbraco.Cms/Umbraco.Cms.csproj index 39a3b03c56bf..3bc60ebd12f8 100644 --- a/src/Umbraco.Cms/Umbraco.Cms.csproj +++ b/src/Umbraco.Cms/Umbraco.Cms.csproj @@ -5,7 +5,6 @@ false false - diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index e0d0bd79fa1c..e4b3a7cd042f 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -5,7 +5,10 @@ Contains the core assembly needed to run Umbraco CMS. Umbraco.Cms.Core - + + + false + diff --git a/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj b/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj index 7e28eb69713f..e036605449cc 100644 --- a/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj +++ b/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj @@ -5,7 +5,10 @@ Adds Examine searching support using Lucene to Umbraco CMS. Umbraco.Cms.Infrastructure.Examine - + + + CS0618 + diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj index a3b64b1cc57c..cca5a4395406 100644 --- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj +++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj @@ -5,7 +5,10 @@ Contains the infrastructure assembly needed to run Umbraco CMS. Umbraco.Cms.Infrastructure - + + + false + $(DefineConstants);TRACE_SCOPES diff --git a/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj b/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj index 4894759e5f51..04986712c806 100644 --- a/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj +++ b/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj @@ -5,7 +5,10 @@ Contains the published cache assembly needed to run Umbraco CMS. Umbraco.Cms.Infrastructure.PublishedCache - + + + false + diff --git a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj index 4fa0721a684e..6de2cd127831 100644 --- a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj +++ b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj @@ -5,7 +5,10 @@ Contains the web assembly needed to run Umbraco CMS. Umbraco.Cms.Web.Common - + + + false + diff --git a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj index acd631e1ad5e..c22b5ae7392e 100644 --- a/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj +++ b/src/Umbraco.Web.UI/Umbraco.Web.UI.csproj @@ -5,6 +5,10 @@ false + + + SA1119 + diff --git a/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj b/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj index 31c057e7b903..8ee1e80bb2a0 100644 --- a/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj +++ b/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj @@ -5,7 +5,10 @@ Contains the website assembly needed to run the frontend of Umbraco CMS. Umbraco.Cms.Web.Website - + + + false + diff --git a/tests/Umbraco.TestData/Umbraco.TestData.csproj b/tests/Umbraco.TestData/Umbraco.TestData.csproj index 7e19740a31aa..2b8fc3fca817 100644 --- a/tests/Umbraco.TestData/Umbraco.TestData.csproj +++ b/tests/Umbraco.TestData/Umbraco.TestData.csproj @@ -1,4 +1,9 @@ + + + CS0618,IDE1006,IDE0057 + diff --git a/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj b/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj index 189d69ac31f8..5b8f2b3b569a 100644 --- a/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj +++ b/tests/Umbraco.Tests.Benchmarks/Umbraco.Tests.Benchmarks.csproj @@ -5,7 +5,10 @@ false false - + + + false + diff --git a/tests/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj b/tests/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj index bf0dc9ddc12f..24e0dce808d7 100644 --- a/tests/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj +++ b/tests/Umbraco.Tests.Common/Umbraco.Tests.Common.csproj @@ -7,7 +7,10 @@ true $(BaseEnablePackageValidation) - + + + false + diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj b/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj index b7ab21b0628d..a04ee45648a3 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj +++ b/tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj @@ -9,7 +9,10 @@ $(BaseEnablePackageValidation) NU5100 - + + + false + diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj index a411bad38c61..6986e03494de 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Tests.UnitTests.csproj @@ -5,7 +5,10 @@ false false - + + + false + diff --git a/tools/Umbraco.JsonSchema/Umbraco.JsonSchema.csproj b/tools/Umbraco.JsonSchema/Umbraco.JsonSchema.csproj index ce5001608fb8..471ebff802ef 100644 --- a/tools/Umbraco.JsonSchema/Umbraco.JsonSchema.csproj +++ b/tools/Umbraco.JsonSchema/Umbraco.JsonSchema.csproj @@ -4,7 +4,10 @@ false false - + + + false + From 7acce83c83b9809a4746d056fb45bd3938327696 Mon Sep 17 00:00:00 2001 From: marwaldv Date: Mon, 20 Nov 2023 17:36:07 +0100 Subject: [PATCH 12/14] Update LogDto.cs fix: issue resolved, where content saving breaks due to saving to umbracoLog with error message like that: String or binary data would be truncated in table 'dto.umbracoLog', column 'parameters'. Truncated value: 'English (United States), German (Switzerland), French (France), Italian (Italy), Arabic (Iraq), Pers'... --- src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs b/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs index 89bfeb8612e0..62f8232da5e4 100644 --- a/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs +++ b/src/Umbraco.Infrastructure/Persistence/Dtos/LogDto.cs @@ -55,6 +55,6 @@ internal class LogDto /// [Column("parameters")] [NullSetting(NullSetting = NullSettings.Null)] - [Length(500)] + [Length(4000)] public string? Parameters { get; set; } } From 3d5e70654b142d1ee3f786f7533667c069865d41 Mon Sep 17 00:00:00 2001 From: kasparboelkjeldsen <137318845+kasparboelkjeldsen@users.noreply.github.com> Date: Mon, 9 Sep 2024 08:06:52 +0200 Subject: [PATCH 13/14] ModelsGenerator to IModelsGenerator in BuildModelsBuilderController (#16919) * ModelsGenerator to IModelsGenerator in BuildModelsBuilderController * Added obsolete constructors for backwards compatibility --- .../BuildModelsBuilderController.cs | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/ModelsBuilder/BuildModelsBuilderController.cs b/src/Umbraco.Cms.Api.Management/Controllers/ModelsBuilder/BuildModelsBuilderController.cs index 9d5f67cb1fcb..14adb70c3b60 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/ModelsBuilder/BuildModelsBuilderController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/ModelsBuilder/BuildModelsBuilderController.cs @@ -1,8 +1,9 @@ -using System; +using System; using System.Threading.Tasks; using Asp.Versioning; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Infrastructure.ModelsBuilder; @@ -16,12 +17,13 @@ public class BuildModelsBuilderController : ModelsBuilderControllerBase { private ModelsBuilderSettings _modelsBuilderSettings; private readonly ModelsGenerationError _mbErrors; - private readonly ModelsGenerator _modelGenerator; + private readonly IModelsGenerator _modelGenerator; + [ActivatorUtilitiesConstructor] public BuildModelsBuilderController( IOptionsMonitor modelsBuilderSettings, ModelsGenerationError mbErrors, - ModelsGenerator modelGenerator) + IModelsGenerator modelGenerator) { _mbErrors = mbErrors; _modelGenerator = modelGenerator; @@ -30,6 +32,26 @@ public BuildModelsBuilderController( modelsBuilderSettings.OnChange(x => _modelsBuilderSettings = x); } + [Obsolete("Please use the constructor that accepts IModelsGenerator only. Will be removed in V16.")] + public BuildModelsBuilderController( + IOptionsMonitor modelsBuilderSettings, + ModelsGenerationError mbErrors, + ModelsGenerator modelGenerator) + : this(modelsBuilderSettings, mbErrors, (IModelsGenerator)modelGenerator) + { + } + + // this constructor is required for the DI, otherwise it'll throw an "Ambiguous Constructor" errors at boot time. + [Obsolete("Please use the constructor that accepts IModelsGenerator only. Will be removed in V16.")] + public BuildModelsBuilderController( + IOptionsMonitor modelsBuilderSettings, + ModelsGenerationError mbErrors, + IModelsGenerator modelGenerator, + ModelsGenerator notUsed) + : this(modelsBuilderSettings, mbErrors, modelGenerator) + { + } + [HttpPost("build")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status428PreconditionRequired)] From 862820c6a6bfe2aac4127623b9238cfea739d59c Mon Sep 17 00:00:00 2001 From: Emma L Garland Date: Tue, 10 Sep 2024 15:17:29 +0100 Subject: [PATCH 14/14] Resolved more warnings, and marked more warning types as errors (#16990) * Fix warnings SA1111, SA1028, SA1500, IDE1270 in Umbraco.Web.Website, and updated rules. * Remove warnings: IDE0270: Null check can be simplified * More SqlServer project warnings resolved * CS0105 namespace appeared already * Suppress warning until implementation: #pragma warning disable CS0162 // Unreachable code detected #pragma warning disable CS0618 // Type or member is obsolete CS0162 remove unreachable code SA1028 remove trailing whitespace SA1106 no empty statements CS1570 malformed XML CS1572 corrected xml parameter CS1573 param tag added IDE0007 var not explicit IDE0008 explicit not var IDE0057 simplify substring IDE0074 compound assignment CA1825 array.empty Down to 3479 warnings --- .../Indexer/RebuildIndexerController.cs | 4 +- .../Security/BackOfficeController.cs | 4 +- .../MediaTypeEditingPresentationFactory.cs | 3 +- ...SqliteEFCoreDistributedLockingMechanism.cs | 14 +- .../LocalDb.cs | 122 +++++++++++++----- src/Umbraco.Core/Logging/DisposableTimer.cs | 4 +- .../Models/Membership/UserGroup.cs | 2 - .../ITrackedReferencesRepository.cs | 4 +- .../JsonPropertyIndexValueFactoryBase.cs | 1 - .../Routing/ContentFinderByUrlAndTemplate.cs | 4 +- .../Routing/DefaultUrlProvider.cs | 2 +- src/Umbraco.Core/Services/ContentService.cs | 44 ++----- src/Umbraco.Core/Services/DataTypeService.cs | 4 +- src/Umbraco.Core/Services/IAuditService.cs | 11 +- .../Services/IContentPublishingService.cs | 4 +- src/Umbraco.Core/Services/IRelationService.cs | 7 +- .../Services/ITrackedReferencesService.cs | 2 +- .../ImportExport/ContentTypeImportService.cs | 2 +- .../Services/LocalizationService.cs | 4 +- .../RecycleBin/RecycleBinQueryResultType.cs | 2 +- .../Services/RedirectUrlService.cs | 8 +- src/Umbraco.Core/Services/UserService.cs | 12 +- .../Services/WebProfilerService.cs | 4 + .../BackgroundJobs/IRecurringBackgroundJob.cs | 14 +- .../Jobs/HealthCheckNotifierJob.cs | 1 + .../BackgroundJobs/Jobs/LogScrubberJob.cs | 8 +- .../InstructionProcessJob.cs | 2 +- .../Install/FilePermissionHelper.cs | 15 +-- .../Logging/Viewer/LogViewerConfig.cs | 2 - .../Upgrade/UmbracoPremigrationPlan.cs | 1 - .../Repositories/Implement/UserRepository.cs | 8 +- .../ImageCropperPropertyEditor.cs | 1 - .../BackOfficeClaimsPrincipalFactory.cs | 1 + .../Security/BackOfficeIdentityUser.cs | 11 +- ...acoBuilderDependencyInjectionExtensions.cs | 6 +- .../UmbracoBuilderExtensions.cs | 3 +- .../Routing/PublicAccessRequestHandler.cs | 5 +- .../Routing/UmbracoRouteValuesFactory.cs | 13 +- .../Umbraco.Web.Website.csproj | 7 +- .../ViewEngines/ProfilingViewEngine.cs | 2 + .../EnumeratorBenchmarks.cs | 4 +- .../HashFromStreams.cs | 2 +- .../Implementations/TestHelper.cs | 15 +-- .../UmbracoTestServerTestBase.cs | 2 +- .../Testing/TestWebProfilerRepository.cs | 2 +- .../Repositories/ContentTypeRepositoryTest.cs | 2 +- .../Services/LanguageServiceTests.cs | 6 +- .../Umbraco.Core/Components/ComponentTests.cs | 4 +- .../InstructionProcessJobTests.cs | 2 +- .../Jobs/TempFileCleanupJobTests.cs | 2 +- 50 files changed, 205 insertions(+), 204 deletions(-) diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Indexer/RebuildIndexerController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Indexer/RebuildIndexerController.cs index b64c252a1ab8..97131adcb904 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Indexer/RebuildIndexerController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Indexer/RebuildIndexerController.cs @@ -1,4 +1,4 @@ -using Asp.Versioning; +using Asp.Versioning; using Examine; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -38,7 +38,7 @@ public RebuildIndexerController( [ProducesResponseType(StatusCodes.Status200OK)] public async Task Rebuild(CancellationToken cancellationToken, string indexName) { - if (!_examineManager.TryGetIndex(indexName, out var index)) + if (!_examineManager.TryGetIndex(indexName, out IIndex? index)) { var invalidModelProblem = new ProblemDetails { diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Security/BackOfficeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/Security/BackOfficeController.cs index fd6d9116c5c8..5a247a647c6a 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Security/BackOfficeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Security/BackOfficeController.cs @@ -1,4 +1,4 @@ -using System.Security.Claims; +using System.Security.Claims; using Asp.Versioning; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Authentication; @@ -217,7 +217,7 @@ public async Task LinkLoginKey(string provider) /// /// Called when a user links an external login provider in the back office /// - /// + /// /// // This method is marked as AllowAnonymous and protected with a secret (linkKey) inside the model for the following reasons // - when a js client uses the fetch api (or old ajax requests) they can send a bearer token diff --git a/src/Umbraco.Cms.Api.Management/Factories/MediaTypeEditingPresentationFactory.cs b/src/Umbraco.Cms.Api.Management/Factories/MediaTypeEditingPresentationFactory.cs index 11b2d1813411..c5cd70ed4995 100644 --- a/src/Umbraco.Cms.Api.Management/Factories/MediaTypeEditingPresentationFactory.cs +++ b/src/Umbraco.Cms.Api.Management/Factories/MediaTypeEditingPresentationFactory.cs @@ -1,5 +1,4 @@ -using Umbraco.Cms.Api.Management.ViewModels.MediaType; -using Umbraco.Cms.Core.Models; +using Umbraco.Cms.Api.Management.ViewModels.MediaType; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.ContentTypeEditing; using Umbraco.Cms.Core.Services; diff --git a/src/Umbraco.Cms.Persistence.EFCore/Locking/SqliteEFCoreDistributedLockingMechanism.cs b/src/Umbraco.Cms.Persistence.EFCore/Locking/SqliteEFCoreDistributedLockingMechanism.cs index 23b3d8d41054..8308ae4d3a11 100644 --- a/src/Umbraco.Cms.Persistence.EFCore/Locking/SqliteEFCoreDistributedLockingMechanism.cs +++ b/src/Umbraco.Cms.Persistence.EFCore/Locking/SqliteEFCoreDistributedLockingMechanism.cs @@ -115,12 +115,7 @@ public override string ToString() // Mostly no-op just check that we didn't end up ReadUncommitted for real. private void ObtainReadLock() { - IEfCoreScope? efCoreScope = _parent._efCoreScopeAccessor.Value.AmbientScope; - - if (efCoreScope is null) - { - throw new PanicException("No current ambient scope"); - } + IEfCoreScope? efCoreScope = _parent._efCoreScopeAccessor.Value.AmbientScope ?? throw new PanicException("No current ambient scope"); efCoreScope.ExecuteWithContextAsync(async database => { @@ -136,12 +131,7 @@ private void ObtainReadLock() // lock occurs for entire database as opposed to row/table. private void ObtainWriteLock() { - IEfCoreScope? efCoreScope = _parent._efCoreScopeAccessor.Value.AmbientScope; - - if (efCoreScope is null) - { - throw new PanicException("No ambient scope"); - } + IEfCoreScope? efCoreScope = _parent._efCoreScopeAccessor.Value.AmbientScope ?? throw new PanicException("No ambient scope"); efCoreScope.ExecuteWithContextAsync(async database => { diff --git a/src/Umbraco.Cms.Persistence.SqlServer/LocalDb.cs b/src/Umbraco.Cms.Persistence.SqlServer/LocalDb.cs index 6fcdfca76a64..a8a6480c89fc 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/LocalDb.cs +++ b/src/Umbraco.Cms.Persistence.SqlServer/LocalDb.cs @@ -420,7 +420,13 @@ public bool DatabaseExists(string databaseName) /// public bool CreateDatabase(string databaseName, string filesPath) { - GetDatabaseFiles(databaseName, filesPath, out var logName, out _, out _, out var mdfFilename, + GetDatabaseFiles( + databaseName, + filesPath, + out var logName, + out _, + out _, + out var mdfFilename, out var ldfFilename); using (var conn = new SqlConnection(_masterCstr)) @@ -463,7 +469,9 @@ public bool DropDatabase(string databaseName) { conn.Open(); - SetCommand(cmd, @" + SetCommand( + cmd, + @" SELECT name, filename FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = @0 OR name = @0)", databaseName); @@ -554,11 +562,7 @@ public int DropDatabases(bool staleOnly = false) { conn.Open(); - var mdf = GetDatabase(cmd, databaseName); - if (mdf == null) - { - throw new InvalidOperationException("Database does not exist."); - } + var mdf = GetDatabase(cmd, databaseName) ?? throw new InvalidOperationException("Database does not exist."); DetachDatabase(cmd, databaseName); @@ -597,9 +601,12 @@ public void AttachDatabase(string databaseName, string filesPath) /// The LDF logical name. /// The MDF filename. /// The LDF filename. - public void GetFilenames(string databaseName, - out string? mdfName, out string? ldfName, - out string? mdfFilename, out string? ldfFilename) + public void GetFilenames( + string databaseName, + out string? mdfName, + out string? ldfName, + out string? mdfFilename, + out string? ldfFilename) { using (var conn = new SqlConnection(_masterCstr)) using (SqlCommand? cmd = conn.CreateCommand()) @@ -621,7 +628,9 @@ public void KillConnections(string databaseName) { conn.Open(); - SetCommand(cmd, @" + SetCommand( + cmd, + @" DECLARE @sql VARCHAR(MAX); SELECT @sql = COALESCE(@sql,'') + 'kill ' + CONVERT(VARCHAR, SPId) + ';' FROM master.sys.sysprocesses @@ -640,7 +649,9 @@ FROM master.sys.sysprocesses /// The full filename of the MDF file, if the database exists, otherwise null. private static string? GetDatabase(SqlCommand cmd, string databaseName) { - SetCommand(cmd, @" + SetCommand( + cmd, + @" SELECT name, filename FROM master.dbo.sysdatabases WHERE ('[' + name + ']' = @0 OR name = @0)", databaseName); @@ -707,7 +718,7 @@ private static void ExecuteDropDatabase(SqlCommand cmd, string databaseName, str File.Delete(mdf); } - ldf = ldf ?? GetLogFilename(mdf); + ldf ??= GetLogFilename(mdf); if (File.Exists(ldf)) { File.Delete(ldf); @@ -726,7 +737,7 @@ private static string GetLogFilename(string mdfFilename) throw new ArgumentException("Not a valid MDF filename (no .mdf extension).", nameof(mdfFilename)); } - return mdfFilename.Substring(0, mdfFilename.Length - ".mdf".Length) + "_log.ldf"; + return mdfFilename[..^".mdf".Length] + "_log.ldf"; } /// @@ -743,7 +754,9 @@ private static void DetachDatabase(SqlCommand cmd, string databaseName) var unused1 = cmd.ExecuteNonQuery(); - SetCommand(cmd, @" + SetCommand( + cmd, + @" EXEC sp_detach_db @dbname=@0", databaseName); @@ -758,8 +771,14 @@ private static void DetachDatabase(SqlCommand cmd, string databaseName) /// The directory containing database files. private static void AttachDatabase(SqlCommand cmd, string databaseName, string filesPath) { - GetDatabaseFiles(databaseName, filesPath, - out var logName, out _, out _, out var mdfFilename, out var ldfFilename); + GetDatabaseFiles( + databaseName, + filesPath, + out var logName, + out _, + out _, + out var mdfFilename, + out var ldfFilename); // cannot use parameters on CREATE DATABASE // ie "CREATE DATABASE @0 ..." does not work @@ -802,13 +821,19 @@ private static void SetCommand(SqlCommand cmd, string sql, params object[] args) /// The LDF logical name. /// The MDF filename. /// The LDF filename. - private void GetFilenames(SqlCommand cmd, string databaseName, - out string? mdfName, out string? ldfName, - out string? mdfFilename, out string? ldfFilename) + private void GetFilenames( + SqlCommand cmd, + string databaseName, + out string? mdfName, + out string? ldfName, + out string? mdfFilename, + out string? ldfFilename) { mdfName = ldfName = mdfFilename = ldfFilename = null; - SetCommand(cmd, @" + SetCommand( + cmd, + @" SELECT DB_NAME(database_id), type_desc, name, physical_name FROM master.sys.master_files WHERE database_id=DB_ID(@0)", @@ -854,21 +879,32 @@ FROM master.sys.master_files /// . /// Extensions are used eg to copy MyDatabase.mdf to MyDatabase.mdf.temp. /// - public void CopyDatabaseFiles(string databaseName, string filesPath, - string? targetDatabaseName = null, string? targetFilesPath = null, - string? sourceExtension = null, string? targetExtension = null, - bool overwrite = false, bool delete = false) + public void CopyDatabaseFiles( + string databaseName, + string filesPath, + string? targetDatabaseName = null, + string? targetFilesPath = null, + string? sourceExtension = null, + string? targetExtension = null, + bool overwrite = false, + bool delete = false) { var nop = (targetFilesPath == null || targetFilesPath == filesPath) && (targetDatabaseName == null || targetDatabaseName == databaseName) - && (sourceExtension == null && targetExtension == null || sourceExtension == targetExtension); + && ((sourceExtension == null && targetExtension == null) || sourceExtension == targetExtension); if (nop && delete == false) { return; } - GetDatabaseFiles(databaseName, filesPath, - out _, out _, out _, out var mdfFilename, out var ldfFilename); + GetDatabaseFiles( + databaseName, + filesPath, + out _, + out _, + out _, + out var mdfFilename, + out var ldfFilename); if (sourceExtension != null) { @@ -892,8 +928,14 @@ public void CopyDatabaseFiles(string databaseName, string filesPath, else { // copy or copy+delete ie move - GetDatabaseFiles(targetDatabaseName ?? databaseName, targetFilesPath ?? filesPath, - out _, out _, out _, out var targetMdfFilename, out var targetLdfFilename); + GetDatabaseFiles( + targetDatabaseName ?? databaseName, + targetFilesPath ?? filesPath, + out _, + out _, + out _, + out var targetMdfFilename, + out var targetLdfFilename); if (targetExtension != null) { @@ -936,8 +978,14 @@ public void CopyDatabaseFiles(string databaseName, string filesPath, /// public bool DatabaseFilesExist(string databaseName, string filesPath, string? extension = null) { - GetDatabaseFiles(databaseName, filesPath, - out _, out _, out _, out var mdfFilename, out var ldfFilename); + GetDatabaseFiles( + databaseName, + filesPath, + out _, + out _, + out _, + out var mdfFilename, + out var ldfFilename); if (extension != null) { @@ -958,10 +1006,14 @@ public bool DatabaseFilesExist(string databaseName, string filesPath, string? ex /// The base log filename (the LDF filename without the .ldf extension). /// The MDF filename. /// The LDF filename. - private static void GetDatabaseFiles(string databaseName, string filesPath, + private static void GetDatabaseFiles( + string databaseName, + string filesPath, out string logName, - out string baseFilename, out string baseLogFilename, - out string mdfFilename, out string ldfFilename) + out string baseFilename, + out string baseLogFilename, + out string mdfFilename, + out string ldfFilename) { logName = databaseName + "_log"; baseFilename = Path.Combine(filesPath, databaseName); diff --git a/src/Umbraco.Core/Logging/DisposableTimer.cs b/src/Umbraco.Core/Logging/DisposableTimer.cs index 087ae7adb625..7db20a006852 100644 --- a/src/Umbraco.Core/Logging/DisposableTimer.cs +++ b/src/Umbraco.Core/Logging/DisposableTimer.cs @@ -44,7 +44,7 @@ internal DisposableTimer( _endMessageArgs = endMessageArgs; _failMessageArgs = failMessageArgs; _thresholdMilliseconds = thresholdMilliseconds < 0 ? 0 : thresholdMilliseconds; - _timingId = Guid.NewGuid().ToString("N").Substring(0, 7); // keep it short-ish + _timingId = Guid.NewGuid().ToString("N")[..7]; // keep it short-ish if (thresholdMilliseconds == 0) { @@ -63,7 +63,7 @@ internal DisposableTimer( var args = new object[startMessageArgs.Length + 1]; startMessageArgs.CopyTo(args, 0); args[^1] = _timingId; - + if (_logger.IsEnabled(Microsoft.Extensions.Logging.LogLevel.Debug)) { logger.LogDebug(startMessage + " [Timing {TimingId}]", args); diff --git a/src/Umbraco.Core/Models/Membership/UserGroup.cs b/src/Umbraco.Core/Models/Membership/UserGroup.cs index c512702d54df..95f8dee7b854 100644 --- a/src/Umbraco.Core/Models/Membership/UserGroup.cs +++ b/src/Umbraco.Core/Models/Membership/UserGroup.cs @@ -58,8 +58,6 @@ public UserGroup(IShortStringHelper shortStringHelper) /// /// /// - /// - /// /// /// public UserGroup( diff --git a/src/Umbraco.Core/Persistence/Repositories/ITrackedReferencesRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ITrackedReferencesRepository.cs index fda745c2f68b..4442e5ecf2dd 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ITrackedReferencesRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ITrackedReferencesRepository.cs @@ -54,7 +54,7 @@ public interface ITrackedReferencesRepository /// Gets a page of items which are in relation with the current item. /// Basically, shows the items which depend on the current item. /// - /// The identifier of the entity to retrieve relations for. + /// The identifier of the entity to retrieve relations for. /// The amount of items to skip. /// The amount of items to take. /// @@ -81,7 +81,7 @@ IEnumerable GetPagedRelationsForItem( /// /// Gets a page of items used in any kind of relation from selected integer ids. /// - /// The identifiers of the entities to check for relations. + /// The identifiers of the entities to check for relations. /// The amount of items to skip. /// The amount of items to take. /// diff --git a/src/Umbraco.Core/PropertyEditors/JsonPropertyIndexValueFactoryBase.cs b/src/Umbraco.Core/PropertyEditors/JsonPropertyIndexValueFactoryBase.cs index a6f3b5739b2a..e4a7492c5da1 100644 --- a/src/Umbraco.Core/PropertyEditors/JsonPropertyIndexValueFactoryBase.cs +++ b/src/Umbraco.Core/PropertyEditors/JsonPropertyIndexValueFactoryBase.cs @@ -2,7 +2,6 @@ using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Serialization; -using Umbraco.Cms.Core.Serialization; using Umbraco.Extensions; namespace Umbraco.Cms.Core.PropertyEditors; diff --git a/src/Umbraco.Core/Routing/ContentFinderByUrlAndTemplate.cs b/src/Umbraco.Core/Routing/ContentFinderByUrlAndTemplate.cs index 39fc468ceec9..200a7d71438e 100644 --- a/src/Umbraco.Core/Routing/ContentFinderByUrlAndTemplate.cs +++ b/src/Umbraco.Core/Routing/ContentFinderByUrlAndTemplate.cs @@ -77,8 +77,8 @@ public override Task TryFindContent(IPublishedRequestBuilder frequest) // look for template in last position var pos = path.LastIndexOf('/'); - var templateAlias = path.Substring(pos + 1); - path = pos == 0 ? "/" : path.Substring(0, pos);; + var templateAlias = path[(pos + 1)..]; + path = pos == 0 ? "/" : path[..pos]; ITemplate? template = _fileService.GetTemplate(templateAlias); diff --git a/src/Umbraco.Core/Routing/DefaultUrlProvider.cs b/src/Umbraco.Core/Routing/DefaultUrlProvider.cs index c30d5453aa3f..4a5d5d282655 100644 --- a/src/Umbraco.Core/Routing/DefaultUrlProvider.cs +++ b/src/Umbraco.Core/Routing/DefaultUrlProvider.cs @@ -98,7 +98,7 @@ public virtual IEnumerable GetOtherUrls(int id, Uri current) // need to strip off the leading ID for the route if it exists (occurs if the route is for a node with a domain assigned) var pos = route.IndexOf('/'); - var path = pos == 0 ? route : route.Substring(pos); + var path = pos == 0 ? route : route[pos..]; var uri = new Uri(CombinePaths(d.Uri.GetLeftPart(UriPartial.Path), path)); uri = _uriUtility.UriFromUmbraco(uri, _requestSettings); diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index dd6158520354..cd005b576c06 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -582,10 +582,7 @@ public IEnumerable GetPagedOfType( throw new ArgumentOutOfRangeException(nameof(pageSize)); } - if (ordering == null) - { - ordering = Ordering.By("sortOrder"); - } + ordering ??= Ordering.By("sortOrder"); using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { @@ -613,10 +610,7 @@ public IEnumerable GetPagedOfTypes(int[] contentTypeIds, long pageInde throw new ArgumentOutOfRangeException(nameof(pageSize)); } - if (ordering == null) - { - ordering = Ordering.By("sortOrder"); - } + ordering ??= Ordering.By("sortOrder"); using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { @@ -773,10 +767,7 @@ public IEnumerable GetPagedChildren(int id, long pageIndex, int pageSi throw new ArgumentOutOfRangeException(nameof(pageSize)); } - if (ordering == null) - { - ordering = Ordering.By("sortOrder"); - } + ordering ??= Ordering.By("sortOrder"); using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { @@ -790,10 +781,7 @@ public IEnumerable GetPagedChildren(int id, long pageIndex, int pageSi /// public IEnumerable GetPagedDescendants(int id, long pageIndex, int pageSize, out long totalChildren, IQuery? filter = null, Ordering? ordering = null) { - if (ordering == null) - { - ordering = Ordering.By("Path"); - } + ordering ??= Ordering.By("Path"); using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { @@ -931,10 +919,7 @@ public IEnumerable GetPagedContentInRecycleBin(long pageIndex, int pag { using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { - if (ordering == null) - { - ordering = Ordering.By("Path"); - } + ordering ??= Ordering.By("Path"); scope.ReadLock(Constants.Locks.ContentTree); IQuery? query = Query()? @@ -1361,6 +1346,7 @@ internal PublishResult CommitDocumentChanges(IContent content, int userId = Cons /// /// /// + /// /// /// /// @@ -1831,7 +1817,7 @@ private void PerformScheduledPublishingRelease(DateTime date, List 0) @@ -1913,7 +1899,7 @@ private bool PublishBranch_PublishCultures(IContent content, HashSet cul { return culturesToPublish.All(culture => { - var impact = _cultureImpactFactory.Create(culture, IsDefaultCulture(allLangs, culture), content); + CultureImpact? impact = _cultureImpactFactory.Create(culture, IsDefaultCulture(allLangs, culture), content); return content.PublishCulture(impact) && _propertyValidationService.Value.IsPropertyDataValid(content, out _, impact); }); @@ -1929,10 +1915,7 @@ private bool PublishBranch_PublishCultures(IContent content, HashSet cul // if published, republish if (published) { - if (cultures == null) - { - cultures = new HashSet(); // empty means 'already published' - } + cultures ??= new HashSet(); // empty means 'already published' if (edited) { @@ -1948,10 +1931,7 @@ private bool PublishBranch_PublishCultures(IContent content, HashSet cul return cultures; // null means 'nothing to do' } - if (cultures == null) - { - cultures = new HashSet(); - } + cultures ??= new HashSet(); cultures.Add(c); // means 'publish this culture' return cultures; @@ -2654,7 +2634,6 @@ public bool RecycleBinSmells() /// /// The to copy /// Id of the Content's new Parent - /// Key of the Content's new Parent /// Boolean indicating whether the copy should be related to the original /// A value indicating whether to recursively copy children. /// Optional Id of the User copying the Content @@ -3300,6 +3279,7 @@ private PublishResult StrategyPublish( /// /// /// + /// /// private PublishResult StrategyCanUnpublish( ICoreScope scope, @@ -3308,7 +3288,7 @@ private PublishResult StrategyCanUnpublish( IDictionary? notificationState) { // raise Unpublishing notification - var notification = new ContentUnpublishingNotification(content, evtMsgs).WithState(notificationState); + ContentUnpublishingNotification notification = new ContentUnpublishingNotification(content, evtMsgs).WithState(notificationState); var notificationResult = scope.Notifications.PublishCancelable(notification); if (notificationResult) diff --git a/src/Umbraco.Core/Services/DataTypeService.cs b/src/Umbraco.Core/Services/DataTypeService.cs index 382238d58326..7797a300159a 100644 --- a/src/Umbraco.Core/Services/DataTypeService.cs +++ b/src/Umbraco.Core/Services/DataTypeService.cs @@ -330,7 +330,7 @@ public Task> GetByEditorAliasAsync(string propertyEditorA return Task.FromResult(dataTypes); } - + /// public async Task> GetByEditorAliasAsync(string[] propertyEditorAlias) { @@ -555,7 +555,7 @@ public async Task> CreateAsync(IData return Attempt.FailWithStatus(DataTypeOperationStatus.DuplicateKey, dataType); } - var result = await SaveAsync(dataType, () => DataTypeOperationStatus.Success, userKey, AuditType.New); + Attempt result = await SaveAsync(dataType, () => DataTypeOperationStatus.Success, userKey, AuditType.New); scope.Complete(); diff --git a/src/Umbraco.Core/Services/IAuditService.cs b/src/Umbraco.Core/Services/IAuditService.cs index e4c973ced056..7481a5e613f4 100644 --- a/src/Umbraco.Core/Services/IAuditService.cs +++ b/src/Umbraco.Core/Services/IAuditService.cs @@ -105,10 +105,9 @@ Task> GetItemsByKeyAsync( /// /// Returns paged items in the audit trail for a given user /// - /// - /// - /// - /// + /// + /// + /// /// /// By default this will always be ordered descending (newest first) /// @@ -117,9 +116,7 @@ Task> GetItemsByKeyAsync( /// or the custom filter /// so we need to do that here /// - /// - /// Optional filter to be applied - /// + /// /// Task> GetPagedItemsByUserAsync( Guid userKey, diff --git a/src/Umbraco.Core/Services/IContentPublishingService.cs b/src/Umbraco.Core/Services/IContentPublishingService.cs index 0d60da7313e9..701aba31666e 100644 --- a/src/Umbraco.Core/Services/IContentPublishingService.cs +++ b/src/Umbraco.Core/Services/IContentPublishingService.cs @@ -1,4 +1,4 @@ -using Umbraco.Cms.Core.Models.ContentPublishing; +using Umbraco.Cms.Core.Models.ContentPublishing; using Umbraco.Cms.Core.Services.OperationStatus; namespace Umbraco.Cms.Core.Services; @@ -9,7 +9,7 @@ public interface IContentPublishingService /// Publishes a single content item. /// /// The key of the root content. - /// The cultures to publish. + /// The cultures to publish and their publishing schedules. /// The identifier of the user performing the operation. /// Result of the publish operation. Task> PublishAsync(Guid key, CultureAndScheduleModel cultureAndSchedule, Guid userKey); diff --git a/src/Umbraco.Core/Services/IRelationService.cs b/src/Umbraco.Core/Services/IRelationService.cs index 04e99528b591..676e7ea17c8e 100644 --- a/src/Umbraco.Core/Services/IRelationService.cs +++ b/src/Umbraco.Core/Services/IRelationService.cs @@ -177,9 +177,8 @@ public interface IRelationService : IService /// Gets a paged result of /// /// - /// - /// - /// + /// + /// /// /// Task, RelationOperationStatus>> GetPagedByRelationTypeKeyAsync(Guid key, int skip, int take, Ordering? ordering = null); @@ -403,6 +402,8 @@ public interface IRelationService : IService /// Gets the Relation types in a paged manner. /// Currently implements the paging in memory on the name attribute because the underlying repository does not support paging yet /// + /// + /// /// /// Task> GetPagedRelationTypesAsync(int skip, int take, params int[] ids); diff --git a/src/Umbraco.Core/Services/ITrackedReferencesService.cs b/src/Umbraco.Core/Services/ITrackedReferencesService.cs index 2b5dcfb83323..7cfcd1c117d8 100644 --- a/src/Umbraco.Core/Services/ITrackedReferencesService.cs +++ b/src/Umbraco.Core/Services/ITrackedReferencesService.cs @@ -54,7 +54,7 @@ public interface ITrackedReferencesService /// Gets a paged result of items which are in relation with the current item. /// Basically, shows the items which depend on the current item. /// - /// The identifier of the entity to retrieve relations for. + /// The identifier of the entity to retrieve relations for. /// The amount of items to skip /// The amount of items to take. /// diff --git a/src/Umbraco.Core/Services/ImportExport/ContentTypeImportService.cs b/src/Umbraco.Core/Services/ImportExport/ContentTypeImportService.cs index ec9cc5a5ce60..c1f97d8d40a4 100644 --- a/src/Umbraco.Core/Services/ImportExport/ContentTypeImportService.cs +++ b/src/Umbraco.Core/Services/ImportExport/ContentTypeImportService.cs @@ -32,7 +32,7 @@ public ContentTypeImportService( /// Imports the contentType /// /// - /// + /// /// the id of the contentType to overwrite, null if a new contentType should be created /// public async Task> Import( diff --git a/src/Umbraco.Core/Services/LocalizationService.cs b/src/Umbraco.Core/Services/LocalizationService.cs index e1fcfab2203d..989b8f8206db 100644 --- a/src/Umbraco.Core/Services/LocalizationService.cs +++ b/src/Umbraco.Core/Services/LocalizationService.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Events; @@ -220,7 +220,7 @@ public bool DictionaryItemExists(string key) /// Optional id of the user saving the dictionary item [Obsolete("Please use IDictionaryItemService for dictionary item operations. Will be removed in V15.")] public void Save(IDictionaryItem dictionaryItem, int userId = Constants.Security.SuperUserId) - { ; + { Guid currentUserKey = _userIdKeyResolver.GetAsync(userId).GetAwaiter().GetResult(); if (dictionaryItem.Id > 0) { diff --git a/src/Umbraco.Core/Services/Querying/RecycleBin/RecycleBinQueryResultType.cs b/src/Umbraco.Core/Services/Querying/RecycleBin/RecycleBinQueryResultType.cs index e864020a150f..f9f0a34a7547 100644 --- a/src/Umbraco.Core/Services/Querying/RecycleBin/RecycleBinQueryResultType.cs +++ b/src/Umbraco.Core/Services/Querying/RecycleBin/RecycleBinQueryResultType.cs @@ -1,7 +1,7 @@ namespace Umbraco.Cms.Core.Services.Querying.RecycleBin; /// -/// < 10 = Success +/// <10 = Success. /// public enum RecycleBinQueryResultType { diff --git a/src/Umbraco.Core/Services/RedirectUrlService.cs b/src/Umbraco.Core/Services/RedirectUrlService.cs index 07646de3de0c..0944b2a6a1b6 100644 --- a/src/Umbraco.Core/Services/RedirectUrlService.cs +++ b/src/Umbraco.Core/Services/RedirectUrlService.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Models; @@ -84,7 +84,7 @@ public void DeleteAll() public async Task GetMostRecentRedirectUrlAsync(string url) { - using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { return await _redirectUrlRepository.GetMostRecentUrlAsync(url); } @@ -142,9 +142,9 @@ public IEnumerable SearchRedirectUrls(string searchTerm, long page return await GetMostRecentRedirectUrlAsync(url); } - using (var scope = ScopeProvider.CreateCoreScope(autoComplete: true)) + using (ICoreScope scope = ScopeProvider.CreateCoreScope(autoComplete: true)) { return await _redirectUrlRepository.GetMostRecentUrlAsync(url, culture); } - } + } } diff --git a/src/Umbraco.Core/Services/UserService.cs b/src/Umbraco.Core/Services/UserService.cs index dd25791d131e..0167dc6d929f 100644 --- a/src/Umbraco.Core/Services/UserService.cs +++ b/src/Umbraco.Core/Services/UserService.cs @@ -4,14 +4,12 @@ using Microsoft.Extensions.DependencyInjection; using System.Security.Claims; using System.Security.Cryptography; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Cache; using Umbraco.Cms.Core.Configuration.Models; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Editors; -using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Exceptions; using Umbraco.Cms.Core.IO; @@ -156,7 +154,7 @@ public static bool TryGetAssignedPermissionsForNode( if (permissions.Any(x => x.EntityId == nodeId)) { EntityPermission found = permissions.First(x => x.EntityId == nodeId); - var assignedPermissionsArray = found.AssignedPermissions; + ISet assignedPermissionsArray = found.AssignedPermissions; // Working with permissions assigned directly to a user AND to their groups, so maybe several per node // and we need to get the most permissive set @@ -668,7 +666,7 @@ public async Task> CreateAsync( return Attempt.FailWithStatus(UserOperationStatus.MissingUser, new UserCreationResult()); } - var userGroups = _userGroupRepository.GetMany().Where(x=>model.UserGroupKeys.Contains(x.Key)).ToArray(); + IUserGroup[] userGroups = _userGroupRepository.GetMany().Where(x=>model.UserGroupKeys.Contains(x.Key)).ToArray(); if (userGroups.Length != model.UserGroupKeys.Count) { @@ -789,7 +787,7 @@ public async Task> InviteAsyn return Attempt.FailWithStatus(UserOperationStatus.MissingUser, new UserInvitationResult()); } - var userGroups = _userGroupRepository.GetMany().Where(x=>model.UserGroupKeys.Contains(x.Key)).ToArray(); + IUserGroup[] userGroups = _userGroupRepository.GetMany().Where(x => model.UserGroupKeys.Contains(x.Key)).ToArray(); if (userGroups.Length != model.UserGroupKeys.Count) { @@ -2298,7 +2296,7 @@ private async Task, UserOperationStatus>> G var results = new List(); foreach (KeyValuePair node in nodes) { - var permissions = permissionsCollection.GetAllPermissions(node.Value); + ISet permissions = permissionsCollection.GetAllPermissions(node.Value); results.Add(new NodePermissions { NodeKey = node.Key, Permissions = permissions }); } @@ -2361,7 +2359,7 @@ public async Task, UserOperationStatus>> Ge var results = new List(); foreach (int nodeId in idKeyMap.Keys) { - var permissions = permissionCollection.GetAllPermissions(nodeId); + ISet permissions = permissionCollection.GetAllPermissions(nodeId); results.Add(new NodePermissions { NodeKey = idKeyMap[nodeId], Permissions = permissions }); } diff --git a/src/Umbraco.Core/Services/WebProfilerService.cs b/src/Umbraco.Core/Services/WebProfilerService.cs index 026c2afd38e6..e895bba6e7a7 100644 --- a/src/Umbraco.Core/Services/WebProfilerService.cs +++ b/src/Umbraco.Core/Services/WebProfilerService.cs @@ -46,7 +46,11 @@ private Attempt GetExecutingUserId() //FIXME when we can get current user return Attempt.Succeed(-1); +#pragma warning disable CS0162 // Unreachable code detected +#pragma warning disable CS0618 // Type or member is obsolete Attempt? userIdAttempt = _backOfficeSecurityAccessor?.BackOfficeSecurity?.GetUserId(); +#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore CS0162 // Unreachable code detected return (userIdAttempt.HasValue && userIdAttempt.Value.Success) ? Attempt.Succeed(userIdAttempt.Value.Result) diff --git a/src/Umbraco.Infrastructure/BackgroundJobs/IRecurringBackgroundJob.cs b/src/Umbraco.Infrastructure/BackgroundJobs/IRecurringBackgroundJob.cs index c6be3dcec5d4..db57d026656c 100644 --- a/src/Umbraco.Infrastructure/BackgroundJobs/IRecurringBackgroundJob.cs +++ b/src/Umbraco.Infrastructure/BackgroundJobs/IRecurringBackgroundJob.cs @@ -8,15 +8,17 @@ namespace Umbraco.Cms.Infrastructure.BackgroundJobs; public interface IRecurringBackgroundJob { static readonly TimeSpan DefaultDelay = System.TimeSpan.FromMinutes(3); - static readonly ServerRole[] DefaultServerRoles = new[] { ServerRole.Single, ServerRole.SchedulingPublisher }; + static readonly ServerRole[] DefaultServerRoles = new[] { ServerRole.Single, ServerRole.SchedulingPublisher }; - /// Timespan representing how often the task should recur. + /// + /// Timespan representing how often the task should recur. + /// TimeSpan Period { get; } - /// - /// Timespan representing the initial delay after application start-up before the first run of the task - /// occurs. - /// + /// + /// Timespan representing the initial delay after application start-up before the first run of the task + /// occurs. + /// TimeSpan Delay { get => DefaultDelay; } ServerRole[] ServerRoles { get => DefaultServerRoles; } diff --git a/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/HealthCheckNotifierJob.cs b/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/HealthCheckNotifierJob.cs index cf99583fc45b..c79a1a0866b7 100644 --- a/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/HealthCheckNotifierJob.cs +++ b/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/HealthCheckNotifierJob.cs @@ -47,6 +47,7 @@ public event EventHandler PeriodChanged /// The typed logger. /// The profiling logger. /// Parser of crontab expressions. + /// public HealthCheckNotifierJob( IOptionsMonitor healthChecksSettings, HealthCheckCollection healthChecks, diff --git a/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/LogScrubberJob.cs b/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/LogScrubberJob.cs index 1c745661cb44..3fcbe8d3d656 100644 --- a/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/LogScrubberJob.cs +++ b/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/LogScrubberJob.cs @@ -30,7 +30,7 @@ public event EventHandler PeriodChanged { add { } remove { } } private readonly IAuditService _auditService; private readonly ILogger _logger; private readonly IProfilingLogger _profilingLogger; - private readonly ICoreScopeProvider _scopeProvider; + private readonly ICoreScopeProvider _scopeProvider; private LoggingSettings _settings; /// @@ -41,14 +41,14 @@ public event EventHandler PeriodChanged { add { } remove { } } /// Provides scopes for database operations. /// The typed logger. /// The profiling logger. - public LogScrubberJob( + public LogScrubberJob( IAuditService auditService, IOptionsMonitor settings, ICoreScopeProvider scopeProvider, ILogger logger, IProfilingLogger profilingLogger) { - + _auditService = auditService; _settings = settings.CurrentValue; _scopeProvider = scopeProvider; @@ -59,7 +59,7 @@ public LogScrubberJob( public Task RunJobAsync() { - + // Ensure we use an explicit scope since we are running on a background thread. using (ICoreScope scope = _scopeProvider.CreateCoreScope()) using (_profilingLogger.DebugDuration("Log scrubbing executing", "Log scrubbing complete")) diff --git a/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/ServerRegistration/InstructionProcessJob.cs b/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/ServerRegistration/InstructionProcessJob.cs index cc6e35bf835f..87b459d69fc7 100644 --- a/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/ServerRegistration/InstructionProcessJob.cs +++ b/src/Umbraco.Infrastructure/BackgroundJobs/Jobs/ServerRegistration/InstructionProcessJob.cs @@ -55,5 +55,5 @@ public Task RunJobAsync() } return Task.CompletedTask; - } + } } diff --git a/src/Umbraco.Infrastructure/Install/FilePermissionHelper.cs b/src/Umbraco.Infrastructure/Install/FilePermissionHelper.cs index ccb3e4a0da85..aab9c71acdf9 100644 --- a/src/Umbraco.Infrastructure/Install/FilePermissionHelper.cs +++ b/src/Umbraco.Infrastructure/Install/FilePermissionHelper.cs @@ -92,10 +92,7 @@ private bool EnsureDirectories(string[] dirs, out IEnumerable errors, bo continue; } - if (temp == null) - { - temp = new List(); - } + temp ??= new List(); temp.Add(dir.TrimStart(_basePath)); success = false; @@ -117,10 +114,7 @@ private bool EnsureFiles(string[] files, out IEnumerable errors) continue; } - if (temp == null) - { - temp = new List(); - } + temp ??= new List(); temp.Add(file.TrimStart(_basePath)); success = false; @@ -145,10 +139,7 @@ private bool EnsureCanCreateSubDirectories(IEnumerable dirs, out IEnumer continue; } - if (temp == null) - { - temp = new List(); - } + temp ??= new List(); temp.Add(dir); success = false; diff --git a/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerConfig.cs b/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerConfig.cs index 3e4b0b793171..3bd18bc1ac33 100644 --- a/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerConfig.cs +++ b/src/Umbraco.Infrastructure/Logging/Viewer/LogViewerConfig.cs @@ -49,7 +49,5 @@ public IReadOnlyList DeleteSavedSearch(string name) IReadOnlyList result = GetSavedSearches()!; scope.Complete(); return result; - scope.Complete(); - return result; } } diff --git a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPremigrationPlan.cs b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPremigrationPlan.cs index 23f4aa108c64..c9d23acb90f1 100644 --- a/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPremigrationPlan.cs +++ b/src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPremigrationPlan.cs @@ -12,7 +12,6 @@ public class UmbracoPremigrationPlan : MigrationPlan /// /// Initializes a new instance of the class. /// - /// The Umbraco version. public UmbracoPremigrationPlan() : base(Constants.Conventions.Migrations.UmbracoUpgradePlanPremigrationsName) => DefinePlan(); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs index 332339e49c8f..892fa78ae470 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/UserRepository.cs @@ -411,8 +411,8 @@ private void PerformGetReferencedDtos(List dtos) List userIds = dtos.Count == 1 ? new List {dtos[0].Id} : dtos.Select(x => x.Id).ToList(); Dictionary? xUsers = dtos.Count == 1 ? null : dtos.ToDictionary(x => x.Id, x => x); - List groupIds = new List(); - List groupKeys = new List(); + var groupIds = new List(); + var groupKeys = new List(); Sql sql; try { @@ -595,9 +595,9 @@ private void PerformGetReferencedDtos(List dtos) // map languages - foreach (var group in groups.Values) + foreach (UserGroupDto group in groups.Values) { - if (groups2languages.TryGetValue(group.Id, out var list)) + if (groups2languages.TryGetValue(group.Id, out IGrouping? list)) { group.UserGroup2LanguageDtos = list.ToList(); // groups2apps is distinct } diff --git a/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs index 449d59ba4295..46f02863a90d 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyEditor.cs @@ -197,7 +197,6 @@ private IEnumerable GetFilePathsFromPropertyValues(IProperty prop) /// Returns the "src" property from the json structure if the value is formatted correctly /// /// - /// The deserialized value /// Should the path returned be the application relative path /// private string? GetFileSrcFromPropertyValue(object? propVal, bool relative = true) diff --git a/src/Umbraco.Infrastructure/Security/BackOfficeClaimsPrincipalFactory.cs b/src/Umbraco.Infrastructure/Security/BackOfficeClaimsPrincipalFactory.cs index eeac48801d3c..32a554aff0a4 100644 --- a/src/Umbraco.Infrastructure/Security/BackOfficeClaimsPrincipalFactory.cs +++ b/src/Umbraco.Infrastructure/Security/BackOfficeClaimsPrincipalFactory.cs @@ -17,6 +17,7 @@ public class BackOfficeClaimsPrincipalFactory : UserClaimsPrincipalFactory /// The user manager /// The + /// public BackOfficeClaimsPrincipalFactory( UserManager userManager, IOptions optionsAccessor, diff --git a/src/Umbraco.Infrastructure/Security/BackOfficeIdentityUser.cs b/src/Umbraco.Infrastructure/Security/BackOfficeIdentityUser.cs index 4c7943c69c63..4341b01b7906 100644 --- a/src/Umbraco.Infrastructure/Security/BackOfficeIdentityUser.cs +++ b/src/Umbraco.Infrastructure/Security/BackOfficeIdentityUser.cs @@ -62,10 +62,7 @@ public int[] StartContentIds get => _startContentIds; set { - if (value == null) - { - value = new int[0]; - } + value ??= new int[0]; BeingDirty.SetPropertyValueAndDetectChanges(value, ref _startContentIds!, nameof(StartContentIds), _startIdsComparer); } @@ -79,10 +76,7 @@ public int[] StartMediaIds get => _startMediaIds; set { - if (value == null) - { - value = new int[0]; - } + value ??= Array.Empty(); BeingDirty.SetPropertyValueAndDetectChanges(value, ref _startMediaIds!, nameof(StartMediaIds), _startIdsComparer); } @@ -123,6 +117,7 @@ public Guid Key /// This is allowed to be null (but would need to be filled in if trying to persist this instance) /// /// + /// public static BackOfficeIdentityUser CreateNew(GlobalSettings globalSettings, string? username, string email, string culture, string? name = null, Guid? id = null) { if (string.IsNullOrWhiteSpace(username)) diff --git a/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs b/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs index 20cd35d0d191..3784781413e2 100644 --- a/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs +++ b/src/Umbraco.Web.Common/ModelsBuilder/DependencyInjection/UmbracoBuilderDependencyInjectionExtensions.cs @@ -126,7 +126,7 @@ public static IUmbracoBuilder AddModelsBuilder(this IUmbracoBuilder builder) builder.AddNotificationHandler(); builder.AddNotificationHandler(); builder.AddNotificationHandler(); - + builder.AddNotificationHandler(); builder.AddNotificationHandler(); } @@ -135,7 +135,7 @@ public static IUmbracoBuilder AddModelsBuilder(this IUmbracoBuilder builder) // Register required services for ModelsBuilderDashboardController builder.Services.AddSingleton(); - + // TODO: Remove in v13 - this is only here in case someone is already using this generator directly builder.Services.AddSingleton(); builder.Services.AddSingleton(); @@ -165,7 +165,7 @@ private static IUmbracoBuilder AddInMemoryModelsRazorEngine(this IUmbracoBuilder // This is what the community MB would replace, all of the above services are fine to be registered builder.Services.AddSingleton(factory => factory.CreateDefaultPublishedModelFactory()); - + return builder; } } diff --git a/src/Umbraco.Web.Website/DependencyInjection/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.Website/DependencyInjection/UmbracoBuilderExtensions.cs index f182bda7b6f2..400b288786f3 100644 --- a/src/Umbraco.Web.Website/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.Website/DependencyInjection/UmbracoBuilderExtensions.cs @@ -57,8 +57,7 @@ public static IUmbracoBuilder AddWebsite(this IUmbracoBuilder builder) x.GetRequiredService(), x.GetRequiredService(), x.GetRequiredService(), - x.GetRequiredService>() - )); + x.GetRequiredService>())); builder.Services.AddSingleton(); builder.Services.TryAddEnumerable(Singleton()); builder.Services.AddSingleton(); diff --git a/src/Umbraco.Web.Website/Routing/PublicAccessRequestHandler.cs b/src/Umbraco.Web.Website/Routing/PublicAccessRequestHandler.cs index b7c751d28c9e..801e4af08fc6 100644 --- a/src/Umbraco.Web.Website/Routing/PublicAccessRequestHandler.cs +++ b/src/Umbraco.Web.Website/Routing/PublicAccessRequestHandler.cs @@ -148,9 +148,10 @@ public PublicAccessRequestHandler( _logger.LogDebug("EnsurePublishedContentAccess: Page is not protected"); } } + } - // loop until we have access or reached max loops - } while (publicAccessStatus != PublicAccessStatus.AccessAccepted && i++ < maxLoop); + // loop until we have access or reached max loops + while (publicAccessStatus != PublicAccessStatus.AccessAccepted && i++ < maxLoop); if (i == maxLoop) { diff --git a/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs b/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs index c46bb890b147..714024a1bc28 100644 --- a/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs +++ b/src/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactory.cs @@ -45,13 +45,8 @@ public UmbracoRouteValuesFactory( ControllerActionDescriptor? descriptor = _controllerActionSearcher.Find( new DefaultHttpContext(), // this actually makes no difference for this method DefaultControllerName, - UmbracoRouteValues.DefaultActionName); - - if (descriptor == null) - { - throw new InvalidOperationException( + UmbracoRouteValues.DefaultActionName) ?? throw new InvalidOperationException( $"No controller/action found by name {DefaultControllerName}.{UmbracoRouteValues.DefaultActionName}"); - } return descriptor; }); @@ -151,8 +146,8 @@ private async Task CheckNoTemplateAsync( $"The call to {nameof(IPublishedRouter.UpdateRequestAsync)} cannot return null"); } - string? customActionName = GetTemplateName(request); - + string? customActionName = GetTemplateName(request); + def = new UmbracoRouteValues( request, def.ControllerActionDescriptor, @@ -167,7 +162,7 @@ private async Task CheckNoTemplateAsync( return def; } - + private string? GetTemplateName(IPublishedRequest request) { // check that a template is defined), if it doesn't and there is a hijacked route it will just route diff --git a/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj b/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj index 8ee1e80bb2a0..0e8d47572564 100644 --- a/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj +++ b/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj @@ -6,8 +6,11 @@ Umbraco.Cms.Web.Website - - false + + ASP0019,CS0618,SA1401,SA1649,IDE0270,IDE1006 diff --git a/src/Umbraco.Web.Website/ViewEngines/ProfilingViewEngine.cs b/src/Umbraco.Web.Website/ViewEngines/ProfilingViewEngine.cs index 5862f90d6476..33ec4acb33c4 100644 --- a/src/Umbraco.Web.Website/ViewEngines/ProfilingViewEngine.cs +++ b/src/Umbraco.Web.Website/ViewEngines/ProfilingViewEngine.cs @@ -8,6 +8,8 @@ public class ProfilingViewEngine : IViewEngine { private readonly string _name; private readonly IProfiler _profiler; + + //TODO: can this be made private and with underscore? internal readonly IViewEngine Inner; public ProfilingViewEngine(IViewEngine inner, IProfiler profiler) diff --git a/tests/Umbraco.Tests.Benchmarks/EnumeratorBenchmarks.cs b/tests/Umbraco.Tests.Benchmarks/EnumeratorBenchmarks.cs index 05db4034dd55..460e819f187e 100644 --- a/tests/Umbraco.Tests.Benchmarks/EnumeratorBenchmarks.cs +++ b/tests/Umbraco.Tests.Benchmarks/EnumeratorBenchmarks.cs @@ -11,7 +11,7 @@ public void WithArray() { foreach (var t in EnumerateOneWithArray(1)) { - ; + } } @@ -20,7 +20,7 @@ public void WithYield() { foreach (var t in EnumerateOneWithYield(1)) { - ; + } } diff --git a/tests/Umbraco.Tests.Benchmarks/HashFromStreams.cs b/tests/Umbraco.Tests.Benchmarks/HashFromStreams.cs index cc8ad908775e..7b291b88b8d4 100644 --- a/tests/Umbraco.Tests.Benchmarks/HashFromStreams.cs +++ b/tests/Umbraco.Tests.Benchmarks/HashFromStreams.cs @@ -18,7 +18,7 @@ public class HashFromStreams // the SHA1CryptoServiceProvider is faster, but that is not reflected in these benchmarks. /* - + BenchmarkDotNet=v0.13.0, OS=Windows 10.0.19042.1052 (20H2/October2020Update) Intel Core i7-7700HQ CPU 2.80GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores .NET SDK=5.0.300-preview.21258.4 diff --git a/tests/Umbraco.Tests.Integration/Implementations/TestHelper.cs b/tests/Umbraco.Tests.Integration/Implementations/TestHelper.cs index 1a4ccacdd1bd..47d095c02a8d 100644 --- a/tests/Umbraco.Tests.Integration/Implementations/TestHelper.cs +++ b/tests/Umbraco.Tests.Integration/Implementations/TestHelper.cs @@ -174,16 +174,13 @@ public void AssertPropertyValuesAreEqual(object actual, object expected, Func sorter = null, int dateDeltaMilliseconds = 0) { - if (sorter == null) + // this is pretty hackerific but saves us some code to write + sorter ??= enumerable => { - // this is pretty hackerific but saves us some code to write - sorter = enumerable => - { - // semi-generic way of ensuring any collection of IEntity are sorted by Ids for comparison - var entities = enumerable.OfType().ToList(); - return entities.Count > 0 ? entities.OrderBy(x => x.Id) : entities; - }; - } + // semi-generic way of ensuring any collection of IEntity are sorted by Ids for comparison + var entities = enumerable.OfType().ToList(); + return entities.Count > 0 ? entities.OrderBy(x => x.Id) : entities; + }; var expectedListEx = sorter(expected).Cast().ToList(); var actualListEx = sorter(actual).Cast().ToList(); diff --git a/tests/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs b/tests/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs index cf321d9498cf..34445e244649 100644 --- a/tests/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs +++ b/tests/Umbraco.Tests.Integration/TestServerTest/UmbracoTestServerTestBase.cs @@ -298,7 +298,7 @@ protected void ConfigureServices(IServiceCollection services) protected virtual void CustomMvcSetup(IMvcBuilder mvcBuilder) { - + } /// diff --git a/tests/Umbraco.Tests.Integration/Testing/TestWebProfilerRepository.cs b/tests/Umbraco.Tests.Integration/Testing/TestWebProfilerRepository.cs index 3d5dbb2e2b1c..a3c572ad047d 100644 --- a/tests/Umbraco.Tests.Integration/Testing/TestWebProfilerRepository.cs +++ b/tests/Umbraco.Tests.Integration/Testing/TestWebProfilerRepository.cs @@ -5,7 +5,7 @@ namespace Umbraco.Cms.Tests.Integration.Testing; public class TestWebProfilerRepository : IWebProfilerRepository { private bool _status = false; - + public void SetStatus(int userId, bool status) => _status = status; public bool GetStatus(int userId) => _status; diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/ContentTypeRepositoryTest.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/ContentTypeRepositoryTest.cs index 1644a3b1e4aa..51ade838c666 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/ContentTypeRepositoryTest.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/Repositories/ContentTypeRepositoryTest.cs @@ -404,7 +404,7 @@ public void Can_Perform_Query_On_ContentTypeRepository_Sort_By_Name() var repository = ContentTypeRepository; // Act - var contentTypes = repository.Get(provider.CreateQuery().Where(x => x.ParentId == contentType.Id)).ToArray();; + var contentTypes = repository.Get(provider.CreateQuery().Where(x => x.ParentId == contentType.Id)).ToArray(); // Assert Assert.That(contentTypes.Count(), Is.EqualTo(3)); diff --git a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/LanguageServiceTests.cs b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/LanguageServiceTests.cs index 043ce3d2f4e9..b04dcdb379b4 100644 --- a/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/LanguageServiceTests.cs +++ b/tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/LanguageServiceTests.cs @@ -1,4 +1,4 @@ -using NUnit.Framework; +using NUnit.Framework; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; @@ -262,7 +262,7 @@ public async Task Cannot_Create_Language_With_Invalid_Fallback_Language() Assert.IsFalse(result.Success); Assert.AreEqual(LanguageOperationStatus.InvalidFallbackIsoCode, result.Status); } - + [Test] public async Task Cannot_Create_Language_With_NonExisting_Fallback_Language() { @@ -332,7 +332,7 @@ public async Task Cannot_Update_Language_With_Invalid_Fallback_Language() Assert.IsFalse(result.Success); Assert.AreEqual(LanguageOperationStatus.InvalidFallbackIsoCode, result.Status); } - + [Test] public async Task Cannot_Create_Direct_Cyclic_Fallback_Language() { diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs index ca47bfbd9707..dd4c46f0a4b8 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/Components/ComponentTests.cs @@ -157,7 +157,7 @@ public void Boot1A() { return Mock.Of>(); } - + if (type == typeof(ILogger)) { return Mock.Of>(); @@ -324,7 +324,7 @@ public void Initialize() { return Mock.Of>(); } - + if (type == typeof(IServiceProviderIsService)) { return Mock.Of(); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackgroundJobs/Jobs/ServerRegistration/InstructionProcessJobTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackgroundJobs/Jobs/ServerRegistration/InstructionProcessJobTests.cs index f2e6e574ef86..14311afbe292 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackgroundJobs/Jobs/ServerRegistration/InstructionProcessJobTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackgroundJobs/Jobs/ServerRegistration/InstructionProcessJobTests.cs @@ -30,7 +30,7 @@ public async Task Executes_And_Touches_Server() private InstructionProcessJob CreateInstructionProcessJob() { - + var mockLogger = new Mock>(); _mockDatabaseServerMessenger = new Mock(); diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackgroundJobs/Jobs/TempFileCleanupJobTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackgroundJobs/Jobs/TempFileCleanupJobTests.cs index c37094e6ac81..9c76c7b799fe 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackgroundJobs/Jobs/TempFileCleanupJobTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/BackgroundJobs/Jobs/TempFileCleanupJobTests.cs @@ -29,7 +29,7 @@ public async Task Executes_And_Cleans_Files() private TempFileCleanupJob CreateTempFileCleanupJob() { - + _mockIOHelper = new Mock(); _mockIOHelper.Setup(x => x.GetTempFolders()) .Returns(new DirectoryInfo[] { new(_testPath) });