From 76e1d9419e07b6a46c2a16546a0309f6a981de6b Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Tue, 20 Feb 2024 22:45:47 -0800 Subject: [PATCH 01/13] Allow to render TrustedHTML objects similar to SafeString --- .../integration-tests/package.json | 1 + .../test/trusted-html-test.ts | 49 +++++++++++++++++++ .../lib/opcode-builder/helpers/stdlib.ts | 5 ++ .../runtime/lib/compiled/opcodes/content.ts | 6 ++- .../@glimmer/runtime/lib/dom/normalize.ts | 13 +++++ packages/@glimmer/runtime/package.json | 3 +- packages/@glimmer/vm/lib/content.ts | 1 + 7 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts diff --git a/packages/@glimmer-workspace/integration-tests/package.json b/packages/@glimmer-workspace/integration-tests/package.json index 27ac55e35..22680f0ab 100644 --- a/packages/@glimmer-workspace/integration-tests/package.json +++ b/packages/@glimmer-workspace/integration-tests/package.json @@ -29,6 +29,7 @@ "@simple-dom/document": "^1.4.0", "@simple-dom/serializer": "^1.4.0", "@simple-dom/void-map": "^1.4.0", + "@types/trusted-types": "^2.0.7", "js-reporters": "^2.1.0", "qunit": "^2.19.4", "simple-html-tokenizer": "^0.5.11" diff --git a/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts b/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts new file mode 100644 index 000000000..7c28a4c2e --- /dev/null +++ b/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts @@ -0,0 +1,49 @@ +import type { TrustedTypePolicy, TrustedTypesWindow } from 'trusted-types/lib'; + +import { jitSuite, RenderTest, test } from '..'; + +let policy: TrustedTypePolicy | undefined; +if (typeof window !== 'undefined') { + let trustedTypes = (window as unknown as TrustedTypesWindow).trustedTypes; + if (trustedTypes?.createPolicy) { + policy = trustedTypes.createPolicy('test', { + createHTML: (s: string) => s, + createScript: (s: string) => s, + createScriptURL: (s: string) => s, + }); + } +} + +export class TrustedHTMLTests extends RenderTest { + static suiteName = 'TrustedHTML'; + + @test + 'renders TrustedHTML similar to SafeString'() { + if (!policy) return; + + let html = 'test\'""'; + this.registerHelper('trustedHTML', () => { + return policy?.createHTML(html); + }); + + this.render('
{{trustedHTML}}
'); + this.assertHTML('
test\'""'; + this.registerHelper('trustedHTML', () => { + return policy?.createHTML(html); + }); + + this.render('{{trustedHTML}}'); + this.assertHTML('test\'""'); + this.assertStableRerender(); + } +} + +jitSuite(TrustedHTMLTests); diff --git a/packages/@glimmer/opcode-compiler/lib/opcode-builder/helpers/stdlib.ts b/packages/@glimmer/opcode-compiler/lib/opcode-builder/helpers/stdlib.ts index 7c7a98e79..bc080cec4 100644 --- a/packages/@glimmer/opcode-compiler/lib/opcode-builder/helpers/stdlib.ts +++ b/packages/@glimmer/opcode-compiler/lib/opcode-builder/helpers/stdlib.ts @@ -74,6 +74,11 @@ export function StdAppend( op(Op.AppendSafeHTML); }); + when(ContentType.TrustedHTML, () => { + op(Op.AssertSame); + op(Op.AppendHTML); + }); + when(ContentType.Fragment, () => { op(Op.AssertSame); op(Op.AppendDocumentFragment); diff --git a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts index 03b1c9c85..522c46c59 100644 --- a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts +++ b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts @@ -11,7 +11,7 @@ import { isObject } from '@glimmer/util'; import { ContentType, CurriedType, Op } from '@glimmer/vm'; import { isCurriedType } from '../../curried-value'; -import { isEmpty, isFragment, isNode, isSafeString, shouldCoerce } from '../../dom/normalize'; +import { isEmpty, isFragment, isNode, isSafeString, isTrustedHTML, shouldCoerce } from '../../dom/normalize'; import { APPEND_OPCODES } from '../../opcodes'; import DynamicTextContent from '../../vm/content/text'; import { CheckReference } from './-debug-strip'; @@ -32,6 +32,8 @@ function toContentType(value: unknown) { return ContentType.Helper; } else if (isSafeString(value)) { return ContentType.SafeString; + } else if (isTrustedHTML(value)) { + return ContentType.TrustedHTML; } else if (isFragment(value)) { return ContentType.Fragment; } else if (isNode(value)) { @@ -87,7 +89,7 @@ APPEND_OPCODES.add(Op.AppendHTML, (vm) => { let reference = check(vm.stack.pop(), CheckReference); let rawValue = valueForRef(reference); - let value = isEmpty(rawValue) ? '' : String(rawValue); + let value = isEmpty(rawValue) ? '' : isTrustedHTML(rawValue) ? rawValue as string : String(rawValue); vm.elements().appendDynamicHTML(value); }); diff --git a/packages/@glimmer/runtime/lib/dom/normalize.ts b/packages/@glimmer/runtime/lib/dom/normalize.ts index 6de6ec7b4..638a87ea3 100644 --- a/packages/@glimmer/runtime/lib/dom/normalize.ts +++ b/packages/@glimmer/runtime/lib/dom/normalize.ts @@ -1,4 +1,5 @@ import type { Dict, SimpleDocumentFragment, SimpleNode } from '@glimmer/interfaces'; +import type { TrustedTypesWindow } from 'trusted-types/lib'; export interface SafeString { toHTML(): string; @@ -43,6 +44,18 @@ export function isEmpty(value: unknown): boolean { return value === null || value === undefined || typeof (value as Dict).toString !== 'function'; } +let isHTML: ((value: unknown) => boolean) | undefined; +if (typeof window !== 'undefined') { + let trustedTypes = (window as unknown as TrustedTypesWindow).trustedTypes; + if (trustedTypes?.isHTML) { + isHTML = trustedTypes?.isHTML.bind(trustedTypes); + } +} + +export function isTrustedHTML(value: unknown): boolean { + return isHTML ? isHTML(value) : false; +} + export function isSafeString(value: unknown): value is SafeString { return typeof value === 'object' && value !== null && typeof (value as any).toHTML === 'function'; } diff --git a/packages/@glimmer/runtime/package.json b/packages/@glimmer/runtime/package.json index 08147b44c..e07e0703c 100644 --- a/packages/@glimmer/runtime/package.json +++ b/packages/@glimmer/runtime/package.json @@ -43,7 +43,8 @@ "@glimmer/util": "workspace:^", "@glimmer/validator": "workspace:^", "@glimmer/vm": "workspace:^", - "@glimmer/wire-format": "workspace:^" + "@glimmer/wire-format": "workspace:^", + "@types/trusted-types": "^2.0.7" }, "devDependencies": { "@glimmer-workspace/build-support": "workspace:^", diff --git a/packages/@glimmer/vm/lib/content.ts b/packages/@glimmer/vm/lib/content.ts index ddbe0290c..ac8d805d4 100644 --- a/packages/@glimmer/vm/lib/content.ts +++ b/packages/@glimmer/vm/lib/content.ts @@ -7,4 +7,5 @@ export const ContentType = { Fragment: 5, Node: 6, Other: 8, + TrustedHTML: 9, } as const; From b61fb0736b53ce33e045057dbbc78f2e6f6264bc Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 11:46:33 -0800 Subject: [PATCH 02/13] Add pnpm-lock.yaml --- pnpm-lock.yaml | 182 ++++++------------------------------------------- 1 file changed, 21 insertions(+), 161 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8bd4faf6c..f6fa94235 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -221,7 +221,7 @@ importers: version: 5.0.12(@types/node@20.9.4) xo: specifier: ^0.54.2 - version: 0.54.2(eslint-import-resolver-typescript@3.6.1)(webpack@5.89.0) + version: 0.54.2(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(webpack@5.89.0) zx: specifier: ^7.2.3 version: 7.2.3 @@ -531,6 +531,9 @@ importers: '@simple-dom/void-map': specifier: ^1.4.0 version: 1.4.0 + '@types/trusted-types': + specifier: ^2.0.7 + version: 2.0.7 js-reporters: specifier: ^2.1.0 version: 2.1.0 @@ -1102,6 +1105,9 @@ importers: '@glimmer/wire-format': specifier: workspace:^ version: link:../wire-format + '@types/trusted-types': + specifier: ^2.0.7 + version: 2.0.7 devDependencies: '@glimmer-workspace/build-support': specifier: workspace:^ @@ -4337,6 +4343,10 @@ packages: minipass: 4.2.8 dev: false + /@types/trusted-types@2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + dev: false + /@types/ua-parser-js@0.7.39: resolution: {integrity: sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==} dev: false @@ -4356,34 +4366,6 @@ packages: '@types/node': 20.9.4 optional: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0)(typescript@5.2.2): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.54.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.54.0)(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.54.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare-lite: 1.4.0 - semver: 7.5.2 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.0.4): resolution: {integrity: sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==} engines: {node: ^16.0.0 || >=18.0.0} @@ -4441,26 +4423,6 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/parser@5.62.0(eslint@8.54.0)(typescript@5.2.2): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.54.0 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser@6.12.0(eslint@8.54.0)(typescript@5.0.4): resolution: {integrity: sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -4502,14 +4464,6 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - /@typescript-eslint/scope-manager@6.12.0: resolution: {integrity: sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -4517,26 +4471,6 @@ packages: '@typescript-eslint/types': 6.12.0 '@typescript-eslint/visitor-keys': 6.12.0 - /@typescript-eslint/type-utils@5.62.0(eslint@8.54.0)(typescript@5.2.2): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.54.0)(typescript@5.2.2) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.54.0 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/type-utils@6.12.0(eslint@8.54.0)(typescript@5.0.4): resolution: {integrity: sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==} engines: {node: ^16.0.0 || >=18.0.0} @@ -4576,36 +4510,10 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/types@6.12.0: resolution: {integrity: sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==} engines: {node: ^16.0.0 || >=18.0.0} - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.2 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/typescript-estree@6.12.0(typescript@5.0.4): resolution: {integrity: sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -4647,26 +4555,6 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/utils@5.62.0(eslint@8.54.0)(typescript@5.2.2): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - eslint: 8.54.0 - eslint-scope: 5.1.1 - semver: 7.5.2 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/utils@6.12.0(eslint@8.54.0)(typescript@5.0.4): resolution: {integrity: sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -4704,14 +4592,6 @@ packages: - supports-color - typescript - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@typescript-eslint/visitor-keys@6.12.0: resolution: {integrity: sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==} engines: {node: ^16.0.0 || >=18.0.0} @@ -8236,21 +8116,6 @@ packages: dependencies: eslint: 8.54.0 - /eslint-config-xo-typescript@0.57.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint@8.54.0)(typescript@5.2.2): - resolution: {integrity: sha512-u+qcTaADHn2/+hbDqZHRWiAps8JS6BcRsJKAADFxYHIPpYqQeQv9mXuhRe/1+ikfZAIz9hlG1V+Lkj8J7nf34A==} - engines: {node: '>=12'} - peerDependencies: - '@typescript-eslint/eslint-plugin': '>=5.57.0' - '@typescript-eslint/parser': '>=5.57.0' - eslint: '>=8.0.0' - typescript: ^5.0.4 || 5 - dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0)(typescript@5.2.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@5.2.2) - eslint: 8.54.0 - typescript: 5.2.2 - dev: true - /eslint-config-xo@0.43.1(eslint@8.54.0): resolution: {integrity: sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==} engines: {node: '>=12'} @@ -8339,7 +8204,7 @@ packages: array-find: 1.0.0 debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0) find-root: 1.1.0 has: 1.0.4 interpret: 1.4.0 @@ -8353,7 +8218,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -8374,7 +8239,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.0.4) debug: 3.2.7 eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 @@ -8533,7 +8398,7 @@ packages: - eslint-import-resolver-webpack - supports-color - /eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0): + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -8543,7 +8408,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.0.4) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -8552,7 +8417,7 @@ packages: doctrine: 2.1.0 eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -12620,10 +12485,6 @@ packages: - supports-color dev: true - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -16384,6 +16245,7 @@ packages: dependencies: tslib: 1.14.1 typescript: 5.2.2 + dev: false /tsx@3.14.0: resolution: {integrity: sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==} @@ -17324,7 +17186,7 @@ packages: engines: {node: '>=12'} dev: true - /xo@0.54.2(eslint-import-resolver-typescript@3.6.1)(webpack@5.89.0): + /xo@0.54.2(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(webpack@5.89.0): resolution: {integrity: sha512-1S3r+ecCg8OVPtu711as+cgwxOg+WQNRgSzqZ+OHzYlsa8CpW3ych0Ve9k8Q2QG6gqO3HSpaS5AXi9D0yPUffg==} engines: {node: '>=14.16'} hasBin: true @@ -17335,20 +17197,17 @@ packages: optional: true dependencies: '@eslint/eslintrc': 1.4.1 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.54.0)(typescript@5.2.2) - '@typescript-eslint/parser': 5.62.0(eslint@8.54.0)(typescript@5.2.2) arrify: 3.0.0 cosmiconfig: 8.3.6(typescript@5.2.2) define-lazy-prop: 3.0.0 eslint: 8.54.0 eslint-config-prettier: 8.10.0(eslint@8.54.0) eslint-config-xo: 0.43.1(eslint@8.54.0) - eslint-config-xo-typescript: 0.57.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint@8.54.0)(typescript@5.2.2) eslint-formatter-pretty: 5.0.0 eslint-import-resolver-webpack: 0.13.2(eslint-plugin-import@2.29.1)(webpack@5.89.0) eslint-plugin-ava: 14.0.0(eslint@8.54.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.54.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0) eslint-plugin-n: 15.7.0(eslint@8.54.0) eslint-plugin-no-use-extend-native: 0.5.0 eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.54.0)(prettier@2.8.8) @@ -17372,6 +17231,7 @@ packages: typescript: 5.2.2 webpack: 5.89.0 transitivePeerDependencies: + - '@typescript-eslint/parser' - eslint-import-resolver-typescript - supports-color dev: true From 62d56b367fdc0de2add7817c06a968cdd756867b Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 12:03:54 -0800 Subject: [PATCH 03/13] Use prettier for content.ts --- .../runtime/lib/compiled/opcodes/content.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts index 522c46c59..a7dd6c449 100644 --- a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts +++ b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts @@ -11,7 +11,14 @@ import { isObject } from '@glimmer/util'; import { ContentType, CurriedType, Op } from '@glimmer/vm'; import { isCurriedType } from '../../curried-value'; -import { isEmpty, isFragment, isNode, isSafeString, isTrustedHTML, shouldCoerce } from '../../dom/normalize'; +import { + isEmpty, + isFragment, + isNode, + isSafeString, + isTrustedHTML, + shouldCoerce, +} from '../../dom/normalize'; import { APPEND_OPCODES } from '../../opcodes'; import DynamicTextContent from '../../vm/content/text'; import { CheckReference } from './-debug-strip'; @@ -89,7 +96,11 @@ APPEND_OPCODES.add(Op.AppendHTML, (vm) => { let reference = check(vm.stack.pop(), CheckReference); let rawValue = valueForRef(reference); - let value = isEmpty(rawValue) ? '' : isTrustedHTML(rawValue) ? rawValue as string : String(rawValue); + let value = isEmpty(rawValue) + ? '' + : isTrustedHTML(rawValue) + ? (rawValue as string) + : String(rawValue); vm.elements().appendDynamicHTML(value); }); From 7e3b94ce82d5abc533f413b038fbb8a843681dbf Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 13:29:11 -0800 Subject: [PATCH 04/13] Small fix in test --- .../integration-tests/test/trusted-html-test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts b/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts index 7c28a4c2e..54968cc57 100644 --- a/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts +++ b/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts @@ -27,7 +27,7 @@ export class TrustedHTMLTests extends RenderTest { }); this.render('
{{trustedHTML}}
'); - this.assertHTML('
test\'""test\'""
'); this.assertStableRerender(); } From eee2ef74bca637fb4a0fec09a3f21509b808a863 Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 14:01:44 -0800 Subject: [PATCH 05/13] Update comment in test --- .../integration-tests/test/trusted-html-test.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts b/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts index 54968cc57..a9cea59b3 100644 --- a/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts +++ b/packages/@glimmer-workspace/integration-tests/test/trusted-html-test.ts @@ -40,6 +40,10 @@ export class TrustedHTMLTests extends RenderTest { return policy?.createHTML(html); }); + // To keep rendering behavior consistent with SafeString + // trustedHTML is not encoded or decoded in attribute value context. + // It is set as string, that means result value can contain HTML enitites. + // TrustedHTML value must not escape from HTML attribute value context to prevent XSS. this.render('{{trustedHTML}}'); this.assertHTML('test\'""'); this.assertStableRerender(); From 23a8b0da47ba600aa2db215f6c545dbb4b12981e Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 14:43:53 -0800 Subject: [PATCH 06/13] Add type TrustedHTML to methods used to append HTML --- .../interfaces/lib/dom/attributes.d.ts | 4 +- .../@glimmer/interfaces/lib/dom/changes.d.ts | 8 +- packages/@glimmer/interfaces/package.json | 3 +- .../runtime/lib/compiled/opcodes/content.ts | 2 +- .../@glimmer/runtime/lib/dom/normalize.ts | 4 +- .../runtime/lib/vm/element-builder.ts | 3 +- pnpm-lock.yaml | 109 +++--------------- 7 files changed, 35 insertions(+), 98 deletions(-) diff --git a/packages/@glimmer/interfaces/lib/dom/attributes.d.ts b/packages/@glimmer/interfaces/lib/dom/attributes.d.ts index 370671a93..a8b358b46 100644 --- a/packages/@glimmer/interfaces/lib/dom/attributes.d.ts +++ b/packages/@glimmer/interfaces/lib/dom/attributes.d.ts @@ -1,3 +1,5 @@ +import type { TrustedHTML } from 'trusted-types/lib'; + import type { Maybe, Nullable } from '../core.js'; import type { ElementOperations, Environment, ModifierInstance } from '../runtime.js'; import type { Stack } from '../stack.js'; @@ -45,7 +47,7 @@ export interface DOMStack { appendText(string: string): SimpleText; appendComment(string: string): SimpleComment; - appendDynamicHTML(value: string): void; + appendDynamicHTML(value: string | TrustedHTML): void; appendDynamicText(value: string): SimpleText; appendDynamicFragment(value: SimpleDocumentFragment): void; appendDynamicNode(value: SimpleNode): void; diff --git a/packages/@glimmer/interfaces/lib/dom/changes.d.ts b/packages/@glimmer/interfaces/lib/dom/changes.d.ts index a847cbeeb..3ab7b01b7 100644 --- a/packages/@glimmer/interfaces/lib/dom/changes.d.ts +++ b/packages/@glimmer/interfaces/lib/dom/changes.d.ts @@ -1,3 +1,5 @@ +import type { TrustedHTML } from 'trusted-types/lib'; + import type { Nullable } from '../core.js'; import type { Bounds } from './bounds.js'; import type { Namespace, SimpleComment, SimpleElement, SimpleNode, SimpleText } from './simple.js'; @@ -5,7 +7,11 @@ import type { Namespace, SimpleComment, SimpleElement, SimpleNode, SimpleText } export interface GlimmerDOMOperations { createElement(tag: string, context?: SimpleElement): SimpleElement; insertBefore(parent: SimpleElement, node: SimpleNode, reference: Nullable): void; - insertHTMLBefore(parent: SimpleElement, nextSibling: Nullable, html: string): Bounds; + insertHTMLBefore( + parent: SimpleElement, + nextSibling: Nullable, + html: string | TrustedHTML + ): Bounds; createTextNode(text: string): SimpleText; createComment(data: string): SimpleComment; } diff --git a/packages/@glimmer/interfaces/package.json b/packages/@glimmer/interfaces/package.json index ba486d7a6..a4b635963 100644 --- a/packages/@glimmer/interfaces/package.json +++ b/packages/@glimmer/interfaces/package.json @@ -20,7 +20,8 @@ "test:types": "tsc --noEmit" }, "dependencies": { - "@simple-dom/interface": "^1.4.0" + "@simple-dom/interface": "^1.4.0", + "@types/trusted-types": "^2.0.7" }, "devDependencies": { "@glimmer-workspace/build-support": "workspace:^", diff --git a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts index a7dd6c449..c23ce605b 100644 --- a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts +++ b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts @@ -99,7 +99,7 @@ APPEND_OPCODES.add(Op.AppendHTML, (vm) => { let value = isEmpty(rawValue) ? '' : isTrustedHTML(rawValue) - ? (rawValue as string) + ? (rawValue) : String(rawValue); vm.elements().appendDynamicHTML(value); diff --git a/packages/@glimmer/runtime/lib/dom/normalize.ts b/packages/@glimmer/runtime/lib/dom/normalize.ts index 638a87ea3..97483ed12 100644 --- a/packages/@glimmer/runtime/lib/dom/normalize.ts +++ b/packages/@glimmer/runtime/lib/dom/normalize.ts @@ -1,5 +1,5 @@ import type { Dict, SimpleDocumentFragment, SimpleNode } from '@glimmer/interfaces'; -import type { TrustedTypesWindow } from 'trusted-types/lib'; +import type { TrustedHTML,TrustedTypesWindow } from 'trusted-types/lib'; export interface SafeString { toHTML(): string; @@ -52,7 +52,7 @@ if (typeof window !== 'undefined') { } } -export function isTrustedHTML(value: unknown): boolean { +export function isTrustedHTML(value: unknown): value is TrustedHTML { return isHTML ? isHTML(value) : false; } diff --git a/packages/@glimmer/runtime/lib/vm/element-builder.ts b/packages/@glimmer/runtime/lib/vm/element-builder.ts index e4e6d3001..660a7b784 100644 --- a/packages/@glimmer/runtime/lib/vm/element-builder.ts +++ b/packages/@glimmer/runtime/lib/vm/element-builder.ts @@ -19,6 +19,7 @@ import type { SimpleText, UpdatableBlock, } from '@glimmer/interfaces'; +import type { TrustedHTML } from 'trusted-types/lib'; import { destroy, registerDestructor } from '@glimmer/destroyable'; import { assert, expect, Stack } from '@glimmer/util'; @@ -301,7 +302,7 @@ export class NewElementBuilder implements ElementBuilder { } } - __appendHTML(html: string): Bounds { + __appendHTML(html: string| TrustedHTML): Bounds { return this.dom.insertHTMLBefore(this.element, this.nextSibling, html); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6fa94235..bcfc4f364 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -753,6 +753,9 @@ importers: '@simple-dom/interface': specifier: ^1.4.0 version: 1.4.0 + '@types/trusted-types': + specifier: ^2.0.7 + version: 2.0.7 devDependencies: '@glimmer-workspace/build-support': specifier: workspace:^ @@ -4145,7 +4148,6 @@ packages: dependencies: '@types/eslint': 8.44.7 '@types/estree': 1.0.5 - dev: true /@types/eslint-utils@3.0.5: resolution: {integrity: sha512-dGOLJqHXpjomkPgZiC7vnVSJtFIOM1Y6L01EyUhzPuD0y0wfIGiqxiGs3buUBfzxLIQHrCvZsIMDaCZ8R5IIoA==} @@ -4393,7 +4395,6 @@ packages: typescript: 5.0.4 transitivePeerDependencies: - supports-color - dev: true /@typescript-eslint/eslint-plugin@6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-XOpZ3IyJUIV1b15M7HVOpgQxPPF7lGXgsfcEIu3yDxFPaf/xZKt7s9QO/pbk7vpWQyVulpJbu4E5LwpZiQo4kA==} @@ -4422,6 +4423,7 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/parser@6.12.0(eslint@8.54.0)(typescript@5.0.4): resolution: {integrity: sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==} @@ -4442,7 +4444,6 @@ packages: typescript: 5.0.4 transitivePeerDependencies: - supports-color - dev: true /@typescript-eslint/parser@6.12.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==} @@ -4463,6 +4464,7 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/scope-manager@6.12.0: resolution: {integrity: sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==} @@ -4489,7 +4491,6 @@ packages: typescript: 5.0.4 transitivePeerDependencies: - supports-color - dev: true /@typescript-eslint/type-utils@6.12.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-WWmRXxhm1X8Wlquj+MhsAG4dU/Blvf1xDgGaYCzfvStP2NwPQh6KBvCDbiOEvaE0filhranjIlK/2fSTVwtBng==} @@ -4509,6 +4510,7 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/types@6.12.0: resolution: {integrity: sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==} @@ -4533,7 +4535,6 @@ packages: typescript: 5.0.4 transitivePeerDependencies: - supports-color - dev: true /@typescript-eslint/typescript-estree@6.12.0(typescript@5.2.2): resolution: {integrity: sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==} @@ -4554,6 +4555,7 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color + dev: false /@typescript-eslint/utils@6.12.0(eslint@8.54.0)(typescript@5.0.4): resolution: {integrity: sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==} @@ -4572,7 +4574,6 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true /@typescript-eslint/utils@6.12.0(eslint@8.54.0)(typescript@5.2.2): resolution: {integrity: sha512-LywPm8h3tGEbgfyjYnu3dauZ0U7R60m+miXgKcZS8c7QALO9uWJdvNoP+duKTk2XMWc7/Q3d/QiCuLN9X6SWyQ==} @@ -4591,6 +4592,7 @@ packages: transitivePeerDependencies: - supports-color - typescript + dev: false /@typescript-eslint/visitor-keys@6.12.0: resolution: {integrity: sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==} @@ -4607,19 +4609,15 @@ packages: dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true /@webassemblyjs/floating-point-hex-parser@1.11.6: resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true /@webassemblyjs/helper-api-error@1.11.6: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true /@webassemblyjs/helper-buffer@1.11.6: resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true /@webassemblyjs/helper-numbers@1.11.6: resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} @@ -4627,11 +4625,9 @@ packages: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/helper-wasm-bytecode@1.11.6: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true /@webassemblyjs/helper-wasm-section@1.11.6: resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} @@ -4640,23 +4636,19 @@ packages: '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 - dev: true /@webassemblyjs/ieee754@1.11.6: resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} dependencies: '@xtuc/ieee754': 1.2.0 - dev: true /@webassemblyjs/leb128@1.11.6: resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} dependencies: '@xtuc/long': 4.2.2 - dev: true /@webassemblyjs/utf8@1.11.6: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true /@webassemblyjs/wasm-edit@1.11.6: resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} @@ -4669,7 +4661,6 @@ packages: '@webassemblyjs/wasm-opt': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 '@webassemblyjs/wast-printer': 1.11.6 - dev: true /@webassemblyjs/wasm-gen@1.11.6: resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} @@ -4679,7 +4670,6 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true /@webassemblyjs/wasm-opt@1.11.6: resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} @@ -4688,7 +4678,6 @@ packages: '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - dev: true /@webassemblyjs/wasm-parser@1.11.6: resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} @@ -4699,14 +4688,12 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true /@webassemblyjs/wast-printer@1.11.6: resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} dependencies: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - dev: true /@wessberg/stringutil@1.0.19: resolution: {integrity: sha512-9AZHVXWlpN8Cn9k5BC/O0Dzb9E9xfEMXzYrNunwvkUTvuK7xgQPVRZpLo+jWCOZ5r8oBa8NIrHuPEu1hzbb6bg==} @@ -4720,11 +4707,9 @@ packages: /@xtuc/ieee754@1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true /@xtuc/long@4.2.2: resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -4744,7 +4729,6 @@ packages: acorn: ^8 dependencies: acorn: 8.11.3 - dev: true /acorn-jsx@5.3.2(acorn@8.11.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -4766,7 +4750,6 @@ packages: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /agent-base@4.3.0: resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} @@ -4813,7 +4796,6 @@ packages: ajv: ^6.9.1 dependencies: ajv: 6.12.6 - dev: true /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -5056,7 +5038,6 @@ packages: /array-find@1.0.0: resolution: {integrity: sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ==} - dev: true /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -6281,7 +6262,6 @@ packages: /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} - dev: true /chromium-bidi@0.4.7(devtools-protocol@0.0.1120988): resolution: {integrity: sha512-6+mJuFXwTMU6I3vYLs6IL8A1DyQTPjCfIL971X0aMPVGRbGnNfl6i6Cl0NMbxi2bRYLGESt9T2ZIMRM5PAEcIQ==} @@ -7848,7 +7828,6 @@ packages: graceful-fs: 4.2.11 memory-fs: 0.2.0 tapable: 0.1.10 - dev: true /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} @@ -7959,7 +7938,6 @@ packages: /es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - dev: true /es-set-tostringtag@2.0.2: resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} @@ -8159,7 +8137,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) enhanced-resolve: 5.15.0 eslint: 8.54.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0) eslint-plugin-import: /eslint-plugin-i@2.29.1(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) fast-glob: 3.3.1 get-tsconfig: 4.7.2 @@ -8170,7 +8148,6 @@ packages: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - dev: true /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.12.0)(eslint-plugin-import@2.29.0)(eslint@8.54.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} @@ -8182,7 +8159,7 @@ packages: debug: 4.3.4(supports-color@8.1.1) enhanced-resolve: 5.15.0 eslint: 8.54.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0) eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) fast-glob: 3.3.1 get-tsconfig: 4.7.2 @@ -8193,6 +8170,7 @@ packages: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color + dev: false /eslint-import-resolver-webpack@0.13.2(eslint-plugin-import@2.29.1)(webpack@5.89.0): resolution: {integrity: sha512-XodIPyg1OgE2h5BDErz3WJoK7lawxKTJNhgPNafRST6csC/MZC+L5P6kKqsZGRInpbgc02s/WZMrb4uGJzcuRg==} @@ -8216,7 +8194,6 @@ packages: webpack: 5.89.0 transitivePeerDependencies: - supports-color - dev: true /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} @@ -8247,36 +8224,6 @@ packages: eslint-import-resolver-webpack: 0.13.2(eslint-plugin-import@2.29.1)(webpack@5.89.0) transitivePeerDependencies: - supports-color - dev: true - - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.2.2) - debug: 3.2.7 - eslint: 8.54.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.12.0)(eslint-plugin-import@2.29.0)(eslint@8.54.0) - transitivePeerDependencies: - - supports-color /eslint-plugin-ava@14.0.0(eslint@8.54.0): resolution: {integrity: sha512-XmKT6hppaipwwnLVwwvQliSU6AF1QMHiNoLD5JQfzhUhf0jY7CO0O624fQrE+Y/fTb9vbW8r77nKf7M/oHulxw==} @@ -8352,7 +8299,7 @@ packages: doctrine: 3.0.0 eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0) get-tsconfig: 4.7.2 is-glob: 4.0.3 minimatch: 3.1.2 @@ -8362,7 +8309,6 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true /eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0): resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} @@ -8374,7 +8320,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.12.0(eslint@8.54.0)(typescript@5.0.4) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -8383,7 +8329,7 @@ packages: doctrine: 2.1.0 eslint: 8.54.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.54.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -8397,6 +8343,7 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: false /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.12.0)(eslint-import-resolver-typescript@3.6.1)(eslint-import-resolver-webpack@0.13.2)(eslint@8.54.0): resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} @@ -8431,7 +8378,6 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true /eslint-plugin-json@3.1.0: resolution: {integrity: sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==} @@ -8605,7 +8551,7 @@ packages: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.12.0(@typescript-eslint/parser@6.12.0)(eslint@8.54.0)(typescript@5.0.4) eslint: 8.54.0 eslint-rule-composer: 0.3.0 @@ -8623,7 +8569,6 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} @@ -8765,7 +8710,6 @@ packages: /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} - dev: true /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} @@ -8820,7 +8764,6 @@ packages: /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - dev: true /exec-sh@0.3.6: resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} @@ -9236,7 +9179,6 @@ packages: /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: true /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} @@ -9692,7 +9634,6 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true /glob@10.2.3: resolution: {integrity: sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg==} @@ -10011,7 +9952,6 @@ packages: /has@1.0.4: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} - dev: true /hash-for-dep@1.5.1: resolution: {integrity: sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw==} @@ -10499,7 +10439,6 @@ packages: /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} - dev: true /invert-kv@3.0.1: resolution: {integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==} @@ -11058,7 +10997,6 @@ packages: '@types/node': 20.9.4 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true /js-reporters@2.1.0: resolution: {integrity: sha512-Q4GcEcPSb6ovhqp91claM3WPbSntQxbIn+3JiJgEXturys2ttWgs31VC60Yja+2unpNOH2A2qyjWFU2thCQ8sg==} @@ -11393,7 +11331,6 @@ packages: /loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - dev: true /loader-utils@3.2.1: resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} @@ -11884,7 +11821,6 @@ packages: /memory-fs@0.2.0: resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} - dev: true /memory-streams@0.1.3: resolution: {integrity: sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==} @@ -12170,14 +12106,12 @@ packages: /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - dev: true /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - dev: true /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} @@ -12499,7 +12433,6 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true /netmask@2.0.2: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} @@ -14879,7 +14812,6 @@ packages: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true /scslre@0.3.0: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} @@ -15672,7 +15604,6 @@ packages: /tapable@0.1.10: resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} engines: {node: '>=0.6'} - dev: true /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -15744,7 +15675,6 @@ packages: serialize-javascript: 6.0.1 terser: 5.26.0 webpack: 5.89.0 - dev: true /terser@5.24.0: resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} @@ -15765,7 +15695,6 @@ packages: acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 - dev: true /testem-failure-only-reporter@1.0.0: resolution: {integrity: sha512-G3fC1FSW/mI2ElrzaJfGEtTHBB7U1IFimwC1oIpUc1+wYsgw+2tCUV1t+cB/dsBbryq4Cbe1NQ397fJ2maCs7g==} @@ -16164,7 +16093,6 @@ packages: typescript: ^5.0.4 || 5 dependencies: typescript: 5.0.4 - dev: true /ts-api-utils@1.0.3(typescript@5.2.2): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} @@ -16173,6 +16101,7 @@ packages: typescript: ^5.0.4 || 5 dependencies: typescript: 5.2.2 + dev: false /ts-clone-node@3.0.0(typescript@5.0.4): resolution: {integrity: sha512-egavvyHbIoelkgh1IC2agNB1uMNjB8VJgh0g/cn0bg2XXTcrtjrGMzEk4OD3Fi2hocICjP3vMa56nkzIzq0FRg==} @@ -16221,6 +16150,7 @@ packages: json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 + dev: false /tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -16229,7 +16159,6 @@ packages: json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -16906,7 +16835,6 @@ packages: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -16968,7 +16896,6 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true /webpod@0.0.2: resolution: {integrity: sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg==} From 1abf2856429bee202d42786a725b711f4194e537 Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 14:45:18 -0800 Subject: [PATCH 07/13] Formatting --- packages/@glimmer/runtime/lib/compiled/opcodes/content.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts index c23ce605b..058faee26 100644 --- a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts +++ b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts @@ -96,11 +96,7 @@ APPEND_OPCODES.add(Op.AppendHTML, (vm) => { let reference = check(vm.stack.pop(), CheckReference); let rawValue = valueForRef(reference); - let value = isEmpty(rawValue) - ? '' - : isTrustedHTML(rawValue) - ? (rawValue) - : String(rawValue); + let value = isEmpty(rawValue) ? '' : isTrustedHTML(rawValue) ? rawValue : String(rawValue); vm.elements().appendDynamicHTML(value); }); From ecc32300ff542705d8973752560cd473b616904d Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 15:18:00 -0800 Subject: [PATCH 08/13] Formatting --- packages/@glimmer/runtime/lib/dom/normalize.ts | 2 +- packages/@glimmer/runtime/lib/dom/operations.ts | 13 +++++++++---- packages/@glimmer/runtime/lib/vm/element-builder.ts | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/@glimmer/runtime/lib/dom/normalize.ts b/packages/@glimmer/runtime/lib/dom/normalize.ts index 97483ed12..2908fe9e0 100644 --- a/packages/@glimmer/runtime/lib/dom/normalize.ts +++ b/packages/@glimmer/runtime/lib/dom/normalize.ts @@ -1,5 +1,5 @@ import type { Dict, SimpleDocumentFragment, SimpleNode } from '@glimmer/interfaces'; -import type { TrustedHTML,TrustedTypesWindow } from 'trusted-types/lib'; +import type { TrustedHTML, TrustedTypesWindow } from 'trusted-types/lib'; export interface SafeString { toHTML(): string; diff --git a/packages/@glimmer/runtime/lib/dom/operations.ts b/packages/@glimmer/runtime/lib/dom/operations.ts index f135c4889..406e2b3ce 100644 --- a/packages/@glimmer/runtime/lib/dom/operations.ts +++ b/packages/@glimmer/runtime/lib/dom/operations.ts @@ -8,6 +8,7 @@ import type { SimpleNode, SimpleText, } from '@glimmer/interfaces'; +import type { TrustedHTML } from 'trusted-types/lib'; import { expect, INSERT_BEFORE_BEGIN, INSERT_BEFORE_END, NS_SVG } from '@glimmer/util'; import { ConcreteBounds } from '../bounds'; @@ -66,7 +67,11 @@ export class DOMOperations { parent.insertBefore(node, reference); } - insertHTMLBefore(parent: SimpleElement, nextSibling: Nullable, html: string): Bounds { + insertHTMLBefore( + parent: SimpleElement, + nextSibling: Nullable, + html: string | TrustedHTML + ): Bounds { if (html === '') { const comment = this.createComment(''); parent.insertBefore(comment, nextSibling); @@ -77,10 +82,10 @@ export class DOMOperations { let last: SimpleNode; if (nextSibling === null) { - parent.insertAdjacentHTML(INSERT_BEFORE_END, html); + parent.insertAdjacentHTML(INSERT_BEFORE_END, html as string); last = expect(parent.lastChild, 'bug in insertAdjacentHTML?'); } else if (nextSibling instanceof HTMLElement) { - nextSibling.insertAdjacentHTML('beforebegin', html); + nextSibling.insertAdjacentHTML('beforebegin', html as string); last = expect(nextSibling.previousSibling, 'bug in insertAdjacentHTML?'); } else { // Non-element nodes do not support insertAdjacentHTML, so add an @@ -91,7 +96,7 @@ export class DOMOperations { const { uselessElement } = this; parent.insertBefore(uselessElement, nextSibling); - uselessElement.insertAdjacentHTML(INSERT_BEFORE_BEGIN, html); + uselessElement.insertAdjacentHTML(INSERT_BEFORE_BEGIN, html as string); last = expect(uselessElement.previousSibling, 'bug in insertAdjacentHTML?'); parent.removeChild(uselessElement); } diff --git a/packages/@glimmer/runtime/lib/vm/element-builder.ts b/packages/@glimmer/runtime/lib/vm/element-builder.ts index 660a7b784..fd77d38a9 100644 --- a/packages/@glimmer/runtime/lib/vm/element-builder.ts +++ b/packages/@glimmer/runtime/lib/vm/element-builder.ts @@ -302,7 +302,7 @@ export class NewElementBuilder implements ElementBuilder { } } - __appendHTML(html: string| TrustedHTML): Bounds { + __appendHTML(html: string | TrustedHTML): Bounds { return this.dom.insertHTMLBefore(this.element, this.nextSibling, html); } From d3f379372446390f2c5c942b607078c464d6ef13 Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 15:19:48 -0800 Subject: [PATCH 09/13] Don't modify insertHTMLBefore before simple-dom --- packages/@glimmer/runtime/lib/dom/operations.ts | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/packages/@glimmer/runtime/lib/dom/operations.ts b/packages/@glimmer/runtime/lib/dom/operations.ts index 406e2b3ce..f135c4889 100644 --- a/packages/@glimmer/runtime/lib/dom/operations.ts +++ b/packages/@glimmer/runtime/lib/dom/operations.ts @@ -8,7 +8,6 @@ import type { SimpleNode, SimpleText, } from '@glimmer/interfaces'; -import type { TrustedHTML } from 'trusted-types/lib'; import { expect, INSERT_BEFORE_BEGIN, INSERT_BEFORE_END, NS_SVG } from '@glimmer/util'; import { ConcreteBounds } from '../bounds'; @@ -67,11 +66,7 @@ export class DOMOperations { parent.insertBefore(node, reference); } - insertHTMLBefore( - parent: SimpleElement, - nextSibling: Nullable, - html: string | TrustedHTML - ): Bounds { + insertHTMLBefore(parent: SimpleElement, nextSibling: Nullable, html: string): Bounds { if (html === '') { const comment = this.createComment(''); parent.insertBefore(comment, nextSibling); @@ -82,10 +77,10 @@ export class DOMOperations { let last: SimpleNode; if (nextSibling === null) { - parent.insertAdjacentHTML(INSERT_BEFORE_END, html as string); + parent.insertAdjacentHTML(INSERT_BEFORE_END, html); last = expect(parent.lastChild, 'bug in insertAdjacentHTML?'); } else if (nextSibling instanceof HTMLElement) { - nextSibling.insertAdjacentHTML('beforebegin', html as string); + nextSibling.insertAdjacentHTML('beforebegin', html); last = expect(nextSibling.previousSibling, 'bug in insertAdjacentHTML?'); } else { // Non-element nodes do not support insertAdjacentHTML, so add an @@ -96,7 +91,7 @@ export class DOMOperations { const { uselessElement } = this; parent.insertBefore(uselessElement, nextSibling); - uselessElement.insertAdjacentHTML(INSERT_BEFORE_BEGIN, html as string); + uselessElement.insertAdjacentHTML(INSERT_BEFORE_BEGIN, html); last = expect(uselessElement.previousSibling, 'bug in insertAdjacentHTML?'); parent.removeChild(uselessElement); } From 1a21f68ef545502edbc4876dc16d5585b2f36f7f Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 20:45:38 -0800 Subject: [PATCH 10/13] Don't change types of interfaces --- packages/@glimmer/interfaces/lib/dom/attributes.d.ts | 4 +--- packages/@glimmer/interfaces/lib/dom/changes.d.ts | 8 +------- packages/@glimmer/runtime/lib/compiled/opcodes/content.ts | 6 +++++- packages/@glimmer/runtime/lib/vm/element-builder.ts | 3 +-- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/packages/@glimmer/interfaces/lib/dom/attributes.d.ts b/packages/@glimmer/interfaces/lib/dom/attributes.d.ts index a8b358b46..370671a93 100644 --- a/packages/@glimmer/interfaces/lib/dom/attributes.d.ts +++ b/packages/@glimmer/interfaces/lib/dom/attributes.d.ts @@ -1,5 +1,3 @@ -import type { TrustedHTML } from 'trusted-types/lib'; - import type { Maybe, Nullable } from '../core.js'; import type { ElementOperations, Environment, ModifierInstance } from '../runtime.js'; import type { Stack } from '../stack.js'; @@ -47,7 +45,7 @@ export interface DOMStack { appendText(string: string): SimpleText; appendComment(string: string): SimpleComment; - appendDynamicHTML(value: string | TrustedHTML): void; + appendDynamicHTML(value: string): void; appendDynamicText(value: string): SimpleText; appendDynamicFragment(value: SimpleDocumentFragment): void; appendDynamicNode(value: SimpleNode): void; diff --git a/packages/@glimmer/interfaces/lib/dom/changes.d.ts b/packages/@glimmer/interfaces/lib/dom/changes.d.ts index 3ab7b01b7..a847cbeeb 100644 --- a/packages/@glimmer/interfaces/lib/dom/changes.d.ts +++ b/packages/@glimmer/interfaces/lib/dom/changes.d.ts @@ -1,5 +1,3 @@ -import type { TrustedHTML } from 'trusted-types/lib'; - import type { Nullable } from '../core.js'; import type { Bounds } from './bounds.js'; import type { Namespace, SimpleComment, SimpleElement, SimpleNode, SimpleText } from './simple.js'; @@ -7,11 +5,7 @@ import type { Namespace, SimpleComment, SimpleElement, SimpleNode, SimpleText } export interface GlimmerDOMOperations { createElement(tag: string, context?: SimpleElement): SimpleElement; insertBefore(parent: SimpleElement, node: SimpleNode, reference: Nullable): void; - insertHTMLBefore( - parent: SimpleElement, - nextSibling: Nullable, - html: string | TrustedHTML - ): Bounds; + insertHTMLBefore(parent: SimpleElement, nextSibling: Nullable, html: string): Bounds; createTextNode(text: string): SimpleText; createComment(data: string): SimpleComment; } diff --git a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts index 058faee26..a0a6d8145 100644 --- a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts +++ b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts @@ -96,7 +96,11 @@ APPEND_OPCODES.add(Op.AppendHTML, (vm) => { let reference = check(vm.stack.pop(), CheckReference); let rawValue = valueForRef(reference); - let value = isEmpty(rawValue) ? '' : isTrustedHTML(rawValue) ? rawValue : String(rawValue); + let value = isEmpty(rawValue) + ? '' + : isTrustedHTML(rawValue) + ? (rawValue as unknown as string) + : String(rawValue); vm.elements().appendDynamicHTML(value); }); diff --git a/packages/@glimmer/runtime/lib/vm/element-builder.ts b/packages/@glimmer/runtime/lib/vm/element-builder.ts index fd77d38a9..e4e6d3001 100644 --- a/packages/@glimmer/runtime/lib/vm/element-builder.ts +++ b/packages/@glimmer/runtime/lib/vm/element-builder.ts @@ -19,7 +19,6 @@ import type { SimpleText, UpdatableBlock, } from '@glimmer/interfaces'; -import type { TrustedHTML } from 'trusted-types/lib'; import { destroy, registerDestructor } from '@glimmer/destroyable'; import { assert, expect, Stack } from '@glimmer/util'; @@ -302,7 +301,7 @@ export class NewElementBuilder implements ElementBuilder { } } - __appendHTML(html: string | TrustedHTML): Bounds { + __appendHTML(html: string): Bounds { return this.dom.insertHTMLBefore(this.element, this.nextSibling, html); } From af6ea25a3deadd558e7646abc4a00273ae854312 Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 21:33:45 -0800 Subject: [PATCH 11/13] Stringify TrustedHTML --- bin/opcodes.json | 9 ++++++++- .../@glimmer/runtime/lib/compiled/opcodes/content.ts | 6 +----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/bin/opcodes.json b/bin/opcodes.json index 66dd0efa4..042016f1f 100644 --- a/bin/opcodes.json +++ b/bin/opcodes.json @@ -5,7 +5,13 @@ "code": "@glimmer/vm/lib/generated/opcodes.ts", "debug": "@glimmer/debug/lib/generated/op-list.ts" }, - "machine": ["PushFrame", "PopFrame", "Jump", "ReturnTo", "UnwindTypeFrame"], + "machine": [ + "PushFrame", + "PopFrame", + "Jump", + "ReturnTo", + "UnwindTypeFrame" + ], "syscall": [ "PushBegin", "Begin", @@ -44,6 +50,7 @@ "Comment", "AppendHTML", "AppendSafeHTML", + "AppendTrustedHTML", "AppendDocumentFragment", "AppendNode", "AppendText", diff --git a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts index a0a6d8145..832f89656 100644 --- a/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts +++ b/packages/@glimmer/runtime/lib/compiled/opcodes/content.ts @@ -96,11 +96,7 @@ APPEND_OPCODES.add(Op.AppendHTML, (vm) => { let reference = check(vm.stack.pop(), CheckReference); let rawValue = valueForRef(reference); - let value = isEmpty(rawValue) - ? '' - : isTrustedHTML(rawValue) - ? (rawValue as unknown as string) - : String(rawValue); + let value = isEmpty(rawValue) ? '' : String(rawValue); vm.elements().appendDynamicHTML(value); }); From 2c67820f3221379fcd20ec063138e1342937ea3a Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 21:34:30 -0800 Subject: [PATCH 12/13] Stringify TrustedHTML --- bin/opcodes.json | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/opcodes.json b/bin/opcodes.json index 042016f1f..9c91f9066 100644 --- a/bin/opcodes.json +++ b/bin/opcodes.json @@ -50,7 +50,6 @@ "Comment", "AppendHTML", "AppendSafeHTML", - "AppendTrustedHTML", "AppendDocumentFragment", "AppendNode", "AppendText", From 0d54eec21fdc3845b4157db4126cbf4a7eb9ee6c Mon Sep 17 00:00:00 2001 From: Roman Shafigullin Date: Wed, 21 Feb 2024 21:46:35 -0800 Subject: [PATCH 13/13] revert bin/opcodes.json --- bin/opcodes.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/bin/opcodes.json b/bin/opcodes.json index 9c91f9066..66dd0efa4 100644 --- a/bin/opcodes.json +++ b/bin/opcodes.json @@ -5,13 +5,7 @@ "code": "@glimmer/vm/lib/generated/opcodes.ts", "debug": "@glimmer/debug/lib/generated/op-list.ts" }, - "machine": [ - "PushFrame", - "PopFrame", - "Jump", - "ReturnTo", - "UnwindTypeFrame" - ], + "machine": ["PushFrame", "PopFrame", "Jump", "ReturnTo", "UnwindTypeFrame"], "syscall": [ "PushBegin", "Begin",