diff --git a/.changeset/cruel-shrimps-say.md b/.changeset/cruel-shrimps-say.md deleted file mode 100644 index 853d812bb3..0000000000 --- a/.changeset/cruel-shrimps-say.md +++ /dev/null @@ -1,3 +0,0 @@ ---- - ---- diff --git a/.changeset/curvy-dragons-appear.md b/.changeset/curvy-dragons-appear.md deleted file mode 100644 index 0f9a8f24d4..0000000000 --- a/.changeset/curvy-dragons-appear.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@lynx-js/react": patch ---- - -fix css transform error in testing library diff --git a/.changeset/famous-taxes-jog.md b/.changeset/famous-taxes-jog.md deleted file mode 100644 index 853d812bb3..0000000000 --- a/.changeset/famous-taxes-jog.md +++ /dev/null @@ -1,3 +0,0 @@ ---- - ---- diff --git a/.changeset/four-actors-ring.md b/.changeset/four-actors-ring.md deleted file mode 100644 index 4c0e5b9d61..0000000000 --- a/.changeset/four-actors-ring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@lynx-js/react": patch ---- - -fix the type error of `wrapper` option in testing library's `render` and `renderHook` function diff --git a/.changeset/legal-words-mix.md b/.changeset/legal-words-mix.md deleted file mode 100644 index 66f62c47c3..0000000000 --- a/.changeset/legal-words-mix.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@lynx-js/react": patch ---- - -Introduce recursive hydration for lists to prevent double remove/insert on moves. diff --git a/.changeset/nasty-queens-remain.md b/.changeset/nasty-queens-remain.md deleted file mode 100644 index c6c7ffeb9e..0000000000 --- a/.changeset/nasty-queens-remain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@lynx-js/template-webpack-plugin": patch ---- - -Fix invalid `module.exports=;` syntax in app-service.js. diff --git a/.changeset/rare-mice-leave.md b/.changeset/rare-mice-leave.md deleted file mode 100644 index e7fdd3e9ae..0000000000 --- a/.changeset/rare-mice-leave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@lynx-js/testing-environment": patch ---- - -Fix that `lynxTestingEnv.jsdom` cannot be initialized correctly when `global.jsdom` is not defined. diff --git a/.changeset/shaky-pumas-fail.md b/.changeset/shaky-pumas-fail.md deleted file mode 100644 index ee03f3936f..0000000000 --- a/.changeset/shaky-pumas-fail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@lynx-js/css-extract-webpack-plugin": patch ---- - -Fix "emit different content to the same filename" error diff --git a/.changeset/shiny-ants-battle.md b/.changeset/shiny-ants-battle.md deleted file mode 100644 index 05915cca76..0000000000 --- a/.changeset/shiny-ants-battle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@lynx-js/react": patch ---- - -Handle `` correctly. diff --git a/.changeset/shiny-candies-wear.md b/.changeset/shiny-candies-wear.md deleted file mode 100644 index 8937097500..0000000000 --- a/.changeset/shiny-candies-wear.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@lynx-js/web-mainthread-apis": patch -"@lynx-js/web-constants": patch ---- - -feat: add MTS API: \_\_UpdateComponentInfo diff --git a/.changeset/silly-rockets-bet.md b/.changeset/silly-rockets-bet.md deleted file mode 100644 index 1a1503f3e5..0000000000 --- a/.changeset/silly-rockets-bet.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@lynx-js/web-mainthread-apis": patch ---- - -fix: \_\_ElementFromBinary should mark all elements actively diff --git a/.changeset/tame-kids-retire.md b/.changeset/tame-kids-retire.md deleted file mode 100644 index eb6f3e7960..0000000000 --- a/.changeset/tame-kids-retire.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@lynx-js/web-core": patch ---- - -Fix mtsGlobalThis race condition in createRenderAllOnUI diff --git a/.changeset/thick-times-watch.md b/.changeset/thick-times-watch.md deleted file mode 100644 index 5524e4e79b..0000000000 --- a/.changeset/thick-times-watch.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@lynx-js/web-mainthread-apis": patch -"@lynx-js/web-constants": patch ---- - -fix: `__ElementFromBinary` needs to correctly apply the dataset in elementTemplate to the Element diff --git a/.changeset/true-things-search.md b/.changeset/true-things-search.md deleted file mode 100644 index 45352f6363..0000000000 --- a/.changeset/true-things-search.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@lynx-js/web-mainthread-apis": patch -"@lynx-js/web-constants": patch ---- - -fix: all attributes except `id` and `type` under ElementTemplateData are optional. diff --git a/.changeset/twenty-olives-design.md b/.changeset/twenty-olives-design.md deleted file mode 100644 index 5fed6d7247..0000000000 --- a/.changeset/twenty-olives-design.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@lynx-js/web-mainthread-apis": patch -"@lynx-js/web-constants": patch ---- - -feat: add MTS API \_\_GetAttributeByName diff --git a/.changeset/wise-cars-kneel.md b/.changeset/wise-cars-kneel.md deleted file mode 100644 index 853d812bb3..0000000000 --- a/.changeset/wise-cars-kneel.md +++ /dev/null @@ -1,3 +0,0 @@ ---- - ---- diff --git a/package.json b/package.json index 9a1e8d4b99..b7a3c93894 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "@eslint/js": "^9.33.0", "@eslint/markdown": "^7.1.0", "@microsoft/api-extractor": "catalog:", - "@rslib/core": "^0.12.0", + "@rslib/core": "^0.12.1", "@rspack/core": "catalog:rspack", "@svitejs/changesets-changelog-github-compact": "^1.2.0", "@tsconfig/node20": "^20.1.6", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index c563a9c9db..5e4122a755 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,17 @@ # @lynx-js/react +## 0.112.3 + +### Patch Changes + +- fix css transform error in testing library ([#1500](https://github.com/lynx-family/lynx-stack/pull/1500)) + +- fix the type error of `wrapper` option in testing library's `render` and `renderHook` function ([#1502](https://github.com/lynx-family/lynx-stack/pull/1502)) + +- Introduce recursive hydration for lists to prevent double remove/insert on moves. ([#1401](https://github.com/lynx-family/lynx-stack/pull/1401)) + +- Handle `` correctly. ([#1497](https://github.com/lynx-family/lynx-stack/pull/1497)) + ## 0.112.2 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index 902e27c386..7f58d2a44b 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@lynx-js/react", - "version": "0.112.2", + "version": "0.112.3", "description": "ReactLynx is a framework for developing Lynx applications with familiar React.", "repository": { "type": "git", diff --git a/packages/rspeedy/core/CHANGELOG.md b/packages/rspeedy/core/CHANGELOG.md index da8659034e..ad791d6daa 100644 --- a/packages/rspeedy/core/CHANGELOG.md +++ b/packages/rspeedy/core/CHANGELOG.md @@ -1,5 +1,11 @@ # @lynx-js/rspeedy +## 0.10.7 + +### Patch Changes + +- `output.inlineScripts` defaults to `false` when chunkSplit strategy is not `'all-in-one'` ([#1504](https://github.com/lynx-family/lynx-stack/pull/1504)) + ## 0.10.6 ### Patch Changes diff --git a/packages/rspeedy/core/package.json b/packages/rspeedy/core/package.json index 3ce0823737..e41c86d02f 100644 --- a/packages/rspeedy/core/package.json +++ b/packages/rspeedy/core/package.json @@ -1,6 +1,6 @@ { "name": "@lynx-js/rspeedy", - "version": "0.10.6", + "version": "0.10.7", "description": "A webpack/rspack-based frontend toolchain for Lynx", "keywords": [ "webpack", diff --git a/packages/rspeedy/core/src/config/defaults.ts b/packages/rspeedy/core/src/config/defaults.ts index a35e45fd5c..68925b63e7 100644 --- a/packages/rspeedy/core/src/config/defaults.ts +++ b/packages/rspeedy/core/src/config/defaults.ts @@ -10,6 +10,10 @@ import type { Filename } from './output/filename.js' import type { Config } from './index.js' export function applyDefaultRspeedyConfig(config: Config): Config { + // config.performance?.chunkSplit?.strategy has been explicitly set to a value other than 'all-in-one' + const enableChunkSplitting = config.performance?.chunkSplit?.strategy + && config.performance?.chunkSplit?.strategy !== 'all-in-one' + return mergeRsbuildConfig({ mode: ((): RsbuildMode => { if (config.mode) { @@ -26,8 +30,8 @@ export function applyDefaultRspeedyConfig(config: Config): Config { // from the `output.filename.bundle` field. filename: getFilename(config.output?.filename), - // inlineScripts should be enabled by default - inlineScripts: true, + // inlineScripts defaults to false when chunk splitting is enabled, true otherwise + inlineScripts: !enableChunkSplitting, }, performance: { diff --git a/packages/rspeedy/core/test/config/output/inline-scripts.test.ts b/packages/rspeedy/core/test/config/output/inline-scripts.test.ts index 42666c2a0f..15bdff72e6 100644 --- a/packages/rspeedy/core/test/config/output/inline-scripts.test.ts +++ b/packages/rspeedy/core/test/config/output/inline-scripts.test.ts @@ -29,6 +29,34 @@ describe('output.inlineScripts', () => { expect.assertions(2) }) + test('defaults with enableChunkSplitting', async () => { + const rspeedy = await createStubRspeedy({ + performance: { + chunkSplit: { + strategy: 'split-by-size', + }, + }, + + plugins: [ + { + name: 'test', + setup(api: RsbuildPluginAPI) { + api.modifyRsbuildConfig((config) => { + expect(config.output?.inlineScripts).toBe(false) + }) + api.modifyBundlerChain((_, { environment }) => { + expect(environment.config.output.inlineScripts).toBe(false) + }) + }, + }, + ], + }) + + await rspeedy.initConfigs() + + expect.assertions(2) + }) + test('output.inlineScripts: false', async () => { const rspeedy = await createStubRspeedy({ output: { @@ -54,4 +82,36 @@ describe('output.inlineScripts', () => { expect.assertions(2) }) + + test('output.inlineScripts: true, with enableChunkSplitting', async () => { + const rspeedy = await createStubRspeedy({ + performance: { + chunkSplit: { + strategy: 'split-by-size', + }, + }, + + output: { + inlineScripts: true, + }, + + plugins: [ + { + name: 'test', + setup(api: RsbuildPluginAPI) { + api.modifyRsbuildConfig((config) => { + expect(config.output?.inlineScripts).toBe(true) + }) + api.modifyBundlerChain((_, { environment }) => { + expect(environment.config.output.inlineScripts).toBe(true) + }) + }, + }, + ], + }) + + await rspeedy.initConfigs() + + expect.assertions(2) + }) }) diff --git a/packages/rspeedy/create-rspeedy/CHANGELOG.md b/packages/rspeedy/create-rspeedy/CHANGELOG.md index a3bd975eb1..e78207b3b2 100644 --- a/packages/rspeedy/create-rspeedy/CHANGELOG.md +++ b/packages/rspeedy/create-rspeedy/CHANGELOG.md @@ -1,5 +1,7 @@ # create-rspeedy +## 0.10.7 + ## 0.10.6 ### Patch Changes diff --git a/packages/rspeedy/create-rspeedy/package.json b/packages/rspeedy/create-rspeedy/package.json index 230f7c0de6..17440b1fc6 100644 --- a/packages/rspeedy/create-rspeedy/package.json +++ b/packages/rspeedy/create-rspeedy/package.json @@ -1,6 +1,6 @@ { "name": "create-rspeedy", - "version": "0.10.6", + "version": "0.10.7", "description": "Create Rspeedy-powered ReactLynx apps with one command", "keywords": [ "webpack", diff --git a/packages/rspeedy/plugin-react-alias/CHANGELOG.md b/packages/rspeedy/plugin-react-alias/CHANGELOG.md index 6ce79581c2..bff961fa6b 100644 --- a/packages/rspeedy/plugin-react-alias/CHANGELOG.md +++ b/packages/rspeedy/plugin-react-alias/CHANGELOG.md @@ -1,5 +1,7 @@ # @lynx-js/react-alias-rsbuild-plugin +## 0.10.12 + ## 0.10.11 ### Patch Changes diff --git a/packages/rspeedy/plugin-react-alias/package.json b/packages/rspeedy/plugin-react-alias/package.json index 8e8796b93f..cce0c28054 100644 --- a/packages/rspeedy/plugin-react-alias/package.json +++ b/packages/rspeedy/plugin-react-alias/package.json @@ -1,6 +1,6 @@ { "name": "@lynx-js/react-alias-rsbuild-plugin", - "version": "0.10.11", + "version": "0.10.12", "description": "A rsbuild plugin for making alias in ReactLynx", "keywords": [ "rsbuild", diff --git a/packages/rspeedy/plugin-react/CHANGELOG.md b/packages/rspeedy/plugin-react/CHANGELOG.md index 12566f9f1e..ec09a24e9f 100644 --- a/packages/rspeedy/plugin-react/CHANGELOG.md +++ b/packages/rspeedy/plugin-react/CHANGELOG.md @@ -1,5 +1,19 @@ # @lynx-js/react-rsbuild-plugin +## 0.10.12 + +### Patch Changes + +- `output.inlineScripts` defaults to `false` when chunkSplit strategy is not `'all-in-one'` ([#1504](https://github.com/lynx-family/lynx-stack/pull/1504)) + +- Updated dependencies [[`51a0b19`](https://github.com/lynx-family/lynx-stack/commit/51a0b19078cb18c13f4f3e2ca4f471aa4ddeaa05), [`b391ef5`](https://github.com/lynx-family/lynx-stack/commit/b391ef5c6dd0a0945e68b38f40807df7e1ef672e)]: + - @lynx-js/template-webpack-plugin@0.8.4 + - @lynx-js/css-extract-webpack-plugin@0.6.2 + - @lynx-js/react-alias-rsbuild-plugin@0.10.12 + - @lynx-js/use-sync-external-store@1.5.0 + - @lynx-js/react-refresh-webpack-plugin@0.3.4 + - @lynx-js/react-webpack-plugin@0.6.19 + ## 0.10.11 ### Patch Changes diff --git a/packages/rspeedy/plugin-react/package.json b/packages/rspeedy/plugin-react/package.json index 6f690cf1ed..7b60a63db5 100644 --- a/packages/rspeedy/plugin-react/package.json +++ b/packages/rspeedy/plugin-react/package.json @@ -1,6 +1,6 @@ { "name": "@lynx-js/react-rsbuild-plugin", - "version": "0.10.11", + "version": "0.10.12", "description": "A rsbuild plugin for ReactLynx", "keywords": [ "rsbuild", diff --git a/packages/rspeedy/plugin-react/src/entry.ts b/packages/rspeedy/plugin-react/src/entry.ts index 7a4d79aef5..a7c68074ae 100644 --- a/packages/rspeedy/plugin-react/src/entry.ts +++ b/packages/rspeedy/plugin-react/src/entry.ts @@ -197,6 +197,12 @@ export function applyEntry( .end() }) + const rsbuildConfig = api.getRsbuildConfig() + const userConfig = api.getRsbuildConfig('original') + + const enableChunkSplitting = + rsbuildConfig.performance?.chunkSplit?.strategy !== 'all-in-one' + let finalFirstScreenSyncTiming = firstScreenSyncTiming if (isLynx) { @@ -205,7 +211,8 @@ export function applyEntry( // TODO: support inlineScripts in lazyBundle inlineScripts = true } else { - inlineScripts = environment.config.output?.inlineScripts ?? true + inlineScripts = environment.config.output?.inlineScripts + ?? !enableChunkSplitting } if (inlineScripts !== true) { @@ -247,14 +254,8 @@ export function applyEntry( .end() } - const rsbuildConfig = api.getRsbuildConfig() - const userConfig = api.getRsbuildConfig('original') - let extractStr = originalExtractStr - if ( - rsbuildConfig.performance?.chunkSplit?.strategy !== 'all-in-one' - && originalExtractStr - ) { + if (enableChunkSplitting && originalExtractStr) { logger.warn( '`extractStr` is changed to `false` because it is only supported in `all-in-one` chunkSplit strategy, please set `performance.chunkSplit.strategy` to `all-in-one` to use `extractStr.`', ) diff --git a/packages/rspeedy/plugin-react/test/config.test.ts b/packages/rspeedy/plugin-react/test/config.test.ts index 158013a186..3f3e5cb60d 100644 --- a/packages/rspeedy/plugin-react/test/config.test.ts +++ b/packages/rspeedy/plugin-react/test/config.test.ts @@ -647,6 +647,106 @@ describe('Config', () => { expect(encodePlugin).toHaveProperty('options', { inlineScripts: true }) }) + + test('output.inlineScripts defaults to `true`, when chunkSplit strategy is `all-in-one`', async () => { + const { pluginReactLynx } = await import('../src/pluginReactLynx.js') + const rsbuild = await createRspeedy({ + rspeedyConfig: { + plugins: [ + pluginReactLynx(), + pluginStubRspeedyAPI(), + ], + environments: { + lynx: {}, + }, + performance: { + chunkSplit: { + strategy: 'all-in-one', + }, + }, + }, + }) + + const [config] = await rsbuild.initConfigs() + + const encodePlugin = config?.plugins?.find(p => + p && p.constructor.name === 'LynxEncodePlugin' + ) + + expect(encodePlugin).toHaveProperty('options', { inlineScripts: true }) + }) + + test('output.inlineScripts defaults to `false`, when chunkSplit strategy is not `all-in-one`', async () => { + const { pluginReactLynx } = await import('../src/pluginReactLynx.js') + const rsbuild = await createRspeedy({ + rspeedyConfig: { + plugins: [ + pluginReactLynx(), + pluginStubRspeedyAPI(), + ], + environments: { + lynx: {}, + }, + performance: { + chunkSplit: { + strategy: 'split-by-size', + }, + }, + }, + }) + + const [config] = await rsbuild.initConfigs() + + const encodePlugin = config?.plugins?.find(p => + p && p.constructor.name === 'LynxEncodePlugin' + ) + + expect(encodePlugin).toHaveProperty('options', { inlineScripts: false }) + }) + + test('output.inlineScripts: function, when chunkSplit strategy is not `all-in-one`', async () => { + const { pluginReactLynx } = await import('../src/pluginReactLynx.js') + const rsbuild = await createRspeedy({ + rspeedyConfig: { + output: { + inlineScripts: ({ name, size }) => { + return name.includes('background') && size > 1000 + }, + }, + plugins: [ + pluginReactLynx(), + pluginStubRspeedyAPI(), + ], + environments: { + lynx: {}, + }, + performance: { + chunkSplit: { + strategy: 'split-by-size', + }, + }, + }, + }) + + const [config] = await rsbuild.initConfigs() + + const LynxEncodePlugin = config?.plugins?.find(( + p, + ): p is LynxEncodePlugin => p?.constructor.name === 'LynxEncodePlugin') + + expect(LynxEncodePlugin).toBeDefined() + + // @ts-expect-error private field + const { inlineScripts } = LynxEncodePlugin?.options ?? {} + + expect(typeof inlineScripts).toBe('function') + // eslint-disable-next-line @typescript-eslint/no-base-to-string + expect(inlineScripts?.toString()).toMatchInlineSnapshot(` + "({ name, size }) => { + return name.includes("background") && size > 1e3; + }" + `) + }) }) describe('Output Filename', () => { diff --git a/packages/rspeedy/upgrade-rspeedy/CHANGELOG.md b/packages/rspeedy/upgrade-rspeedy/CHANGELOG.md index d6925dedc6..28fe0408c7 100644 --- a/packages/rspeedy/upgrade-rspeedy/CHANGELOG.md +++ b/packages/rspeedy/upgrade-rspeedy/CHANGELOG.md @@ -1,5 +1,7 @@ # upgrade-rspeedy +## 0.10.7 + ## 0.10.6 ## 0.10.5 diff --git a/packages/rspeedy/upgrade-rspeedy/package.json b/packages/rspeedy/upgrade-rspeedy/package.json index 751d56e5f2..10f22accc5 100644 --- a/packages/rspeedy/upgrade-rspeedy/package.json +++ b/packages/rspeedy/upgrade-rspeedy/package.json @@ -1,6 +1,6 @@ { "name": "upgrade-rspeedy", - "version": "0.10.6", + "version": "0.10.7", "description": "Upgrade Rspeedy-related packages", "keywords": [ "webpack", diff --git a/packages/testing-library/testing-environment/CHANGELOG.md b/packages/testing-library/testing-environment/CHANGELOG.md index 1da423a776..5a109b9b07 100644 --- a/packages/testing-library/testing-environment/CHANGELOG.md +++ b/packages/testing-library/testing-environment/CHANGELOG.md @@ -1,5 +1,11 @@ # @lynx-js/testing-environment +## 0.1.6 + +### Patch Changes + +- Fix that `lynxTestingEnv.jsdom` cannot be initialized correctly when `global.jsdom` is not defined. ([#1422](https://github.com/lynx-family/lynx-stack/pull/1422)) + ## 0.1.5 ### Patch Changes diff --git a/packages/testing-library/testing-environment/package.json b/packages/testing-library/testing-environment/package.json index bb47f4b870..211e428111 100644 --- a/packages/testing-library/testing-environment/package.json +++ b/packages/testing-library/testing-environment/package.json @@ -1,6 +1,6 @@ { "name": "@lynx-js/testing-environment", - "version": "0.1.5", + "version": "0.1.6", "description": "A subset of a Lynx environment to be useful for testing", "keywords": [ "Lynx", diff --git a/packages/web-platform/inline-style-parser/src/char_code_definitions.rs b/packages/web-platform/inline-style-parser/src/char_code_definitions.rs index 9aeb1e0452..10ddbc8318 100644 --- a/packages/web-platform/inline-style-parser/src/char_code_definitions.rs +++ b/packages/web-platform/inline-style-parser/src/char_code_definitions.rs @@ -1,123 +1,100 @@ -pub const EOF_CATEGORY: u16 = 0x80; -pub const WHITE_SPACE_CATEGORY: u16 = 0x82; -pub const DIGIT_CATEGORY: u16 = 0x83; -pub const NAME_START_CATEGORY: u16 = 0x84; -pub const NON_PRINTABLE_CATEGORY: u16 = 0x85; - -const fn category_map_value_const(code: u16) -> u16 { - if code == 0 { - EOF_CATEGORY - } else if is_white_space(code) { - WHITE_SPACE_CATEGORY - } else if is_digit(code) { - DIGIT_CATEGORY - } else if is_name_start(code) { - NAME_START_CATEGORY - } else if is_non_printable(code) { - NON_PRINTABLE_CATEGORY - } else { - code - } -} - -const fn initialize_category_array() -> [u16; 0x80] { - let mut arr = [0u16; 0x80]; - let mut i = 0; - while i < 0x80 { - arr[i] = category_map_value_const(i as u16); - i += 1; - } - arr -} +pub const EOF_CATEGORY: u8 = 0x80; +pub const WHITE_SPACE_CATEGORY: u8 = 0x82; +pub const DIGIT_CATEGORY: u8 = 0x83; +pub const NAME_START_CATEGORY: u8 = 0x84; +pub const NON_PRINTABLE_CATEGORY: u8 = 0x85; -pub const CATEGORY: [u16; 0x80] = initialize_category_array(); // Character category constants // Public character check macros (mirroring C macros) // A code point between U+0030 DIGIT ZERO (0) and U+0039 DIGIT NINE (9). #[inline(always)] -pub const fn is_digit(code: u16) -> bool { - (code >= 0x0030_u16) && (code <= 0x0039_u16) +pub const fn is_digit(code: u8) -> bool { + (code >= 0x30_u8) && (code <= 0x39_u8) } // A digit, or a code point between U+0041 (A) and U+0046 (F), // or a code point between U+0061 (a) and U+0066 (f). #[inline(always)] -pub const fn is_hex_digit(code: u16) -> bool { +pub const fn is_hex_digit(code: u8) -> bool { is_digit(code) - || ((code >= 0x0041) && (code <= 0x0046)) // A-F - || ((code >= 0x0061) && (code <= 0x0066)) // a-f + || ((code >= 0x41) && (code <= 0x46)) // A-F + || ((code >= 0x61) && (code <= 0x66)) // a-f } // A code point between U+0041 (A) and U+005A (Z). #[inline(always)] -pub const fn is_uppercase_letter(code: u16) -> bool { - (code >= 0x0041) && (code <= 0x005A) +pub const fn is_uppercase_letter(code: u8) -> bool { + (code >= 0x41) && (code <= 0x5A) } // A code point between U+0061 (a) and U+007A (z). #[inline(always)] -pub const fn is_lowercase_letter(code: u16) -> bool { - (code >= 0x0061) && (code <= 0x007A) +pub const fn is_lowercase_letter(code: u8) -> bool { + (code >= 0x61) && (code <= 0x7A) } // An uppercase letter or a lowercase letter. #[inline(always)] -pub const fn is_letter(code: u16) -> bool { +pub const fn is_letter(code: u8) -> bool { is_uppercase_letter(code) || is_lowercase_letter(code) } // A code point with a value equal to or greater than U+0080 . #[inline(always)] -pub const fn is_non_ascii(code: u16) -> bool { - code >= 0x0080 +pub const fn is_non_ascii(code: u8) -> bool { + code >= 0x80 } // A letter, a non-ASCII code point, or U+005F LOW LINE (_). #[inline(always)] -pub const fn is_name_start(code: u16) -> bool { - is_letter(code) || is_non_ascii(code) || code == 0x005F +pub const fn is_name_start(code: u8) -> bool { + is_letter(code) || is_non_ascii(code) || code == 0x5F } // A name-start code point, a digit, or U+002D HYPHEN-MINUS (-). #[inline(always)] -pub const fn is_name(code: u16) -> bool { - is_name_start(code) || is_digit(code) || code == 0x002D +pub const fn is_name(code: u8) -> bool { + is_name_start(code) || is_digit(code) || code == 0x2D } // A code point between U+0000 NULL and U+0008 BACKSPACE, or U+000B LINE TABULATION, // or a code point between U+000E SHIFT OUT and U+001F INFORMATION SEPARATOR ONE, or U+007F DELETE. #[inline(always)] -pub const fn is_non_printable(code: u16) -> bool { - (code <= 0x0008) || (code == 0x000B) || ((code >= 0x000E) && (code <= 0x001F)) || (code == 0x007F) +pub const fn is_non_printable(code: u8) -> bool { + (code <= 0x08) || (code == 0x0B) || ((code >= 0x0E) && (code <= 0x1F)) || (code == 0x7F) } // U+000A LINE FEED. (Also U+000D CR and U+000C FF for preprocessing equivalence) #[inline(always)] -pub const fn is_newline(code: u16) -> bool { - (code == 0x000A_u16) || (code == 0x000D_u16) || (code == 0x000C_u16) +pub const fn is_newline(code: u8) -> bool { + (code == 0x0A_u8) || (code == 0x0D_u8) || (code == 0x0C_u8) } // A newline, U+0009 CHARACTER TABULATION, or U+0020 SPACE. #[inline(always)] -pub const fn is_white_space(code: u16) -> bool { - is_newline(code) || code == 0x0009_u16 || code == 0x0020_u16 +pub const fn is_white_space(code: u8) -> bool { + is_newline(code) || code == 0x09_u8 || code == 0x20_u8 } // Check if two code points are a valid escape. // If the first code point is not U+005C REVERSE SOLIDUS (\), return false. // Otherwise, if the second code point is a newline or EOF (0), return false. #[inline(always)] -pub const fn is_valid_escape(first: u16, second: u16) -> bool { - (first == 0x005C) && !is_newline(second) && (second != 0) +pub const fn is_valid_escape(first: u8, second: u8) -> bool { + (first == 0x5C) && !is_newline(second) && (second != 0) } // Check for Byte Order Mark #[inline(always)] -pub fn is_bom(code: u16) -> usize { - if code == 0xFEFF || code == 0xFFFE { - 1usize +pub fn get_start_offset(source: &[u8]) -> usize { + let bom = "\u{FEFF}".as_bytes(); + let bom_le = "\u{FFFE}".as_bytes(); + if bom.len() < source.len() + && (&source[0..bom.len()] == bom || &source[0..bom_le.len()] == bom_le) + { + 3usize // BOM found } else { 0usize } @@ -125,18 +102,18 @@ pub fn is_bom(code: u16) -> usize { // Check if three code points would start an identifier. #[inline(always)] -pub fn is_identifier_start(first: u16, second: u16, third: u16) -> bool { +pub fn is_identifier_start(first: u8, second: u8, third: u8) -> bool { /* Look at the first code point: U+002D HYPHEN-MINUS */ - if first == 0x002D { + if first == 0x2D { /* If the second code point is a name-start code point, return true. */ /* or the second and third code points are a valid escape, return true. Otherwise, return false. */ - is_name_start(second) || (second == 0x002D) || is_valid_escape(second, third) + is_name_start(second) || (second == 0x2D) || is_valid_escape(second, third) /* name-start code point */ } else if is_name_start(first) { true /*U+005C REVERSE SOLIDUS (\)*/ - } else if first == 0x005C { + } else if first == 0x5C { /* If the second code point is a name-start code point, return true. Otherwise, return false.*/ is_valid_escape(first, second) } else { @@ -146,15 +123,15 @@ pub fn is_identifier_start(first: u16, second: u16, third: u16) -> bool { // Check if three code points would start a number. #[inline(always)] -pub fn is_number_start(first: u16, second: u16, third: u16) -> bool { - if first == 0x002B || first == 0x002D { +pub fn is_number_start(first: u8, second: u8, third: u8) -> bool { + if first == 0x2B || first == 0x2D { // U+002B PLUS SIGN (+) or U+002D HYPHEN-MINUS (-) if is_digit(second) { true } else { - (second == 0x002E) && is_digit(third) // U+002E FULL STOP (.) + (second == 0x2E) && is_digit(third) // U+002E FULL STOP (.) } - } else if first == 0x002E { + } else if first == 0x2E { // U+002E FULL STOP (.) is_digit(second) } else { @@ -164,22 +141,28 @@ pub fn is_number_start(first: u16, second: u16, third: u16) -> bool { // Get the category of a character code. #[inline(always)] -pub fn char_code_category(char_code: u16) -> u16 { - if let Some(category) = crate::char_code_definitions::CATEGORY.get(char_code as usize) { - *category - } else { - // For char_code >= 0x80, it's considered NameStart_Category. - // This aligns with CSS syntax where non-ASCII characters are name-start characters. - crate::char_code_definitions::NAME_START_CATEGORY +pub fn char_code_category(char_code: u8) -> u8 { + match char_code { + 0 => EOF_CATEGORY, + c if c >= 0x80 => { + // For char_code >= 0x80, it's considered NameStart_Category. + // This aligns with CSS syntax where non-ASCII characters are name-start characters. + NAME_START_CATEGORY + } + c if is_white_space(c) => WHITE_SPACE_CATEGORY, + c if is_digit(c) => DIGIT_CATEGORY, + c if is_name_start(c) => NAME_START_CATEGORY, + c if is_non_printable(c) => NON_PRINTABLE_CATEGORY, + _ => char_code, } } #[inline(always)] pub fn cmp_char( - test_str: &[u16], + test_str: &[u8], test_str_length: usize, offset: usize, - reference_code: u16, + reference_code: u8, ) -> usize { if offset < test_str_length { let code = test_str[offset]; @@ -195,8 +178,8 @@ pub fn cmp_char( } #[inline(always)] -pub fn get_char_code(source: &[u16], source_length: usize, offset: usize) -> u16 { - if offset < source_length { +pub fn get_char_code(source: &[u8], offset: usize) -> u8 { + if offset < source.len() { source[offset] } else { 0 // EOF @@ -204,13 +187,8 @@ pub fn get_char_code(source: &[u16], source_length: usize, offset: usize) -> u16 } #[inline(always)] -pub fn get_new_line_length( - source: &[u16], - source_length: usize, - offset: usize, - code: u16, -) -> usize { - if code == 13 /* \r */ && get_char_code(source, source_length, offset + 1) == 10 +pub fn get_new_line_length(source: &[u8], offset: usize, code: u8) -> usize { + if code == 13 /* \r */ && get_char_code(source, offset + 1) == 10 /* \n */ { 2 diff --git a/packages/web-platform/inline-style-parser/src/lib.rs b/packages/web-platform/inline-style-parser/src/lib.rs index 754fdd5e41..853e05a99c 100644 --- a/packages/web-platform/inline-style-parser/src/lib.rs +++ b/packages/web-platform/inline-style-parser/src/lib.rs @@ -30,12 +30,12 @@ mod tests { } } - fn get_name(&self, source: &[u16], decl: &Declaration) -> String { - String::from_utf16_lossy(&source[decl.name_start..decl.name_end]) + fn get_name<'a>(&self, source: &'a str, decl: &Declaration) -> &'a str { + &source[decl.name_start..decl.name_end] } - fn get_value(&self, source: &[u16], decl: &Declaration) -> String { - String::from_utf16_lossy(&source[decl.value_start..decl.value_end]) + fn get_value<'a>(&self, source: &'a str, decl: &Declaration) -> &'a str { + &source[decl.value_start..decl.value_end] } } @@ -58,11 +58,11 @@ mod tests { } } - fn parse_css(css: &str) -> (TestTransformer, Vec) { - let source: Vec = css.encode_utf16().collect(); + fn parse_css(css: &str) -> (TestTransformer, &str) { + let source = css.as_bytes(); let mut transformer = TestTransformer::new(); - parse_inline_style(&source, &mut transformer); - (transformer, source) + parse_inline_style(source, &mut transformer); + (transformer, css) } #[test] @@ -71,8 +71,8 @@ mod tests { assert_eq!(transformer.declarations.len(), 1); let decl = &transformer.declarations[0]; - assert_eq!(transformer.get_name(&source, decl), "color"); - assert_eq!(transformer.get_value(&source, decl), "red"); + assert_eq!(transformer.get_name(source, decl), "color"); + assert_eq!(transformer.get_value(source, decl), "red"); assert!(!decl.is_important); } @@ -82,8 +82,8 @@ mod tests { assert_eq!(transformer.declarations.len(), 1); let decl = &transformer.declarations[0]; - assert_eq!(transformer.get_name(&source, decl), "color"); - assert_eq!(transformer.get_value(&source, decl), "red"); + assert_eq!(transformer.get_name(source, decl), "color"); + assert_eq!(transformer.get_value(source, decl), "red"); assert!(decl.is_important); } @@ -94,31 +94,31 @@ mod tests { assert_eq!(transformer.declarations.len(), 3); assert_eq!( - transformer.get_name(&source, &transformer.declarations[0]), + transformer.get_name(source, &transformer.declarations[0]), "color" ); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red" ); assert!(!transformer.declarations[0].is_important); assert_eq!( - transformer.get_name(&source, &transformer.declarations[1]), + transformer.get_name(source, &transformer.declarations[1]), "margin" ); assert_eq!( - transformer.get_value(&source, &transformer.declarations[1]), + transformer.get_value(source, &transformer.declarations[1]), "10px" ); assert!(!transformer.declarations[1].is_important); assert_eq!( - transformer.get_name(&source, &transformer.declarations[2]), + transformer.get_name(source, &transformer.declarations[2]), "padding" ); assert_eq!( - transformer.get_value(&source, &transformer.declarations[2]), + transformer.get_value(source, &transformer.declarations[2]), "5px" ); assert!(transformer.declarations[2].is_important); @@ -130,19 +130,19 @@ mod tests { assert_eq!(transformer.declarations.len(), 2); assert_eq!( - transformer.get_name(&source, &transformer.declarations[0]), + transformer.get_name(source, &transformer.declarations[0]), "color" ); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red" ); assert_eq!( - transformer.get_name(&source, &transformer.declarations[1]), + transformer.get_name(source, &transformer.declarations[1]), "margin" ); assert_eq!( - transformer.get_value(&source, &transformer.declarations[1]), + transformer.get_value(source, &transformer.declarations[1]), "10px" ); } @@ -153,11 +153,11 @@ mod tests { assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_name(&source, &transformer.declarations[0]), + transformer.get_name(source, &transformer.declarations[0]), "color" ); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red" ); } @@ -183,11 +183,11 @@ mod tests { assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_name(&source, &transformer.declarations[0]), + transformer.get_name(source, &transformer.declarations[0]), "background" ); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "url(image.png) no-repeat center" ); } @@ -210,19 +210,19 @@ mod tests { assert_eq!(transformer.declarations.len(), 2); assert_eq!( - transformer.get_name(&source, &transformer.declarations[0]), + transformer.get_name(source, &transformer.declarations[0]), "font-size" ); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "14px" ); assert_eq!( - transformer.get_name(&source, &transformer.declarations[1]), + transformer.get_name(source, &transformer.declarations[1]), "background-color" ); assert_eq!( - transformer.get_value(&source, &transformer.declarations[1]), + transformer.get_value(source, &transformer.declarations[1]), "blue" ); } @@ -247,7 +247,7 @@ mod tests { let (transformer, source) = parse_css("background: url(test.png);"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "url(test.png)" ); } @@ -258,7 +258,7 @@ mod tests { let (transformer, source) = parse_css("color: red !important;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red" ); assert!(transformer.declarations[0].is_important); @@ -267,7 +267,7 @@ mod tests { let (transformer, source) = parse_css("color: red ! important ;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red ! important" ); assert!(!transformer.declarations[0].is_important); // Extra space breaks the important detection @@ -276,7 +276,7 @@ mod tests { let (transformer, source) = parse_css("color: red!important;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red" ); assert!(transformer.declarations[0].is_important); // Actually recognized as important @@ -286,7 +286,7 @@ mod tests { assert_eq!(transformer.declarations.len(), 1); // The parser actually includes extra content but still marks as important assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red !important extra" ); assert!(transformer.declarations[0].is_important); @@ -303,7 +303,7 @@ mod tests { let (transformer, source) = parse_css("color: #fff;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "#fff" ); @@ -311,7 +311,7 @@ mod tests { let (transformer, source) = parse_css("color:\nred;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red" ); } @@ -322,7 +322,7 @@ mod tests { let (transformer, source) = parse_css("z-index: 10;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "10" ); @@ -330,7 +330,7 @@ mod tests { let (transformer, source) = parse_css("opacity: 0.5;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "0.5" ); @@ -338,7 +338,7 @@ mod tests { let (transformer, source) = parse_css("margin: -10px;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "-10px" ); @@ -346,7 +346,7 @@ mod tests { let (transformer, source) = parse_css("width: 100%;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "100%" ); } @@ -357,7 +357,7 @@ mod tests { let (transformer, source) = parse_css("content: \"hello world\";"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "\"hello world\"" ); @@ -365,7 +365,7 @@ mod tests { let (transformer, source) = parse_css("content: 'hello world';"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "'hello world'" ); @@ -380,7 +380,7 @@ mod tests { let (transformer, source) = parse_css("background: url(test.png);"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "url(test.png)" ); @@ -388,7 +388,7 @@ mod tests { let (transformer, source) = parse_css("background: url(\"test.png\");"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "url(\"test.png\")" ); @@ -396,7 +396,7 @@ mod tests { let (transformer, source) = parse_css("background: url( test.png );"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "url( test.png )" ); } @@ -407,7 +407,7 @@ mod tests { let (transformer, source) = parse_css("width: calc(100% - 20px);"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "calc(100% - 20px)" ); @@ -415,7 +415,7 @@ mod tests { let (transformer, source) = parse_css("color: rgb(255, 0, 0);"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "rgb(255, 0, 0)" ); @@ -423,7 +423,7 @@ mod tests { let (transformer, source) = parse_css("transform: translateX(calc(100% + 10px));"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "translateX(calc(100% + 10px))" ); } @@ -434,7 +434,7 @@ mod tests { let (transformer, source) = parse_css("color: red /* comment */;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red /* comment */" ); @@ -442,11 +442,11 @@ mod tests { let (transformer, source) = parse_css("color: red; /* comment */ margin: 10px;"); assert_eq!(transformer.declarations.len(), 2); assert_eq!( - transformer.get_name(&source, &transformer.declarations[0]), + transformer.get_name(source, &transformer.declarations[0]), "color" ); assert_eq!( - transformer.get_name(&source, &transformer.declarations[1]), + transformer.get_name(source, &transformer.declarations[1]), "margin" ); } @@ -466,7 +466,7 @@ mod tests { let (transformer, source) = parse_css(css); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red" ); @@ -474,7 +474,7 @@ mod tests { let (transformer, source) = parse_css("color: \t\t red \t\t;"); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(source, &transformer.declarations[0]), "red" ); } @@ -483,17 +483,17 @@ mod tests { fn test_bom_handling() { // Test with Byte Order Mark let css_with_bom = "\u{FEFF}color: red;"; - let source: Vec = css_with_bom.encode_utf16().collect(); + let source = css_with_bom.as_bytes(); let mut transformer = TestTransformer::new(); - parse_inline_style(&source, &mut transformer); + parse_inline_style(source, &mut transformer); assert_eq!(transformer.declarations.len(), 1); assert_eq!( - transformer.get_name(&source, &transformer.declarations[0]), + transformer.get_name(css_with_bom, &transformer.declarations[0]), "color" ); assert_eq!( - transformer.get_value(&source, &transformer.declarations[0]), + transformer.get_value(css_with_bom, &transformer.declarations[0]), "red" ); } @@ -505,44 +505,44 @@ mod tests { use crate::char_code_definitions::*; // Test digit classification - assert!(is_digit('0' as u16)); - assert!(is_digit('9' as u16)); - assert!(!is_digit('a' as u16)); + assert!(is_digit(b'0')); + assert!(is_digit(b'9')); + assert!(!is_digit(b'a')); // Test hex digit classification - assert!(is_hex_digit('0' as u16)); - assert!(is_hex_digit('A' as u16)); - assert!(is_hex_digit('f' as u16)); - assert!(!is_hex_digit('g' as u16)); + assert!(is_hex_digit(b'0')); + assert!(is_hex_digit(b'A')); + assert!(is_hex_digit(b'f')); + assert!(!is_hex_digit(b'g')); // Test letter classification - assert!(is_uppercase_letter('A' as u16)); - assert!(is_uppercase_letter('Z' as u16)); - assert!(!is_uppercase_letter('a' as u16)); + assert!(is_uppercase_letter(b'A')); + assert!(is_uppercase_letter(b'Z')); + assert!(!is_uppercase_letter(b'a')); - assert!(is_lowercase_letter('a' as u16)); - assert!(is_lowercase_letter('z' as u16)); - assert!(!is_lowercase_letter('A' as u16)); + assert!(is_lowercase_letter(b'a')); + assert!(is_lowercase_letter(b'z')); + assert!(!is_lowercase_letter(b'A')); - assert!(is_letter('A' as u16)); - assert!(is_letter('z' as u16)); - assert!(!is_letter('1' as u16)); + assert!(is_letter(b'A')); + assert!(is_letter(b'z')); + assert!(!is_letter(b'1')); // Test non-ASCII assert!(is_non_ascii(0x0080)); assert!(!is_non_ascii(0x007F)); // Test name-start - assert!(is_name_start('a' as u16)); - assert!(is_name_start('_' as u16)); + assert!(is_name_start(b'a')); + assert!(is_name_start(b'_')); assert!(is_name_start(0x0080)); - assert!(!is_name_start('1' as u16)); + assert!(!is_name_start(b'1')); // Test name - assert!(is_name('a' as u16)); - assert!(is_name('1' as u16)); - assert!(is_name('-' as u16)); - assert!(!is_name(' ' as u16)); + assert!(is_name(b'a')); + assert!(is_name(b'1')); + assert!(is_name(b'-')); + assert!(!is_name(b' ')); // Test non-printable assert!(is_non_printable(0x0008)); @@ -567,11 +567,6 @@ mod tests { assert!(!is_valid_escape(0x005C, 0x000A)); // \newline assert!(!is_valid_escape(0x0041, 0x0041)); // AA - // Test BOM - assert_eq!(is_bom(0xFEFF), 1); - assert_eq!(is_bom(0xFFFE), 1); - assert_eq!(is_bom(0x0041), 0); - // Test identifier start assert!(is_identifier_start(0x0041, 0x0042, 0x0043)); // ABC assert!(is_identifier_start(0x002D, 0x0041, 0x0042)); // -AB @@ -610,102 +605,102 @@ mod tests { use crate::utils::*; // Test cmp_str function - let test_str: Vec = "hello".encode_utf16().collect(); - let reference: Vec = "hello".encode_utf16().collect(); - assert!(cmp_str(&test_str, 0, 5, &reference)); + let test_str: &[u8] = b"hello"; + let reference: &[u8] = b"hello"; + assert!(cmp_str(test_str, 0, 5, reference)); - let reference2: Vec = "world".encode_utf16().collect(); - assert!(!cmp_str(&test_str, 0, 5, &reference2)); + let reference2: &[u8] = b"world"; + assert!(!cmp_str(test_str, 0, 5, reference2)); // Test case insensitive comparison - let test_str_upper: Vec = "HELLO".encode_utf16().collect(); - let reference_lower: Vec = "hello".encode_utf16().collect(); - assert!(cmp_str(&test_str_upper, 0, 5, &reference_lower)); + let test_str_upper = b"HELLO"; + let reference_lower = b"hello"; + assert!(cmp_str(test_str_upper, 0, 5, reference_lower)); // Test partial string comparison - let test_str_long: Vec = "hello world".encode_utf16().collect(); - assert!(cmp_str(&test_str_long, 0, 5, &reference)); - let world_ref: Vec = "world".encode_utf16().collect(); - assert!(cmp_str(&test_str_long, 6, 11, &world_ref)); + let test_str_long = b"hello world"; + assert!(cmp_str(test_str_long, 0, 5, reference)); + let world_ref = b"world"; + assert!(cmp_str(test_str_long, 6, 11, world_ref)); // Test out of bounds - assert!(!cmp_str(&test_str, 0, 10, &reference)); // end > length - assert!(!cmp_str(&test_str, 0, 3, &reference)); // different lengths + assert!(!cmp_str(test_str, 0, 10, reference)); // end > length + assert!(!cmp_str(test_str, 0, 3, reference)); // different lengths // Test find_white_space_end - let whitespace_str: Vec = " hello".encode_utf16().collect(); - assert_eq!(find_white_space_end(&whitespace_str, 0), 3); + let whitespace_str = b" hello"; + assert_eq!(find_white_space_end(whitespace_str, 0), 3); - let no_whitespace: Vec = "hello".encode_utf16().collect(); - assert_eq!(find_white_space_end(&no_whitespace, 0), 0); + let no_whitespace = b"hello"; + assert_eq!(find_white_space_end(no_whitespace, 0), 0); - let all_whitespace: Vec = " ".encode_utf16().collect(); - assert_eq!(find_white_space_end(&all_whitespace, 0), 3); + let all_whitespace = b" "; + assert_eq!(find_white_space_end(all_whitespace, 0), 3); // Test find_decimal_number_end - let number_str: Vec = "123abc".encode_utf16().collect(); - assert_eq!(find_decimal_number_end(&number_str, 0), 3); + let number_str = b"123abc"; + assert_eq!(find_decimal_number_end(number_str, 0), 3); - let no_number: Vec = "abc123".encode_utf16().collect(); - assert_eq!(find_decimal_number_end(&no_number, 0), 0); + let no_number = b"abc123"; + assert_eq!(find_decimal_number_end(no_number, 0), 0); - let all_numbers: Vec = "123456".encode_utf16().collect(); - assert_eq!(find_decimal_number_end(&all_numbers, 0), 6); + let all_numbers = b"123456"; + assert_eq!(find_decimal_number_end(all_numbers, 0), 6); // Test consume_number - let simple_number: Vec = "123".encode_utf16().collect(); - assert_eq!(consume_number(&simple_number, 0), 3); + let simple_number = b"123"; + assert_eq!(consume_number(simple_number, 0), 3); - let signed_number: Vec = "+123".encode_utf16().collect(); - assert_eq!(consume_number(&signed_number, 0), 4); + let signed_number = b"+123"; + assert_eq!(consume_number(signed_number, 0), 4); - let negative_number: Vec = "-123".encode_utf16().collect(); - assert_eq!(consume_number(&negative_number, 0), 4); + let negative_number = b"-123"; + assert_eq!(consume_number(negative_number, 0), 4); - let decimal_number: Vec = "123.456".encode_utf16().collect(); - assert_eq!(consume_number(&decimal_number, 0), 7); + let decimal_number: &[u8] = "123.456".as_bytes(); + assert_eq!(consume_number(decimal_number, 0), 7); - let scientific_number: Vec = "123e456".encode_utf16().collect(); - assert_eq!(consume_number(&scientific_number, 0), 7); + let scientific_number: &[u8] = "123e456".as_bytes(); + assert_eq!(consume_number(scientific_number, 0), 7); - let scientific_signed: Vec = "123e+456".encode_utf16().collect(); - assert_eq!(consume_number(&scientific_signed, 0), 8); + let scientific_signed: &[u8] = "123e+456".as_bytes(); + assert_eq!(consume_number(scientific_signed, 0), 8); - let scientific_negative: Vec = "123e-456".encode_utf16().collect(); - assert_eq!(consume_number(&scientific_negative, 0), 8); + let scientific_negative: &[u8] = "123e-456".as_bytes(); + assert_eq!(consume_number(scientific_negative, 0), 8); // Test consume_name - let simple_name: Vec = "hello".encode_utf16().collect(); - assert_eq!(consume_name(&simple_name, 0), 5); + let simple_name: &[u8] = "hello".as_bytes(); + assert_eq!(consume_name(simple_name, 0), 5); - let hyphenated_name: Vec = "hello-world".encode_utf16().collect(); - assert_eq!(consume_name(&hyphenated_name, 0), 11); + let hyphenated_name: &[u8] = "hello-world".as_bytes(); + assert_eq!(consume_name(hyphenated_name, 0), 11); - let name_with_digits: Vec = "hello123".encode_utf16().collect(); - assert_eq!(consume_name(&name_with_digits, 0), 8); + let name_with_digits: &[u8] = "hello123".as_bytes(); + assert_eq!(consume_name(name_with_digits, 0), 8); - let name_with_underscore: Vec = "_hello".encode_utf16().collect(); - assert_eq!(consume_name(&name_with_underscore, 0), 6); + let name_with_underscore: &[u8] = "_hello".as_bytes(); + assert_eq!(consume_name(name_with_underscore, 0), 6); // Test consume_escaped - let escaped_char: Vec = "\\41 ".encode_utf16().collect(); // \41 = 'A' - assert_eq!(consume_escaped(&escaped_char, 0), 4); // includes whitespace consumption + let escaped_char: &[u8] = "\\41 ".as_bytes(); // \41 = 'A' + assert_eq!(consume_escaped(escaped_char, 0), 4); // includes whitespace consumption - let escaped_simple: Vec = "\\A".encode_utf16().collect(); - assert_eq!(consume_escaped(&escaped_simple, 0), 2); + let escaped_simple: &[u8] = "\\A".as_bytes(); + assert_eq!(consume_escaped(escaped_simple, 0), 2); - let escaped_hex: Vec = "\\41424344".encode_utf16().collect(); - assert_eq!(consume_escaped(&escaped_hex, 0), 7); // max 6 hex digits after \ + let escaped_hex: &[u8] = "\\41424344".as_bytes(); + assert_eq!(consume_escaped(escaped_hex, 0), 7); // max 6 hex digits after \ // Test consume_bad_url_remnants - let bad_url: Vec = "test)".encode_utf16().collect(); - assert_eq!(consume_bad_url_remnants(&bad_url, 0), 5); + let bad_url: &[u8] = "test)".as_bytes(); + assert_eq!(consume_bad_url_remnants(bad_url, 0), 5); - let bad_url_no_close: Vec = "test".encode_utf16().collect(); - assert_eq!(consume_bad_url_remnants(&bad_url_no_close, 0), 4); + let bad_url_no_close: &[u8] = "test".as_bytes(); + assert_eq!(consume_bad_url_remnants(bad_url_no_close, 0), 4); - let bad_url_with_escape: Vec = "te\\)st)".encode_utf16().collect(); - assert_eq!(consume_bad_url_remnants(&bad_url_with_escape, 0), 7); + let bad_url_with_escape: &[u8] = "te\\)st)".as_bytes(); + assert_eq!(consume_bad_url_remnants(bad_url_with_escape, 0), 7); } // Additional tests to reach 100% coverage @@ -715,7 +710,7 @@ mod tests { use crate::tokenize::{self, Parser}; struct TokenCollector { - tokens: Vec<(u16, usize, usize)>, + tokens: Vec<(u8, usize, usize)>, } impl TokenCollector { @@ -725,81 +720,81 @@ mod tests { } impl Parser for TokenCollector { - fn on_token(&mut self, token_type: u16, start: usize, end: usize) { + fn on_token(&mut self, token_type: u8, start: usize, end: usize) { self.tokens.push((token_type, start, end)); } } // Test hash token with name following - let source: Vec = "#id".encode_utf16().collect(); + let source: &[u8] = "#id".as_bytes(); let mut collector = TokenCollector::new(); - tokenize::tokenize(&source, &mut collector); + tokenize::tokenize(source, &mut collector); assert!(!collector.tokens.is_empty()); // Test hash token without name following - let source: Vec = "#123".encode_utf16().collect(); + let source: &[u8] = "#123".as_bytes(); let mut collector = TokenCollector::new(); - tokenize::tokenize(&source, &mut collector); + tokenize::tokenize(source, &mut collector); assert!(!collector.tokens.is_empty()); // Test at-keyword token - let source: Vec = "@media".encode_utf16().collect(); + let source: &[u8] = "@media".as_bytes(); let mut collector = TokenCollector::new(); - tokenize::tokenize(&source, &mut collector); + tokenize::tokenize(source, &mut collector); assert!(!collector.tokens.is_empty()); // Test at-keyword without identifier - let source: Vec = "@123".encode_utf16().collect(); + let source: &[u8] = "@123".as_bytes(); let mut collector = TokenCollector::new(); - tokenize::tokenize(&source, &mut collector); + tokenize::tokenize(source, &mut collector); assert!(!collector.tokens.is_empty()); // Test escaped identifier - let source: Vec = "\\61 bc".encode_utf16().collect(); // \61 = 'a', so "abc" + let source: &[u8] = "\\61 bc".as_bytes(); // \61 = 'a', so "abc" let mut collector = TokenCollector::new(); - tokenize::tokenize(&source, &mut collector); + tokenize::tokenize(source, &mut collector); assert!(!collector.tokens.is_empty()); // Test invalid escape - let source: Vec = "\\".encode_utf16().collect(); + let source: &[u8] = "\\".as_bytes(); let mut collector = TokenCollector::new(); - tokenize::tokenize(&source, &mut collector); + tokenize::tokenize(source, &mut collector); assert!(!collector.tokens.is_empty()); // Test delim tokens - let source: Vec = "!@#$%^&*".encode_utf16().collect(); + let source: &[u8] = "!@#$%^&*".as_bytes(); let mut collector = TokenCollector::new(); - tokenize::tokenize(&source, &mut collector); + tokenize::tokenize(source, &mut collector); assert!(!collector.tokens.is_empty()); // Test CDC token - let source: Vec = "-->".encode_utf16().collect(); + let source: &[u8] = "-->".as_bytes(); let mut collector = TokenCollector::new(); - tokenize::tokenize(&source, &mut collector); + tokenize::tokenize(source, &mut collector); assert!(!collector.tokens.is_empty()); // Test CDO token - let source: Vec = " --lynx-linear-weight-sum: ; */ - if name[name_start..name_end] == *LINEAR_WEIGHT_SUM_STR_U16 { - result_children.push(( - LINEAR_WEIGHT_SUM_CSS_VAR_NAME, - 0, - LINEAR_WEIGHT_SUM_CSS_VAR_NAME.len(), - value, - value_start, - value_end, - )); + if name == "linear-weight-sum" { + result_children.push(("--lynx-linear-weight-sum", value)); } /* * There is a special rule for linear-weight * linear-weight: 0; --> do nothing * linear-weight: --> --lynx-linear-weight: 0; */ - if name[name_start..name_end] == *LINEAR_WEIGHT_STR_U16 - && value[value_start..value_end] != *str_to_u16_slice!("0") - { - result.push(( - LINEAR_WEIGHT_BASIS_CSS_VAR_NAME, - 0, - LINEAR_WEIGHT_BASIS_CSS_VAR_NAME.len(), - str_to_u16_slice!("0"), - 0, - 1, - )); + if name == "linear-weight" && value != "0" { + result.push(("--lynx-linear-weight-basis", "0")); } (result, result_children) } @@ -316,83 +198,65 @@ impl Transformer for TransformerData<'_> { value_end: usize, is_important: bool, ) { - let (result, result_children) = query_transform_rules( - self.source, - name_start, - name_end, - self.source, - value_start, - value_end, - ); + let name = &self.source[name_start..name_end]; + let value = &self.source[value_start..value_end]; + let (result, result_children) = query_transform_rules(name, value); if !result.is_empty() { // Append content before the declaration name self .transformed_source - .extend_from_slice(&self.source[self.offset..name_start]); - - let result_len = result.len(); - for ( - idx, - (decl_name, decl_name_start, decl_name_end, decl_value, decl_value_start, decl_value_end), - ) in result.iter().enumerate() - { + .push_str(&self.source[self.offset..name_start]); + + for (idx, (name_transformed, value_transformed)) in result.iter().enumerate() { // Append the declaration name and colon - self - .transformed_source - .extend_from_slice(&decl_name[*decl_name_start..*decl_name_end]); - self.transformed_source.push(b':' as u16); - // Append the declaration value - self - .transformed_source - .extend_from_slice(&decl_value[*decl_value_start..*decl_value_end]); - // Append separator - append_separator!(self.transformed_source, idx, result_len, is_important); + self.transformed_source.push_str(&format!( + "{}:{}{}", + name_transformed, + value_transformed, + // do not append !important at the end of the last declaration + if idx < result.len() - 1 { + if is_important { + " !important;" + } else { + ";" + } + } else { + "" + } + )); } self.offset = value_end; } if !result_children.is_empty() { - let result_len = result_children.len(); - for ( - idx, - (decl_name, decl_name_start, decl_name_end, decl_value, decl_value_start, decl_value_end), - ) in result_children.iter().enumerate() - { + for (name_transformed, value_transformed) in result_children { // Append the declaration name and colon - self - .extra_children_styles - .extend_from_slice(&decl_name[*decl_name_start..*decl_name_end]); - self.extra_children_styles.push(b':' as u16); - // Append the declaration value - self - .extra_children_styles - .extend_from_slice(&decl_value[*decl_value_start..*decl_value_end]); - // Append separator - append_separator!( - self.extra_children_styles, - idx, - result_len + 1, // always add !important; at the end for children styles - is_important - ); + self.extra_children_styles.push_str(&format!( + "{}:{}{};", + name_transformed, + value_transformed, + if is_important { " !important" } else { "" } + )); } } } } -pub fn transform_inline_style_string<'a>(source: &'a [u16]) -> (Vec, Vec) { +pub fn transform_inline_style_string<'a>(source: &'a str) -> (String, String) { let mut transformer: TransformerData<'a> = TransformerData { source, - transformed_source: Vec::new(), + transformed_source: String::new(), offset: 0, - extra_children_styles: Vec::new(), + extra_children_styles: String::new(), }; - parse_inline_style::parse_inline_style(source, &mut transformer); + let bytes = source.as_bytes(); + parse_inline_style::parse_inline_style(bytes, &mut transformer); if transformer.offset != 0 { // append the remaining part of the source transformer .transformed_source - .extend_from_slice(&source[transformer.offset..]); + .push_str(&source[transformer.offset..]); } ( transformer.transformed_source, @@ -406,285 +270,243 @@ mod tests { #[test] fn transform_basic() { - let source = str_to_u16_slice!("height:1px;display:linear;flex-direction:row;width:100px;"); + let source = "height:1px;display:linear;flex-direction:row;width:100px;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, "height:1px;--lynx-display-toggle:var(--lynx-display-linear);--lynx-display:linear;display:flex;--flex-direction:row;width:100px;" ); } #[test] fn transform_with_blank() { - let source = str_to_u16_slice!("flex-direction:row;"); + let source = "flex-direction:row;"; let result = transform_inline_style_string(source).0; - assert_eq!(String::from_utf16_lossy(&result), "--flex-direction:row;"); + assert_eq!(result, "--flex-direction:row;"); } #[test] fn test_replace_rule_display_linear_blank_after_colon() { - let source = str_to_u16_slice!("display: linear;"); + let source = "display: linear;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, "--lynx-display-toggle:var(--lynx-display-linear);--lynx-display:linear;display:flex;" ); } #[test] fn test_replace_rule_linear_orientation() { - let source = str_to_u16_slice!("linear-direction:row;"); + let source = "linear-direction:row;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, "--lynx-linear-orientation:horizontal;--lynx-linear-orientation-toggle:var(--lynx-linear-orientation-horizontal);" ); } #[test] fn test_replace_rule_display_linear_important() { - let source = str_to_u16_slice!("display: linear !important;"); + let source = "display: linear !important;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, "--lynx-display-toggle:var(--lynx-display-linear) !important;--lynx-display:linear !important;display:flex !important;" ); } #[test] fn transform_color_normal() { - let source = str_to_u16_slice!("color:blue;"); + let source = "color:blue;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, "--lynx-text-bg-color:initial;-webkit-background-clip:initial;background-clip:initial;color:blue;" ); } #[test] fn transform_color_normal_with_blank() { - let source = str_to_u16_slice!(" color : blue ;"); + let source = " color : blue ;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, " --lynx-text-bg-color:initial;-webkit-background-clip:initial;background-clip:initial;color:blue ;" ); } #[test] fn transform_color_normal_important() { - let source = str_to_u16_slice!(" color : blue !important ;"); + let source = " color : blue !important ;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, " --lynx-text-bg-color:initial !important;-webkit-background-clip:initial !important;background-clip:initial !important;color:blue !important ;" ); } #[test] fn transform_color_linear_gradient() { - let source = str_to_u16_slice!(" color : linear-gradient(pink, blue) ;"); + let source = " color : linear-gradient(pink, blue) ;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, " color:transparent;-webkit-background-clip:text;background-clip:text;--lynx-text-bg-color:linear-gradient(pink, blue) ;" ); } #[test] fn transform_color_linear_gradient_important() { - let source = str_to_u16_slice!(" color : linear-gradient(pink, blue) !important ;"); + let source = " color : linear-gradient(pink, blue) !important ;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, " color:transparent !important;-webkit-background-clip:text !important;background-clip:text !important;--lynx-text-bg-color:linear-gradient(pink, blue) !important ;" ); } #[test] fn transform_color_with_font_size() { - let source = str_to_u16_slice!("font-size: 24px; color: blue"); + let source = "font-size: 24px; color: blue"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, "font-size: 24px; --lynx-text-bg-color:initial;-webkit-background-clip:initial;background-clip:initial;color:blue" ); } #[test] fn flex_none() { - let source = str_to_u16_slice!("flex:none;"); + let source = "flex:none;"; let result = transform_inline_style_string(source).0; - assert_eq!( - String::from_utf16_lossy(&result), - "--flex-shrink:0;--flex-grow:0;--flex-basis:auto;" - ); + assert_eq!(result, "--flex-shrink:0;--flex-grow:0;--flex-basis:auto;"); } #[test] fn flex_auto() { - let source = str_to_u16_slice!("flex:auto;"); + let source = "flex:auto;"; let result = transform_inline_style_string(source).0; - assert_eq!( - String::from_utf16_lossy(&result), - "--flex-shrink:1;--flex-grow:1;--flex-basis:auto;" - ); + assert_eq!(result, "--flex-shrink:1;--flex-grow:1;--flex-basis:auto;"); } #[test] fn flex_1() { - let source = str_to_u16_slice!("flex:1;"); + let source = "flex:1;"; let result = transform_inline_style_string(source).0; - assert_eq!( - String::from_utf16_lossy(&result), - "--flex-shrink:1;--flex-basis:0%;--flex-grow:1;" - ); + assert_eq!(result, "--flex-grow:1;--flex-shrink:1;--flex-basis:0%;"); } #[test] fn flex_1_percent() { - let source = str_to_u16_slice!("flex:1%;"); + let source = "flex:1%;"; let result = transform_inline_style_string(source).0; - assert_eq!( - String::from_utf16_lossy(&result), - "--flex-shrink:1;--flex-grow:1;--flex-basis:1%;" - ); + assert_eq!(result, "--flex-grow:1;--flex-shrink:1;--flex-basis:1%;"); } #[test] fn flex_2_3() { - let source = str_to_u16_slice!("flex:2 3;"); + let source = "flex:2 3;"; let result = transform_inline_style_string(source).0; - assert_eq!( - String::from_utf16_lossy(&result), - "--flex-grow:2;--flex-basis:0%;--flex-shrink:3;" - ); + assert_eq!(result, "--flex-grow:2;--flex-shrink:3;--flex-basis:0%;"); } #[test] fn flex_2_3_percentage() { - let source = str_to_u16_slice!("flex:2 3%;"); + let source = "flex:2 3%;"; let result = transform_inline_style_string(source).0; - assert_eq!( - String::from_utf16_lossy(&result), - "--flex-grow:2;--flex-shrink:1;--flex-basis:3%;" - ); + assert_eq!(result, "--flex-grow:2;--flex-shrink:1;--flex-basis:3%;"); } #[test] fn flex_2_3_px() { - let source = str_to_u16_slice!("flex:2 3px;"); + let source = "flex:2 3px;"; let result = transform_inline_style_string(source).0; - assert_eq!( - String::from_utf16_lossy(&result), - "--flex-grow:2;--flex-shrink:1;--flex-basis:3px;" - ); + assert_eq!(result, "--flex-grow:2;--flex-shrink:1;--flex-basis:3px;"); } #[test] fn flex_3_4_5_percentage() { - let source = str_to_u16_slice!("flex:3 4 5%;"); + let source = "flex:3 4 5%;"; let result = transform_inline_style_string(source).0; - assert_eq!( - String::from_utf16_lossy(&result), - "--flex-grow:3;--flex-shrink:4;--flex-basis:5%;" - ); + assert_eq!(result, "--flex-grow:3;--flex-shrink:4;--flex-basis:5%;"); } #[test] fn flex_1_extra() { - let source = str_to_u16_slice!("width:100px; flex:none; width:100px;"); + let source = "width:100px; flex:none; width:100px;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, "width:100px; --flex-shrink:0;--flex-grow:0;--flex-basis:auto; width:100px;" ); } #[test] fn linear_weight_sum_0_children_style() { - let source = str_to_u16_slice!("linear-weight-sum: 0;"); + let source = "linear-weight-sum: 0;"; let result = transform_inline_style_string(source).1; - assert_eq!( - String::from_utf16_lossy(&result), - "--lynx-linear-weight-sum:0;" - ); + assert_eq!(result, "--lynx-linear-weight-sum:0;"); } #[test] fn linear_weight_sum_1_children_style() { - let source = str_to_u16_slice!("linear-weight-sum: 1;"); + let source = "linear-weight-sum: 1;"; let result = transform_inline_style_string(source).1; - assert_eq!( - String::from_utf16_lossy(&result), - "--lynx-linear-weight-sum:1;" - ); + assert_eq!(result, "--lynx-linear-weight-sum:1;"); } #[test] fn linear_weight_sum_1_important_children_style() { - let source = str_to_u16_slice!("linear-weight-sum: 1 !important;"); + let source = "linear-weight-sum: 1 !important;"; let result = transform_inline_style_string(source).1; - assert_eq!( - String::from_utf16_lossy(&result), - "--lynx-linear-weight-sum:1 !important;" - ); + assert_eq!(result, "--lynx-linear-weight-sum:1 !important;"); } #[test] fn complex_1() { - let source = str_to_u16_slice!("linear-direction:row;linear-weight: 0;"); + let source = "linear-direction:row;linear-weight: 0;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, "--lynx-linear-orientation:horizontal;--lynx-linear-orientation-toggle:var(--lynx-linear-orientation-horizontal);--lynx-linear-weight:0;" ); } #[test] fn linear_weight_0() { - let source = str_to_u16_slice!("linear-weight: 0;"); + let source = "linear-weight: 0;"; let result = transform_inline_style_string(source).0; - assert_eq!(String::from_utf16_lossy(&result), "--lynx-linear-weight:0;"); + assert_eq!(result, "--lynx-linear-weight:0;"); } #[test] fn linear_weight_1() { - let source = str_to_u16_slice!("linear-weight: 1;"); + let source = "linear-weight: 1;"; let result = transform_inline_style_string(source).0; assert_eq!( - String::from_utf16_lossy(&result), + result, "--lynx-linear-weight:1;--lynx-linear-weight-basis:0;" ); } #[test] fn test_query_transform_rules_linear_direction() { - let name = str_to_u16_slice!("linear-direction"); - let value = str_to_u16_slice!("row"); - let (result, _) = query_transform_rules(name, 0, name.len(), value, 0, value.len()); - assert_eq!( - String::from_utf16_lossy(result[0].0), - "--lynx-linear-orientation" - ); - assert_eq!(String::from_utf16_lossy(result[0].3), "horizontal"); + let name = "linear-direction"; + let value = "row"; + let (result, _) = query_transform_rules(name, value); + assert_eq!(result[0].0, "--lynx-linear-orientation"); + assert_eq!(result[0].1, "horizontal"); } #[test] fn linear_layout_gravity() { - let source = str_to_u16_slice!("linear-layout-gravity: right;"); + let source = "linear-layout-gravity: right;"; let result = transform_inline_style_string(source).0; - assert_eq!( - String::from_utf16_lossy(&result), - "--align-self-row:auto;--align-self-column:end;" - ); + assert_eq!(result, "--align-self-row:auto;--align-self-column:end;"); } #[test] fn linear_layout_gravity_start() { - let source = str_to_u16_slice!("linear-layout-gravity: start;"); + let source = "linear-layout-gravity: start;"; let result = transform_inline_style_string(source).0; - assert_eq!( - String::from_utf16_lossy(&result), - "--align-self-row:start;--align-self-column:start;" - ); + assert_eq!(result, "--align-self-row:start;--align-self-column:start;"); } } diff --git a/packages/web-platform/web-style-transformer/standard.d.ts b/packages/web-platform/web-style-transformer/standard.d.ts index bd20e27ef1..efc4908f05 100644 --- a/packages/web-platform/web-style-transformer/standard.d.ts +++ b/packages/web-platform/web-style-transformer/standard.d.ts @@ -1,39 +1,9 @@ /* tslint:disable */ /* eslint-disable */ -export const memory: WebAssembly.Memory; -/** - * lifted from the `console_log` example - * Accepts a raw uint16 pointer from JS and transforms the inline style string into a JS string. - * Returns `Some(JsString)` if the transformation was successful, or `None` if the input was empty or invalid. - * - * # Safety - * The caller must ensure that `ptr` is valid and points to a slice of `u16` of length `len`. - * This is a contract with the JavaScript side. Passing an invalid pointer or incorrect length may cause undefined behavior. - */ export function transform_raw_u16_inline_style_ptr( - ptr: number, - len: number, + str: string, ): string | undefined; -/** - * Accepts raw uint16 pointers from JS and parses the inline style name and value into a JS array. - * Returns `Some(Array)` if parsing was successful, or `None` if both results are empty. - * - * # Safety - * The caller must ensure that `name_ptr` and `value_ptr` are valid and point to slices of `u16` of lengths `name_len` and `value_len` respectively. - * Passing invalid pointers or incorrect lengths may cause undefined behavior. - */ export function transform_raw_u16_inline_style_ptr_parsed( - name_ptr: number, - name_len: number, - value_ptr: number, - value_len: number, -): Array | undefined; -export function malloc(size: number): number; -/** - * Frees the allocated memory at the given pointer with the specified size. - * - * # Safety - * The caller must ensure that `ptr` was allocated with the same size and alignment using `malloc`, - * and that it is not used after being freed. Passing an invalid pointer or incorrect size may cause undefined behavior. - */ -export function free(ptr: number, size: number): void; + name: string, + value: string, +): [[string, string][], [string, string][]] | undefined; diff --git a/packages/web-platform/web-style-transformer/standard.js b/packages/web-platform/web-style-transformer/standard.js index 0975f4c758..10b19e0cc3 100644 --- a/packages/web-platform/web-style-transformer/standard.js +++ b/packages/web-platform/web-style-transformer/standard.js @@ -1,2 +1 @@ export * from './dist/standard.js'; -export { memory } from './dist/standard_bg.wasm'; diff --git a/packages/web-platform/web-tests/tests/react.spec.ts b/packages/web-platform/web-tests/tests/react.spec.ts index aa0f535fb4..2454abcca4 100644 --- a/packages/web-platform/web-tests/tests/react.spec.ts +++ b/packages/web-platform/web-tests/tests/react.spec.ts @@ -348,6 +348,20 @@ test.describe('reactlynx3 tests', () => { await wait(100); expect(eventHandlerTriggered).toBe(true); }); + test('basic-mts-systeminfo', async ({ page }, { title }) => { + let eventHandlerTriggered = false; + page.on('console', (message) => { + if (message.text() === 'hello world') { + eventHandlerTriggered = true; + } + }); + await goto(page, title); + await wait(100); + const target = page.locator('#target'); + await target.click(); + await wait(100); + expect(eventHandlerTriggered).toBe(true); + }); test( 'basic-mts-bindtouchstart', diff --git a/packages/web-platform/web-tests/tests/react/basic-mts-systeminfo/index.jsx b/packages/web-platform/web-tests/tests/react/basic-mts-systeminfo/index.jsx new file mode 100644 index 0000000000..e89ae7b19a --- /dev/null +++ b/packages/web-platform/web-tests/tests/react/basic-mts-systeminfo/index.jsx @@ -0,0 +1,24 @@ +// Copyright 2023 The Lynx Authors. All rights reserved. +// Licensed under the Apache License Version 2.0 that can be found in the +// LICENSE file in the root directory of this source tree. +import { useState, root } from '@lynx-js/react'; +function App() { + const [color] = useState('pink'); + return ( + { + 'main thread'; + if (SystemInfo.platform === 'web') { + console.log('hello world'); + } + }} + style={{ + height: '100px', + width: '100px', + background: color, + }} + /> + ); +} +root.render(); diff --git a/packages/web-platform/web-worker-rpc/CHANGELOG.md b/packages/web-platform/web-worker-rpc/CHANGELOG.md index 7540287fef..dcdc2da3b6 100644 --- a/packages/web-platform/web-worker-rpc/CHANGELOG.md +++ b/packages/web-platform/web-worker-rpc/CHANGELOG.md @@ -1,5 +1,7 @@ # @lynx-js/web-worker-rpc +## 0.15.6 + ## 0.15.5 ## 0.15.4 diff --git a/packages/web-platform/web-worker-rpc/package.json b/packages/web-platform/web-worker-rpc/package.json index 82adc9b1f3..b0ebc443b5 100644 --- a/packages/web-platform/web-worker-rpc/package.json +++ b/packages/web-platform/web-worker-rpc/package.json @@ -1,6 +1,6 @@ { "name": "@lynx-js/web-worker-rpc", - "version": "0.15.5", + "version": "0.15.6", "private": false, "description": "", "keywords": [], diff --git a/packages/web-platform/web-worker-runtime/CHANGELOG.md b/packages/web-platform/web-worker-runtime/CHANGELOG.md index 359d5aa7c0..85e9cad781 100644 --- a/packages/web-platform/web-worker-runtime/CHANGELOG.md +++ b/packages/web-platform/web-worker-runtime/CHANGELOG.md @@ -1,5 +1,14 @@ # @lynx-js/web-worker-runtime +## 0.15.6 + +### Patch Changes + +- Updated dependencies [[`405a917`](https://github.com/lynx-family/lynx-stack/commit/405a9170442ae32603b7687549b49ab4b34aff92), [`b8f89e2`](https://github.com/lynx-family/lynx-stack/commit/b8f89e25f106a15ba9d70f2df06dfb684cbb6633), [`f76aae9`](https://github.com/lynx-family/lynx-stack/commit/f76aae9ea06abdc7022ba508d22f9f4eb00864e8), [`b8b060b`](https://github.com/lynx-family/lynx-stack/commit/b8b060b9bef722bb47bd90c33fab3922160c711d), [`d8381a5`](https://github.com/lynx-family/lynx-stack/commit/d8381a58d12af6424cab4955617251e798bdc9f1), [`214898b`](https://github.com/lynx-family/lynx-stack/commit/214898bb9c74fc9b44e68cb220a4c02485102ce2), [`ab8cee4`](https://github.com/lynx-family/lynx-stack/commit/ab8cee4bab384fa905c045c4b4b93e5d4a95d57f)]: + - @lynx-js/web-mainthread-apis@0.15.6 + - @lynx-js/web-constants@0.15.6 + - @lynx-js/web-worker-rpc@0.15.6 + ## 0.15.5 ### Patch Changes diff --git a/packages/web-platform/web-worker-runtime/package.json b/packages/web-platform/web-worker-runtime/package.json index 5ad097649b..5ff2e34c74 100644 --- a/packages/web-platform/web-worker-runtime/package.json +++ b/packages/web-platform/web-worker-runtime/package.json @@ -1,6 +1,6 @@ { "name": "@lynx-js/web-worker-runtime", - "version": "0.15.5", + "version": "0.15.6", "private": false, "description": "", "keywords": [], diff --git a/packages/webpack/css-extract-webpack-plugin/CHANGELOG.md b/packages/webpack/css-extract-webpack-plugin/CHANGELOG.md index fe307a5f63..728c5f5740 100644 --- a/packages/webpack/css-extract-webpack-plugin/CHANGELOG.md +++ b/packages/webpack/css-extract-webpack-plugin/CHANGELOG.md @@ -1,5 +1,11 @@ # @lynx-js/css-extract-webpack-plugin +## 0.6.2 + +### Patch Changes + +- Fix "emit different content to the same filename" error ([#1482](https://github.com/lynx-family/lynx-stack/pull/1482)) + ## 0.6.1 ### Patch Changes diff --git a/packages/webpack/css-extract-webpack-plugin/package.json b/packages/webpack/css-extract-webpack-plugin/package.json index 9500cfbd25..0cae561046 100644 --- a/packages/webpack/css-extract-webpack-plugin/package.json +++ b/packages/webpack/css-extract-webpack-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@lynx-js/css-extract-webpack-plugin", - "version": "0.6.1", + "version": "0.6.2", "description": "This plugin extracts CSS into separate files. It creates a CSS file per JS file which contains CSS.", "keywords": [ "webpack", diff --git a/packages/webpack/template-webpack-plugin/CHANGELOG.md b/packages/webpack/template-webpack-plugin/CHANGELOG.md index 36b14d91a9..3f9ed201ef 100644 --- a/packages/webpack/template-webpack-plugin/CHANGELOG.md +++ b/packages/webpack/template-webpack-plugin/CHANGELOG.md @@ -1,5 +1,11 @@ # @lynx-js/template-webpack-plugin +## 0.8.4 + +### Patch Changes + +- Fix invalid `module.exports=;` syntax in app-service.js. ([#1501](https://github.com/lynx-family/lynx-stack/pull/1501)) + ## 0.8.3 ### Patch Changes diff --git a/packages/webpack/template-webpack-plugin/package.json b/packages/webpack/template-webpack-plugin/package.json index f39e79fe23..3d4bbe3bef 100644 --- a/packages/webpack/template-webpack-plugin/package.json +++ b/packages/webpack/template-webpack-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@lynx-js/template-webpack-plugin", - "version": "0.8.3", + "version": "0.8.4", "description": "Simplifies creation of Lynx template files to serve your webpack bundles", "keywords": [ "webpack", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1ba56f4d5..f34d94af3b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,8 +56,8 @@ importers: specifier: 'catalog:' version: 7.52.10(@types/node@22.17.1) '@rslib/core': - specifier: ^0.12.0 - version: 0.12.0(@microsoft/api-extractor@7.52.10(@types/node@22.17.1))(typescript@5.9.2) + specifier: ^0.12.1 + version: 0.12.1(@microsoft/api-extractor@7.52.10(@types/node@22.17.1))(typescript@5.9.2) '@rspack/core': specifier: 1.4.11 version: 1.4.11(@swc/helpers@0.5.17) @@ -528,10 +528,10 @@ importers: version: link:../../web-platform/web-elements '@rsbuild/plugin-less': specifier: 1.4.0 - version: 1.4.0(@rsbuild/core@1.5.0-beta.0) + version: 1.4.0(@rsbuild/core@1.5.0-beta.3) '@rsbuild/plugin-sass': specifier: 1.3.5 - version: 1.3.5(@rsbuild/core@1.5.0-beta.0) + version: 1.3.5(@rsbuild/core@1.5.0-beta.3) commander: specifier: ^13.1.0 version: 13.1.0 @@ -546,7 +546,7 @@ importers: version: 1.1.1 rsbuild-plugin-tailwindcss: specifier: 0.2.3 - version: 0.2.3(@rsbuild/core@1.5.0-beta.0)(tailwindcss@3.4.17) + version: 0.2.3(@rsbuild/core@1.5.0-beta.3)(tailwindcss@3.4.17) rslog: specifier: ^1.2.11 version: 1.2.11 @@ -1125,8 +1125,8 @@ importers: website: dependencies: '@rstack-dev/doc-ui': - specifier: 1.10.9 - version: 1.10.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 1.10.10 + version: 1.10.10(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: ^19.1.1 version: 19.1.1 @@ -1183,11 +1183,11 @@ importers: specifier: 1.0.3 version: 1.0.3(@rsbuild/core@1.4.15) '@rspress/core': - specifier: 2.0.0-beta.26 - version: 2.0.0-beta.26(@types/react@19.1.10)(acorn@8.15.0)(webpack@5.101.2) + specifier: 2.0.0-beta.27 + version: 2.0.0-beta.27(@types/react@19.1.10)(acorn@8.15.0)(webpack@5.101.2) '@rspress/plugin-client-redirects': - specifier: 2.0.0-beta.26 - version: 2.0.0-beta.26(@rspress/core@2.0.0-beta.26(@types/react@19.1.10)(acorn@8.15.0)(webpack@5.101.2)) + specifier: 2.0.0-beta.27 + version: 2.0.0-beta.27(@rspress/core@2.0.0-beta.27(@types/react@19.1.10)(acorn@8.15.0)(webpack@5.101.2)) '@shikijs/transformers': specifier: 3.9.2 version: 3.9.2 @@ -2460,8 +2460,8 @@ packages: engines: {node: '>=16.10.0'} hasBin: true - '@rsbuild/core@1.5.0-beta.0': - resolution: {integrity: sha512-X4PMkw/scc1gR3CGpWkvLvT1ZbjXug/n9a5dHPvNev1pqnG0uQsGjmw1+QWstlnLL3kvL5/kUY+fbemnE1hkeQ==} + '@rsbuild/core@1.5.0-beta.3': + resolution: {integrity: sha512-b4QOPQJvmhJFIWqBZ6kI7XLI3d1qx52ASpEzBoL5cnRnfh8tCMymWi9I0xUZinRmAh9V4wdIRG8EtISe899CcA==} engines: {node: '>=18.12.0'} hasBin: true @@ -2546,8 +2546,8 @@ packages: '@rsdoctor/utils@1.2.2': resolution: {integrity: sha512-WyffOy73EG29cjTCL4I8Iq14YUNxT5CRfG/qOiOmW//cMxZZkcGGS+gfcAh0A5Ta+1c7k17bmCIl4CjZlbWh5Q==} - '@rslib/core@0.12.0': - resolution: {integrity: sha512-g5+KIJ+lwGvxff/3trRC4fhjkphDS7iWJoTLGf77xl8dvPfjhmtfoOzFwaeRQ2xs5YpafuE2scBA8G4tdaBgmA==} + '@rslib/core@0.12.1': + resolution: {integrity: sha512-ualcmPkgBk1/IgapJ/GN5wWfl0zjH++3Wpe7f8990NzM4zk5MS9JVqDjV9oljCtf/N8Va5YDC4pEULzVES7xYQ==} engines: {node: '>=18.12.0'} hasBin: true peerDependencies: @@ -2650,8 +2650,8 @@ packages: peerDependencies: '@rspack/core': 1.4.11 - '@rspress/core@2.0.0-beta.26': - resolution: {integrity: sha512-zvWVw23zsX4WE1sVHdq/09o241QqITOJaBrMKW51G+KMdx29ro4aLBLt2Wo8+M9UrZi2fG9k2Hwo5vjXig/eCQ==} + '@rspress/core@2.0.0-beta.27': + resolution: {integrity: sha512-2TvDVL4NK1PAaB6oA/al5nvFxDJfazkU554l2BK5x8sxpPSF0V1zNGDsULgWPQnZt0s2qWekqsmVhVYj1dvFLQ==} engines: {node: '>=18.0.0'} hasBin: true @@ -2707,25 +2707,25 @@ packages: resolution: {integrity: sha512-NpNhTKBIlV3O6ADhoZkgHvBFvXMW2TYlIWmIT1ysJESUBqDpaN9H3Teve5fugjU2pQ2ORBZO6SQGKliMw/8m/Q==} engines: {node: '>= 10'} - '@rspress/plugin-client-redirects@2.0.0-beta.26': - resolution: {integrity: sha512-Kjx/OWrsFemSUurd9cefs46UISSj8j9KuvDVGUJH2PA+vTWQlArl+ANpDx9OsctJEbmiZo/C2oZlvXRDOHQ9DA==} + '@rspress/plugin-client-redirects@2.0.0-beta.27': + resolution: {integrity: sha512-07bYLdhb3mk1P2IpdsnB5Gm2jhr+vwUXmsc+JvYb7m2sRRbmPW03WGLEM2SldkwtmevCMNK3VLze5f3ZXhL7XQ==} engines: {node: '>=18.0.0'} peerDependencies: - '@rspress/core': ^2.0.0-beta.26 + '@rspress/core': ^2.0.0-beta.27 - '@rspress/runtime@2.0.0-beta.26': - resolution: {integrity: sha512-zemOLMrvSm0pHHHYC3P9rmcidzpE9BzZIod5WwgtUdGHr8ERxJ2X6+e2JULyV/IxTTwgsSnMFH4atwDDE73kxQ==} + '@rspress/runtime@2.0.0-beta.27': + resolution: {integrity: sha512-Q+P8oQNF0KqFpt71Mgr1YKFcxhgSGw1uJlAsZrTfkp/kL/t7fP+5bwPpDoF4IRcFZ5K3qW9PQT+ggnwG31NTyQ==} engines: {node: '>=18.0.0'} - '@rspress/shared@2.0.0-beta.26': - resolution: {integrity: sha512-d1BZ25sXf3wSbiaBKO+Yqk87oUpCQTr+EPOx12WRsAtLcoo8jELp2JT7wV9K0hQ3YdSG1mR9kY4Rkclet21uZg==} + '@rspress/shared@2.0.0-beta.27': + resolution: {integrity: sha512-Y5EDWHs0JyYFW5m9zyjaBHNrw+FnEVQMrgSts/v5PSG/VwjFm+yPNHhE+2WVJMROFr1mgzTJzICh2vmgskMhhA==} - '@rspress/theme-default@2.0.0-beta.26': - resolution: {integrity: sha512-Hj6ph/1rMKjUlXcrEYfuXFBESV9I2hzAV7uUEomzs68nQj3vXBY9RZjFUyckBEu+cFGPZkEbKq5+GVHzAnXZJQ==} + '@rspress/theme-default@2.0.0-beta.27': + resolution: {integrity: sha512-8j4dpZLT/JnyjUl+bVM/oMHYz55G/MnxuDkKuZjBYeQNwMVSddiX0ytbHjFgxVRaC7bCX2ZXTY1OdX4SNJ6qdQ==} engines: {node: '>=18.0.0'} - '@rstack-dev/doc-ui@1.10.9': - resolution: {integrity: sha512-H3ceWWcBZq7vw6If1nUH1eJ95vp17wUC9It87GjRNdQNHQEihO+yQ6sop+71olpRJt5ztgTM8Q5QczULyps1xA==} + '@rstack-dev/doc-ui@1.10.10': + resolution: {integrity: sha512-ShZpNViiBKMYIT28vFmYP/SPp/oxhP4fCXTVYWWatas6AxJ1AIMunnWAl930u2YnP4D7UgxHopleMx/cLGhTwA==} '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -6929,8 +6929,8 @@ packages: rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - rsbuild-plugin-dts@0.12.0: - resolution: {integrity: sha512-5kLjgjWaFnkjRB4p/wglCGZALUtJ1zCKpTM/6T3eQhrfU24cjCwBqr8/kNXjsP4ESP1LfjxWj+H0Rsl7oT5ncA==} + rsbuild-plugin-dts@0.12.1: + resolution: {integrity: sha512-NXY04mekD3e1FzRKxcP5c8/idjWcnNyDcdXh4VcF10F7UxsgqT/rIOV8FT1aT+JjFncAD2mXboPq20wkqJTiIw==} engines: {node: '>=18.12.0'} peerDependencies: '@microsoft/api-extractor': ^7 @@ -9481,7 +9481,7 @@ snapshots: core-js: 3.45.0 jiti: 2.5.1 - '@rsbuild/core@1.5.0-beta.0': + '@rsbuild/core@1.5.0-beta.3': dependencies: '@rspack/core': 1.4.11(@swc/helpers@0.5.17) '@rspack/lite-tapable': 1.0.1 @@ -9514,9 +9514,9 @@ snapshots: - lightningcss - webpack - '@rsbuild/plugin-less@1.4.0(@rsbuild/core@1.5.0-beta.0)': + '@rsbuild/plugin-less@1.4.0(@rsbuild/core@1.5.0-beta.3)': dependencies: - '@rsbuild/core': 1.5.0-beta.0 + '@rsbuild/core': 1.5.0-beta.3 deepmerge: 4.3.1 reduce-configs: 1.1.1 @@ -9537,9 +9537,9 @@ snapshots: reduce-configs: 1.1.1 sass-embedded: 1.90.0 - '@rsbuild/plugin-sass@1.3.5(@rsbuild/core@1.5.0-beta.0)': + '@rsbuild/plugin-sass@1.3.5(@rsbuild/core@1.5.0-beta.3)': dependencies: - '@rsbuild/core': 1.5.0-beta.0 + '@rsbuild/core': 1.5.0-beta.3 deepmerge: 4.3.1 loader-utils: 2.0.4 postcss: 8.5.6 @@ -9681,10 +9681,10 @@ snapshots: - supports-color - webpack - '@rslib/core@0.12.0(@microsoft/api-extractor@7.52.10(@types/node@22.17.1))(typescript@5.9.2)': + '@rslib/core@0.12.1(@microsoft/api-extractor@7.52.10(@types/node@22.17.1))(typescript@5.9.2)': dependencies: - '@rsbuild/core': 1.5.0-beta.0 - rsbuild-plugin-dts: 0.12.0(@microsoft/api-extractor@7.52.10(@types/node@22.17.1))(@rsbuild/core@1.5.0-beta.0)(typescript@5.9.2) + '@rsbuild/core': 1.5.0-beta.3 + rsbuild-plugin-dts: 0.12.1(@microsoft/api-extractor@7.52.10(@types/node@22.17.1))(@rsbuild/core@1.5.0-beta.3)(typescript@5.9.2) tinyglobby: 0.2.14 optionalDependencies: '@microsoft/api-extractor': 7.52.10(@types/node@22.17.1) @@ -9826,7 +9826,7 @@ snapshots: - utf-8-validate - webpack-cli - '@rspress/core@2.0.0-beta.26(@types/react@19.1.10)(acorn@8.15.0)(webpack@5.101.2)': + '@rspress/core@2.0.0-beta.27(@types/react@19.1.10)(acorn@8.15.0)(webpack@5.101.2)': dependencies: '@mdx-js/loader': 3.1.0(acorn@8.15.0)(webpack@5.101.2) '@mdx-js/mdx': 3.1.0(acorn@8.15.0) @@ -9834,9 +9834,9 @@ snapshots: '@rsbuild/core': 1.4.15 '@rsbuild/plugin-react': 1.3.5(@rsbuild/core@1.4.15) '@rspress/mdx-rs': 0.6.6 - '@rspress/runtime': 2.0.0-beta.26 - '@rspress/shared': 2.0.0-beta.26 - '@rspress/theme-default': 2.0.0-beta.26 + '@rspress/runtime': 2.0.0-beta.27 + '@rspress/shared': 2.0.0-beta.27 + '@rspress/theme-default': 2.0.0-beta.27 '@shikijs/rehype': 3.9.2 '@types/unist': 3.0.3 '@unhead/react': 2.0.14(react@19.1.1) @@ -9908,19 +9908,19 @@ snapshots: '@rspress/mdx-rs-win32-arm64-msvc': 0.6.6 '@rspress/mdx-rs-win32-x64-msvc': 0.6.6 - '@rspress/plugin-client-redirects@2.0.0-beta.26(@rspress/core@2.0.0-beta.26(@types/react@19.1.10)(acorn@8.15.0)(webpack@5.101.2))': + '@rspress/plugin-client-redirects@2.0.0-beta.27(@rspress/core@2.0.0-beta.27(@types/react@19.1.10)(acorn@8.15.0)(webpack@5.101.2))': dependencies: - '@rspress/core': 2.0.0-beta.26(@types/react@19.1.10)(acorn@8.15.0)(webpack@5.101.2) + '@rspress/core': 2.0.0-beta.27(@types/react@19.1.10)(acorn@8.15.0)(webpack@5.101.2) - '@rspress/runtime@2.0.0-beta.26': + '@rspress/runtime@2.0.0-beta.27': dependencies: - '@rspress/shared': 2.0.0-beta.26 + '@rspress/shared': 2.0.0-beta.27 '@unhead/react': 2.0.14(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) react-router-dom: 6.30.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@rspress/shared@2.0.0-beta.26': + '@rspress/shared@2.0.0-beta.27': dependencies: '@rsbuild/core': 1.4.15 '@shikijs/rehype': 3.9.2 @@ -9928,11 +9928,11 @@ snapshots: lodash-es: 4.17.21 unified: 11.0.5 - '@rspress/theme-default@2.0.0-beta.26': + '@rspress/theme-default@2.0.0-beta.27': dependencies: '@mdx-js/react': 2.3.0(react@19.1.1) - '@rspress/runtime': 2.0.0-beta.26 - '@rspress/shared': 2.0.0-beta.26 + '@rspress/runtime': 2.0.0-beta.27 + '@rspress/shared': 2.0.0-beta.27 '@unhead/react': 2.0.14(react@19.1.1) body-scroll-lock: 4.0.0-beta.0 copy-to-clipboard: 3.3.3 @@ -9947,7 +9947,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@rstack-dev/doc-ui@1.10.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@rstack-dev/doc-ui@1.10.10(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: framer-motion: 12.23.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) transitivePeerDependencies: @@ -14936,10 +14936,10 @@ snapshots: rrweb-cssom@0.8.0: {} - rsbuild-plugin-dts@0.12.0(@microsoft/api-extractor@7.52.10(@types/node@22.17.1))(@rsbuild/core@1.5.0-beta.0)(typescript@5.9.2): + rsbuild-plugin-dts@0.12.1(@microsoft/api-extractor@7.52.10(@types/node@22.17.1))(@rsbuild/core@1.5.0-beta.3)(typescript@5.9.2): dependencies: '@ast-grep/napi': 0.37.0 - '@rsbuild/core': 1.5.0-beta.0 + '@rsbuild/core': 1.5.0-beta.3 magic-string: 0.30.17 picocolors: 1.1.1 tinyglobby: 0.2.14 @@ -14961,11 +14961,11 @@ snapshots: optionalDependencies: '@rsbuild/core': 1.4.15 - rsbuild-plugin-tailwindcss@0.2.3(@rsbuild/core@1.5.0-beta.0)(tailwindcss@3.4.17): + rsbuild-plugin-tailwindcss@0.2.3(@rsbuild/core@1.5.0-beta.3)(tailwindcss@3.4.17): dependencies: tailwindcss: 3.4.17 optionalDependencies: - '@rsbuild/core': 1.5.0-beta.0 + '@rsbuild/core': 1.5.0-beta.3 rslog@1.2.11: {} diff --git a/website/package.json b/website/package.json index 2636c4f405..8a0b5a1769 100644 --- a/website/package.json +++ b/website/package.json @@ -14,7 +14,7 @@ "preview": "rspress preview" }, "dependencies": { - "@rstack-dev/doc-ui": "1.10.9", + "@rstack-dev/doc-ui": "1.10.10", "react": "^19.1.1", "react-dom": "^19.1.1" }, @@ -35,8 +35,8 @@ "@rsbuild/plugin-sass": "1.3.5", "@rsbuild/plugin-type-check": "1.2.4", "@rsbuild/plugin-typed-css-modules": "1.0.3", - "@rspress/core": "2.0.0-beta.26", - "@rspress/plugin-client-redirects": "2.0.0-beta.26", + "@rspress/core": "2.0.0-beta.27", + "@rspress/plugin-client-redirects": "2.0.0-beta.27", "@shikijs/transformers": "3.9.2", "@types/react": "npm:@types/react@^19.1.10", "@types/react-dom": "^19.1.7",