diff --git a/.changeset/light-facts-sniff.md b/.changeset/light-facts-sniff.md new file mode 100644 index 0000000000..2ac181b40b --- /dev/null +++ b/.changeset/light-facts-sniff.md @@ -0,0 +1,9 @@ +--- +"@lynx-js/web-mainthread-apis": patch +"@lynx-js/web-webpack-plugin": patch +"@lynx-js/react-rsbuild-plugin": patch +--- + +fix(web): `:root` not work on web platform + +Note: To solve this issue, you need to upgrade your `react-rsbuild-plugin` diff --git a/.changeset/loose-moments-itch.md b/.changeset/loose-moments-itch.md new file mode 100644 index 0000000000..2620eb07a3 --- /dev/null +++ b/.changeset/loose-moments-itch.md @@ -0,0 +1,5 @@ +--- +"@lynx-js/web-elements": patch +--- + +perf: late evaluate document.font.ready diff --git a/.changeset/rotten-walls-hear.md b/.changeset/rotten-walls-hear.md new file mode 100644 index 0000000000..1db426f9e7 --- /dev/null +++ b/.changeset/rotten-walls-hear.md @@ -0,0 +1,13 @@ +--- +"@lynx-js/react-alias-rsbuild-plugin": patch +"@lynx-js/react-rsbuild-plugin": patch +--- + +Refactor: Replace built-in `background-only` implementation with npm package + +Previously we maintained custom files: + +- `empty.ts` for background thread +- `error.ts` for main thread validation + +Now adopting the standard `background-only` npm package diff --git a/.changeset/rude-memes-shave.md b/.changeset/rude-memes-shave.md new file mode 100644 index 0000000000..434b0e0eaf --- /dev/null +++ b/.changeset/rude-memes-shave.md @@ -0,0 +1,13 @@ +--- +"@lynx-js/web-mainthread-apis": patch +"@lynx-js/web-constants": patch +"@lynx-js/web-webpack-plugin": patch +"@lynx-js/react-rsbuild-plugin": patch +"@lynx-js/web-core": patch +--- + +fix(web): css selector not work for selectors with combinator and pseudo-class on WEB + +like `.parent > :not([hidden]) ~ :not([hidden])` + +you will need to upgrade your `react-rsbuild-plugin` to fix this issue diff --git a/.changeset/shaky-games-cough.md b/.changeset/shaky-games-cough.md new file mode 100644 index 0000000000..37090781ab --- /dev/null +++ b/.changeset/shaky-games-cough.md @@ -0,0 +1,5 @@ +--- +"@lynx-js/web-elements": patch +--- + +perf: improve raw-text performance diff --git a/packages/rspeedy/plugin-react-alias/etc/react-alias-rsbuild-plugin.api.md b/packages/rspeedy/plugin-react-alias/etc/react-alias-rsbuild-plugin.api.md index a3da1859c3..124810be4c 100644 --- a/packages/rspeedy/plugin-react-alias/etc/react-alias-rsbuild-plugin.api.md +++ b/packages/rspeedy/plugin-react-alias/etc/react-alias-rsbuild-plugin.api.md @@ -6,6 +6,11 @@ import type { RsbuildPlugin } from '@rsbuild/core'; +// Warning: (ae-missing-release-tag) "createLazyResolver" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function createLazyResolver(context: string, conditionNames: string[]): (request: string) => Promise; + // Warning: (ae-missing-release-tag) "Options" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) diff --git a/packages/rspeedy/plugin-react-alias/src/index.ts b/packages/rspeedy/plugin-react-alias/src/index.ts index 08a5eac4b8..37ff03a4a3 100644 --- a/packages/rspeedy/plugin-react-alias/src/index.ts +++ b/packages/rspeedy/plugin-react-alias/src/index.ts @@ -164,13 +164,13 @@ export function pluginReactAlias(options: Options): RsbuildPlugin { } } -function createLazyResolver(context: string, conditionNames: string[]) { +export function createLazyResolver(context: string, conditionNames: string[]) { let lazyExports: Record let resolverLazy: ResolveFunction return async ( request: string, - ) => { + ): Promise => { const { default: resolver } = await import('enhanced-resolve') return ( @@ -179,6 +179,6 @@ function createLazyResolver(context: string, conditionNames: string[]) { context, request, ) - ) + ) as string } } diff --git a/packages/rspeedy/plugin-react/package.json b/packages/rspeedy/plugin-react/package.json index 305b37905a..52f792d756 100644 --- a/packages/rspeedy/plugin-react/package.json +++ b/packages/rspeedy/plugin-react/package.json @@ -43,7 +43,8 @@ "@lynx-js/react-webpack-plugin": "workspace:*", "@lynx-js/runtime-wrapper-webpack-plugin": "workspace:*", "@lynx-js/template-webpack-plugin": "workspace:*", - "@lynx-js/web-webpack-plugin": "workspace:*" + "@lynx-js/web-webpack-plugin": "workspace:*", + "background-only": "^0.0.1" }, "devDependencies": { "@lynx-js/react": "workspace:*", diff --git a/packages/rspeedy/plugin-react/src/background-only/error.ts b/packages/rspeedy/plugin-react/src/background-only/error.ts deleted file mode 100644 index e08f1e9160..0000000000 --- a/packages/rspeedy/plugin-react/src/background-only/error.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2024 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. -throw new Error( - 'This module cannot be imported from a Main Thread module. ' - + 'It should only be used from a Background Thread.', -) diff --git a/packages/rspeedy/plugin-react/src/backgroundOnly.ts b/packages/rspeedy/plugin-react/src/backgroundOnly.ts index 46ac57780c..f8a385774e 100644 --- a/packages/rspeedy/plugin-react/src/backgroundOnly.ts +++ b/packages/rspeedy/plugin-react/src/backgroundOnly.ts @@ -6,6 +6,7 @@ import { fileURLToPath } from 'node:url' import type { RsbuildPluginAPI } from '@rsbuild/core' +import { createLazyResolver } from '@lynx-js/react-alias-rsbuild-plugin' import { LAYERS } from '@lynx-js/react-webpack-plugin' const DETECT_IMPORT_ERROR = 'react:detect-import-error' @@ -18,7 +19,21 @@ export function applyBackgroundOnly( ): void { const __dirname = path.dirname(fileURLToPath(import.meta.url)) - api.modifyBundlerChain(chain => { + const backgroundResolve = createLazyResolver( + __dirname, + ['import'], + ) + const mainThreadResolve = createLazyResolver( + __dirname, + ['lepus'], + ) + + api.modifyBundlerChain(async chain => { + const backgroundOnly = { + background: await backgroundResolve('background-only'), + mainThread: await mainThreadResolve('background-only'), + } + chain .module .rule(ALIAS_BACKGROUND_ONLY_MAIN) @@ -27,7 +42,7 @@ export function applyBackgroundOnly( .alias .set( 'background-only$', - path.resolve(__dirname, 'background-only', 'error.js'), + backgroundOnly.mainThread, ) chain @@ -38,13 +53,13 @@ export function applyBackgroundOnly( .alias .set( 'background-only$', - path.resolve(__dirname, 'background-only', 'empty.js'), + backgroundOnly.background, ) chain .module .rule(DETECT_IMPORT_ERROR) - .test(path.resolve(__dirname, 'background-only', 'error.js')) + .test(backgroundOnly.mainThread) .issuerLayer(LAYERS.MAIN_THREAD) .use(DETECT_IMPORT_ERROR) .loader(path.resolve(__dirname, 'loaders/invalid-import-error-loader')) diff --git a/packages/web-platform/web-constants/src/types/StyleInfo.ts b/packages/web-platform/web-constants/src/types/StyleInfo.ts index e89ea7ca91..ee7dc0b69b 100644 --- a/packages/web-platform/web-constants/src/types/StyleInfo.ts +++ b/packages/web-platform/web-constants/src/types/StyleInfo.ts @@ -6,6 +6,8 @@ export interface CSSRule { plainSelectors: string[], pseudoClassSelectors: string[], pseudoElementSelectors: string[], + combinator: string[], + ...string[][], ][]; decl: [string, string][]; } diff --git a/packages/web-platform/web-elements/src/XText/RawText.ts b/packages/web-platform/web-elements/src/XText/RawText.ts index f2dd5f618e..dcd95e758d 100644 --- a/packages/web-platform/web-elements/src/XText/RawText.ts +++ b/packages/web-platform/web-elements/src/XText/RawText.ts @@ -11,16 +11,17 @@ import { export class RawTextAttributes { static observedAttributes = ['text']; readonly #dom: HTMLElement; + #text?: Text; constructor(currentElement: HTMLElement) { this.#dom = currentElement; } @registerAttributeHandler('text', true) #handleText(newVal: string | null) { + this.#text?.remove(); if (newVal) { - this.#dom.innerHTML = newVal; - } else { - this.#dom.innerHTML = ''; + this.#text = new Text(newVal); + this.#dom.append(this.#text); } } } diff --git a/packages/web-platform/web-elements/src/XText/XTextTruncation.ts b/packages/web-platform/web-elements/src/XText/XTextTruncation.ts index a7bae15b68..b48a12efdd 100644 --- a/packages/web-platform/web-elements/src/XText/XTextTruncation.ts +++ b/packages/web-platform/web-elements/src/XText/XTextTruncation.ts @@ -119,15 +119,13 @@ export class XTextTruncation if (!this.#componentConnected || this.#dom.matches('x-text>x-text')) return; if (this.#scheduledTextLayout) return; this.#scheduledTextLayout = true; - boostedQueueMicrotask(() => { - this.#layoutTextInner(); + boostedQueueMicrotask(async () => { + await this.#layoutTextInner(); this.#startObservers(); - queueMicrotask(() => { - this.#scheduledTextLayout = false; - }); + this.#scheduledTextLayout = false; }); } - #layoutTextInner() { + async #layoutTextInner() { this.#inplaceEllipsisNode?.parentElement?.removeChild( this.#inplaceEllipsisNode, ); @@ -136,6 +134,7 @@ export class XTextTruncation if (!this.#doExpensiveLineLayoutCalculation && isNaN(this.#maxLength)) { return; } + await document.fonts.ready; const parentBondingRect = this.#getInnerBox().getBoundingClientRect(); this.#textMeasure = new TextRenderingMeasureTool( this.#dom, @@ -389,9 +388,7 @@ export class XTextTruncation this.#handleEnableLayoutEvent( this.#enableLayoutEvent, ); - document.fonts.ready.then(() => { - this.#handleAttributeChange(); - }); + this.#handleAttributeChange(); boostedQueueMicrotask(() => { this.#sendLayoutEvent(); }); diff --git a/packages/web-platform/web-mainthread-apis/src/MainThreadRuntime.ts b/packages/web-platform/web-mainthread-apis/src/MainThreadRuntime.ts index d414d52143..15167d0d90 100644 --- a/packages/web-platform/web-mainthread-apis/src/MainThreadRuntime.ts +++ b/packages/web-platform/web-mainthread-apis/src/MainThreadRuntime.ts @@ -121,7 +121,6 @@ export class MainThreadRuntime { const cssInJsInfo: CssInJsInfo = this.config.pageConfig.enableCSSSelector ? {} : genCssInJsInfo(this.config.styleInfo); - this._rootDom = this.config.docu.createElement('div'); const cardStyleElement = this.config.docu.createElement('style'); cardStyleElement.innerHTML = genCssContent( this.config.styleInfo, diff --git a/packages/web-platform/web-mainthread-apis/src/utils/processStyleInfo.ts b/packages/web-platform/web-mainthread-apis/src/utils/processStyleInfo.ts index 39c2b91be5..5bfbf44602 100644 --- a/packages/web-platform/web-mainthread-apis/src/utils/processStyleInfo.ts +++ b/packages/web-platform/web-mainthread-apis/src/utils/processStyleInfo.ts @@ -7,6 +7,7 @@ import { type StyleInfo, type CssInJsInfo, type PageConfig, + type CSSRule, cssIdAttribute, lynxTagAttribute, } from '@lynx-js/web-constants'; @@ -48,13 +49,18 @@ export function transformToWebCss(styleInfo: StyleInfo) { rule.decl = transformedStyle; if (childStyle.length > 0) { cssInfos.rules.push({ - sel: selectors.map( - selector => [ - selector[0].concat(['>', '*']), - selector[1], - selector[2], - ], - ), + sel: selectors.map(selector => + selector.toSpliced( + -2, + 1, + /* replace the last combinator and insert at the end */ + ['>'], + ['*'], + [], + [], + [], + ) + ) as CSSRule['sel'], decl: childStyle, }); } @@ -72,7 +78,7 @@ export function genCssContent( function getExtraSelectors( cssId?: string, ) { - let prepend = '', suffix = ''; + let suffix = ''; if (!pageConfig.enableRemoveCSSScope) { if (cssId !== undefined) { suffix += `[${cssIdAttribute}="${cssId}"]`; @@ -83,22 +89,17 @@ export function genCssContent( } else { suffix += `[${lynxTagAttribute}]`; } - return { prepend, suffix }; + return suffix; } const finalCssContent: string[] = []; for (const [cssId, cssInfos] of Object.entries(styleInfo)) { - const { prepend, suffix } = getExtraSelectors(cssId); + const suffix = getExtraSelectors(cssId); const declarationContent = cssInfos.rules.map((rule) => { - const { sel: selectors, decl: declarations } = rule; - const selectorString = selectors.map( - ([plainSelectors, pseudoClassSelectors, pseudoElementSelectors]) => { - return [ - prepend, - plainSelectors.join(''), - suffix, - pseudoClassSelectors.join(''), - pseudoElementSelectors.join(''), - ].join(''); + const { sel: selectorList, decl: declarations } = rule; + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice + const selectorString = selectorList.map( + (selectors) => { + return selectors.toSpliced(-4, 0, [suffix]).join(''); }, ).join(','); const declarationString = declarations.map(([k, v]) => `${k}:${v};`).join( @@ -120,12 +121,18 @@ export function genCssInJsInfo(styleInfo: StyleInfo): CssInJsInfo { const oneCssInJsInfo: Record = {}; cssInfos.rules = cssInfos.rules.filter(oneCssInfo => { oneCssInfo.sel = oneCssInfo.sel.filter(selectorList => { - const [classSelectors, pseudoClassSelectors, pseudoElementSelectors] = - selectorList; + const [ + classSelectors, + pseudoClassSelectors, + pseudoElementSelectors, + combinator, + ] = selectorList; if ( + // only one class selector classSelectors.length === 1 && classSelectors[0]![0] === '.' && pseudoClassSelectors.length === 0 && pseudoElementSelectors.length === 0 + && combinator.length === 0 ) { const selectorName = classSelectors[0]!.substring(1); const currentDeclarations = oneCssInJsInfo[selectorName]; diff --git a/packages/web-platform/web-tests/lighthouserc.js b/packages/web-platform/web-tests/lighthouserc.js index 21cb30aef5..cf62a3094e 100644 --- a/packages/web-platform/web-tests/lighthouserc.js +++ b/packages/web-platform/web-tests/lighthouserc.js @@ -3,6 +3,7 @@ import { chromium } from '@playwright/test'; import cases from './tests/lighthouse.cases.js'; const port = process.env.PORT ?? 3080; +const isCI = !!process.env['CI']; const config = { ci: { // Use the recommended Lighthouse CI preset @@ -42,7 +43,7 @@ const config = { // Configure throttling settings throttling: { rttMs: 0, - cpuSlowdownMultiplier: 2.5, + cpuSlowdownMultiplier: isCI ? 2.3 : 4, requestLatencyMs: 0, downloadThroughputKbps: 99999, uploadThroughputKbps: 99999, diff --git a/packages/web-platform/web-tests/tests/lighthouse.cases.js b/packages/web-platform/web-tests/tests/lighthouse.cases.js index 4d35759f93..d39ad84d8d 100644 --- a/packages/web-platform/web-tests/tests/lighthouse.cases.js +++ b/packages/web-platform/web-tests/tests/lighthouse.cases.js @@ -28,7 +28,7 @@ export default [ 'categories:performance': [ 'error', { - 'minScore': 0.81, + 'minScore': 0.87, }, ], 'first-contentful-paint': [ @@ -40,7 +40,31 @@ export default [ 'total-blocking-time': [ 'error', { - 'maxNumericValue': 750, + 'maxNumericValue': 500, + }, + ], + }, + }, + { + 'matchingUrlPattern': + '/web-element-tests/performance/x-text-with-font.html', + 'assertions': { + 'categories:performance': [ + 'error', + { + 'minScore': 0.79, + }, + ], + 'speed-index': [ + 'error', + { + 'maxNumericValue': 550, + }, + ], + 'total-blocking-time': [ + 'error', + { + 'maxNumericValue': 500, }, ], }, diff --git a/packages/web-platform/web-tests/tests/react.spec.ts b/packages/web-platform/web-tests/tests/react.spec.ts index 3721f49f10..48e2a9ada7 100644 --- a/packages/web-platform/web-tests/tests/react.spec.ts +++ b/packages/web-platform/web-tests/tests/react.spec.ts @@ -192,6 +192,12 @@ test.describe('reactlynx3 tests', () => { ).toHaveCSS('width', '60px'); }, ); + test('basic-style-combinator', async ({ page }, { title }) => { + await goto(page, title); + await wait(100); + const target = page.locator('#target'); + await expect(target).toHaveCSS('background-color', 'rgb(0, 128, 0)'); // green + }); test('basic-style-remove', async ({ page }, { title }) => { await goto(page, title); await wait(100); @@ -212,6 +218,12 @@ test.describe('reactlynx3 tests', () => { await target.click(); await expect(target).toHaveCSS('background-color', 'rgb(0, 128, 0)'); // green }); + test('basic-style-root-selector', async ({ page }, { title }) => { + await goto(page, title); + await wait(100); + const target = page.locator('#target'); + await expect(target).toHaveCSS('background-color', 'rgb(0, 128, 0)'); // green + }); test('basic-useeffect-hydrate', async ({ page }, { title }) => { await goto(page, title); await wait(100); diff --git a/packages/web-platform/web-tests/tests/react/basic-style-combinator/index.css b/packages/web-platform/web-tests/tests/react/basic-style-combinator/index.css new file mode 100644 index 0000000000..624d407e24 --- /dev/null +++ b/packages/web-platform/web-tests/tests/react/basic-style-combinator/index.css @@ -0,0 +1,14 @@ +/* +// 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. +*/ +.parent > :not([hidden]) ~ :not([hidden]) { + background-color: green; +} + +view { + width: 100px; + height: 100px; + background-color: red; +} diff --git a/packages/web-platform/web-tests/tests/react/basic-style-combinator/index.jsx b/packages/web-platform/web-tests/tests/react/basic-style-combinator/index.jsx new file mode 100644 index 0000000000..aed8cd1c68 --- /dev/null +++ b/packages/web-platform/web-tests/tests/react/basic-style-combinator/index.jsx @@ -0,0 +1,18 @@ +// 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 { root } from '@lynx-js/react'; +import './index.css'; +function App() { + return ( + + + + + + + + + ); +} +root.render(); diff --git a/packages/rspeedy/plugin-react/src/background-only/empty.ts b/packages/web-platform/web-tests/tests/react/basic-style-root-selector/index.css similarity index 57% rename from packages/rspeedy/plugin-react/src/background-only/empty.ts rename to packages/web-platform/web-tests/tests/react/basic-style-root-selector/index.css index fce7161576..bffe4e2eec 100644 --- a/packages/rspeedy/plugin-react/src/background-only/empty.ts +++ b/packages/web-platform/web-tests/tests/react/basic-style-root-selector/index.css @@ -1,3 +1,8 @@ -// Copyright 2024 The Lynx Authors. All rights reserved. +/* +// 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. +*/ +:root { + background-color: green; +} diff --git a/packages/web-platform/web-tests/tests/react/basic-style-root-selector/index.jsx b/packages/web-platform/web-tests/tests/react/basic-style-root-selector/index.jsx new file mode 100644 index 0000000000..538f7fc340 --- /dev/null +++ b/packages/web-platform/web-tests/tests/react/basic-style-root-selector/index.jsx @@ -0,0 +1,18 @@ +// 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 { root, useCallback, useState } from '@lynx-js/react'; +import './index.css'; +function App() { + return ( + + ); +} +root.render( + + + , +); diff --git a/packages/web-platform/web-tests/tests/web-elements/performance/raw-text-large.html b/packages/web-platform/web-tests/tests/web-elements/performance/raw-text-large.html index f7a2228704..58d28926de 100644 --- a/packages/web-platform/web-tests/tests/web-elements/performance/raw-text-large.html +++ b/packages/web-platform/web-tests/tests/web-elements/performance/raw-text-large.html @@ -20,7 +20,6 @@ rel="stylesheet" /> + + + + + + + diff --git a/packages/webpack/web-webpack-plugin/src/style/genStyleInfo.ts b/packages/webpack/web-webpack-plugin/src/style/genStyleInfo.ts index 9dd0cc6925..28bba7ff40 100644 --- a/packages/webpack/web-webpack-plugin/src/style/genStyleInfo.ts +++ b/packages/webpack/web-webpack-plugin/src/style/genStyleInfo.ts @@ -53,9 +53,10 @@ export function genStyleInfo( .toArray() as CSS.csstree.Selector[]; const groupedSelectors: CSSRule['sel'] = []; for (const selectorList of selectors) { - const plainSelectors: string[] = []; - const pseudoClassSelectors: string[] = []; - const pseudoElementSelectors: string[] = []; + let plainSelectors: string[] = []; + let pseudoClassSelectors: string[] = []; + let pseudoElementSelectors: string[] = []; + const currentSplittedSelectorInfo: string[][] = []; for (const selector of selectorList.children.toArray()) { if ( selector.type === 'PseudoClassSelector' @@ -65,25 +66,37 @@ export function genStyleInfo( * [aa]:root { * } * ===> - * [aa][lynx-card-id] { + * [aa][lynx-tag="page"] { * } */ - plainSelectors.push('[lynx-card-id]'); + plainSelectors.push('[lynx-tag="page"]'); } else if (selector.type === 'PseudoClassSelector') { pseudoClassSelectors.push(CSS.csstree.generate(selector)); } else if (selector.type === 'PseudoElementSelector') { pseudoElementSelectors.push(CSS.csstree.generate(selector)); } else if (selector.type === 'TypeSelector') { plainSelectors.push(`[lynx-tag="${selector.name}"]`); + } else if (selector.type === 'Combinator') { + currentSplittedSelectorInfo.push( + plainSelectors, + pseudoClassSelectors, + pseudoElementSelectors, + [CSS.csstree.generate(selector)], + ); + plainSelectors = []; + pseudoClassSelectors = []; + pseudoElementSelectors = []; } else { plainSelectors.push(CSS.csstree.generate(selector)); } } - groupedSelectors.push([ + currentSplittedSelectorInfo.push( plainSelectors, pseudoClassSelectors, pseudoElementSelectors, - ]); + [], + ); + groupedSelectors.push(currentSplittedSelectorInfo); } const decl = node.style.map<[string, string]>(( declaration, diff --git a/packages/webpack/web-webpack-plugin/src/type/StyleInfo.ts b/packages/webpack/web-webpack-plugin/src/type/StyleInfo.ts index 1bb63905c9..979718adad 100644 --- a/packages/webpack/web-webpack-plugin/src/type/StyleInfo.ts +++ b/packages/webpack/web-webpack-plugin/src/type/StyleInfo.ts @@ -4,11 +4,7 @@ // LICENSE file in the root directory of this source tree. export interface CSSRule { - sel: [ - plainSelectors: string[], - pseudoClassSelectors: string[], - pseudoElementSelectors: string[], - ][]; + sel: string[][][]; decl: [string, string][]; } export interface OneInfo { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0d10d787c0..db991b64b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -410,6 +410,9 @@ importers: '@lynx-js/web-webpack-plugin': specifier: workspace:* version: link:../../webpack/web-webpack-plugin + background-only: + specifier: ^0.0.1 + version: 0.0.1 devDependencies: '@lynx-js/react': specifier: workspace:* @@ -3740,6 +3743,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + background-only@0.0.1: + resolution: {integrity: sha512-YXR2zshAf3qs3jnpApQaDUG0x4L6YWpSZfLDhdeiCFxfp/n8YwfoAQ1hAigEF3VpXOMOJeZYFWtBbiFv/v2Qfg==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -11976,6 +11982,8 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.10) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.10) + background-only@0.0.1: {} + bail@2.0.2: {} balanced-match@1.0.2: {}