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",