From 60093f1a557349829e4d08fb36a0c71752ba8d37 Mon Sep 17 00:00:00 2001 From: Matheus Cardoso Date: Tue, 7 Jan 2025 11:52:15 -0300 Subject: [PATCH 1/3] chore(ssr): use subpath imports for validators --- eslint.config.mjs | 6 ++++ packages/@lwc/ssr-compiler/package.json | 3 ++ .../src/__tests__/estemplate.spec.ts | 8 ++--- .../src/compile-js/generate-markup.ts | 5 ++-- .../@lwc/ssr-compiler/src/compile-js/index.ts | 3 +- .../src/compile-js/stylesheet-scope-token.ts | 4 +-- .../@lwc/ssr-compiler/src/compile-js/wire.ts | 3 +- .../src/compile-template/index.ts | 3 +- .../src/compile-template/ir-to-es.ts | 4 +-- .../src/compile-template/shared.ts | 3 +- .../transformers/component/component.ts | 4 ++- .../transformers/component/lwc-component.ts | 2 +- .../transformers/component/slotted-content.ts | 3 +- .../compile-template/transformers/element.ts | 3 +- .../compile-template/transformers/for-each.ts | 3 +- .../compile-template/transformers/for-of.ts | 3 +- .../src/compile-template/transformers/slot.ts | 3 +- .../src/compile-template/transformers/text.ts | 3 +- packages/@lwc/ssr-compiler/src/estemplate.ts | 19 ++++++------ .../ssr-compiler/src/estree/validators.ts | 30 ++++++++++++++++--- packages/@lwc/ssr-compiler/tsconfig.json | 3 +- .../@lwc/template-compiler/src/parser/html.ts | 5 +++- .../tasks/check-and-rewrite-package-json.js | 4 ++- tsconfig.json | 5 ++-- 24 files changed, 90 insertions(+), 42 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index d4b3696eab..76451368bb 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -127,6 +127,12 @@ export default tseslint.config( message: 'Do not directly import runtime flags from @lwc/features. Use the global lwcRuntimeFlags variable instead.', }, + { + name: 'estree-toolkit', + importNames: ['is'], + message: + 'Do not import `is` from estree-toolkit directly. Import from #estree/validators instead.', + }, ], 'no-restricted-properties': [ 'error', diff --git a/packages/@lwc/ssr-compiler/package.json b/packages/@lwc/ssr-compiler/package.json index 5549c8a0d1..23aaf1e655 100644 --- a/packages/@lwc/ssr-compiler/package.json +++ b/packages/@lwc/ssr-compiler/package.json @@ -47,6 +47,9 @@ } } }, + "imports": { + "#estree/*": "./src/estree/*.js" + }, "dependencies": { "@babel/types": "7.26.3", "@lwc/shared": "8.12.3", diff --git a/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts b/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts index 58e67fee24..ffb71f142d 100644 --- a/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts +++ b/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts @@ -5,15 +5,11 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { is, builders as b } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { describe, test, expect } from 'vitest'; import { esTemplate, esTemplateWithYield } from '../estemplate'; import type { ClassDeclaration, FunctionDeclaration } from 'estree'; - -if (process.env.NODE_ENV !== 'production') { - // vitest seems to bypass the modifications we do in src/estree/validators.ts 🤷 - (is.identifier as any).__debugName = 'identifier'; -} +import { is } from '#estree/validators'; describe.each( Object.entries({ diff --git a/packages/@lwc/ssr-compiler/src/compile-js/generate-markup.ts b/packages/@lwc/ssr-compiler/src/compile-js/generate-markup.ts index 05f3f8720e..8b9031515d 100644 --- a/packages/@lwc/ssr-compiler/src/compile-js/generate-markup.ts +++ b/packages/@lwc/ssr-compiler/src/compile-js/generate-markup.ts @@ -6,13 +6,14 @@ */ import { parse as pathParse } from 'node:path'; -import { is, builders as b } from 'estree-toolkit'; -import { esTemplate } from '../estemplate'; +import { builders as b } from 'estree-toolkit'; import { bImportDeclaration } from '../estree/builders'; +import { esTemplate } from '../estemplate'; import { bWireAdaptersPlumbing } from './wire'; import type { Program, Statement, IfStatement } from 'estree'; import type { ComponentMetaState } from './types'; +import { is } from '#estree/validators'; const bGenerateMarkup = esTemplate` const publicFields = new Set(${/*public fields*/ is.arrayExpression}); diff --git a/packages/@lwc/ssr-compiler/src/compile-js/index.ts b/packages/@lwc/ssr-compiler/src/compile-js/index.ts index 431f91c209..1652697d0a 100644 --- a/packages/@lwc/ssr-compiler/src/compile-js/index.ts +++ b/packages/@lwc/ssr-compiler/src/compile-js/index.ts @@ -6,7 +6,7 @@ */ import { generate } from 'astring'; -import { traverse, builders as b, is } from 'estree-toolkit'; +import { traverse, builders as b } from 'estree-toolkit'; import { parseModule } from 'meriyah'; import { DecoratorErrors } from '@lwc/errors'; @@ -28,6 +28,7 @@ import type { } from 'estree'; import type { Visitors, ComponentMetaState } from './types'; import type { CompilationMode } from '@lwc/shared'; +import { is } from '#estree/validators'; const visitors: Visitors = { $: { scope: true }, diff --git a/packages/@lwc/ssr-compiler/src/compile-js/stylesheet-scope-token.ts b/packages/@lwc/ssr-compiler/src/compile-js/stylesheet-scope-token.ts index 54c4037a3b..e253db6609 100644 --- a/packages/@lwc/ssr-compiler/src/compile-js/stylesheet-scope-token.ts +++ b/packages/@lwc/ssr-compiler/src/compile-js/stylesheet-scope-token.ts @@ -5,11 +5,11 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { is } from 'estree-toolkit'; import { generateScopeTokens } from '@lwc/template-compiler'; -import { builders as b } from 'estree-toolkit/dist/builders'; +import { builders as b } from 'estree-toolkit'; import { esTemplate } from '../estemplate'; import type { ExpressionStatement, Program, VariableDeclaration } from 'estree'; +import { is } from '#estree/validators'; const bStylesheetTokenDeclaration = esTemplate` const stylesheetScopeToken = '${is.literal}'; diff --git a/packages/@lwc/ssr-compiler/src/compile-js/wire.ts b/packages/@lwc/ssr-compiler/src/compile-js/wire.ts index 189153e16e..25a575581d 100644 --- a/packages/@lwc/ssr-compiler/src/compile-js/wire.ts +++ b/packages/@lwc/ssr-compiler/src/compile-js/wire.ts @@ -5,7 +5,7 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { is, builders as b } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { produce } from 'immer'; import { DecoratorErrors } from '@lwc/errors'; import { esTemplate } from '../estemplate'; @@ -24,6 +24,7 @@ import type { BlockStatement, } from 'estree'; import type { ComponentMetaState, WireAdapter } from './types'; +import { is } from '#estree/validators'; interface NoSpreadObjectExpression extends Omit { properties: Property[]; diff --git a/packages/@lwc/ssr-compiler/src/compile-template/index.ts b/packages/@lwc/ssr-compiler/src/compile-template/index.ts index 392ab9c4dc..0e7ebb2a6a 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/index.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/index.ts @@ -6,7 +6,7 @@ */ import { generate } from 'astring'; -import { is, builders as b } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { parse, type Config as TemplateCompilerConfig } from '@lwc/template-compiler'; import { DiagnosticLevel } from '@lwc/errors'; import { esTemplate } from '../estemplate'; @@ -17,6 +17,7 @@ import { optimizeAdjacentYieldStmts } from './shared'; import { templateIrToEsTree } from './ir-to-es'; import type { ExportDefaultDeclaration as EsExportDefaultDeclaration } from 'estree'; import type { CompilationMode } from '@lwc/shared'; +import { is } from '#estree/validators'; // TODO [#4663]: Render mode mismatch between template and compiler should throw. const bExportTemplate = esTemplate` diff --git a/packages/@lwc/ssr-compiler/src/compile-template/ir-to-es.ts b/packages/@lwc/ssr-compiler/src/compile-template/ir-to-es.ts index 961df9d76b..462fac19d1 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/ir-to-es.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/ir-to-es.ts @@ -7,7 +7,7 @@ import { inspect } from 'util'; -import { is, builders as b } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { esTemplate } from '../estemplate'; import { Comment } from './transformers/comment'; import { Component, LwcComponent } from './transformers/component'; @@ -26,7 +26,7 @@ import type { } from '@lwc/template-compiler'; import type { Statement as EsStatement, ThrowStatement as EsThrowStatement } from 'estree'; import type { TemplateOpts, Transformer, TransformerContext } from './types'; - +import { is } from '#estree/validators'; const bThrowError = esTemplate` throw new Error(${is.literal}); `; diff --git a/packages/@lwc/ssr-compiler/src/compile-template/shared.ts b/packages/@lwc/ssr-compiler/src/compile-template/shared.ts index 53d15230b5..72a0307a94 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/shared.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/shared.ts @@ -5,7 +5,7 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { builders as b, is } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { normalizeStyleAttributeValue, StringReplace, StringTrim } from '@lwc/shared'; import { isValidES3Identifier } from '@babel/types'; import { expressionIrToEs } from './expression'; @@ -28,6 +28,7 @@ import type { Expression as IrExpression, Literal as IrLiteral, } from '@lwc/template-compiler'; +import { is } from '#estree/validators'; export function optimizeAdjacentYieldStmts(statements: EsStatement[]): EsStatement[] { let prevStmt: EsStatement | null = null; diff --git a/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/component.ts b/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/component.ts index c0d367fba3..2fabf6fccf 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/component.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/component.ts @@ -5,7 +5,8 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { builders as b, is } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; + import { kebabcaseToCamelcase, toPropertyName } from '@lwc/template-compiler'; import { getChildAttrsOrProps } from '../../shared'; import { esTemplateWithYield } from '../../../estemplate'; @@ -14,6 +15,7 @@ import { getSlottedContent } from './slotted-content'; import type { BlockStatement as EsBlockStatement } from 'estree'; import type { Component as IrComponent } from '@lwc/template-compiler'; import type { Transformer } from '../../types'; +import { is } from '#estree/validators'; const bYieldFromChildGenerator = esTemplateWithYield` { diff --git a/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/lwc-component.ts b/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/lwc-component.ts index a079c6521a..04bf4326db 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/lwc-component.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/lwc-component.ts @@ -4,7 +4,6 @@ * SPDX-License-Identifier: MIT * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { is } from 'estree-toolkit'; import { isUndefined } from '@lwc/shared'; import { expressionIrToEs } from '../../expression'; import { esTemplateWithYield } from '../../../estemplate'; @@ -16,6 +15,7 @@ import type { Expression as IrExpression, } from '@lwc/template-compiler'; import type { Statement as EsStatement } from 'estree'; +import { is } from '#estree/validators'; const bYieldFromDynamicComponentConstructorGenerator = esTemplateWithYield` const Ctor = '${/* lwcIs attribute value */ is.expression}'; diff --git a/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/slotted-content.ts b/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/slotted-content.ts index 62a47db98d..72480f8bd8 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/slotted-content.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/transformers/component/slotted-content.ts @@ -6,7 +6,7 @@ */ import { produce } from 'immer'; -import { builders as b, is } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { bAttributeValue, optimizeAdjacentYieldStmts } from '../../shared'; import { esTemplate, esTemplateWithYield } from '../../../estemplate'; import { irChildrenToEs, irToEs } from '../../ir-to-es'; @@ -34,6 +34,7 @@ import type { Slot as IrSlot, } from '@lwc/template-compiler'; import type { TransformerContext } from '../../types'; +import { is } from '#estree/validators'; const bGenerateSlottedContent = esTemplateWithYield` const shadowSlottedContent = ${/* hasShadowSlottedContent */ is.literal} diff --git a/packages/@lwc/ssr-compiler/src/compile-template/transformers/element.ts b/packages/@lwc/ssr-compiler/src/compile-template/transformers/element.ts index 84f8f8dfba..4518eabaa3 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/transformers/element.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/transformers/element.ts @@ -5,7 +5,7 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { builders as b, is } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { HTML_NAMESPACE, isBooleanAttribute, @@ -36,6 +36,7 @@ import type { IfStatement as EsIfStatement, } from 'estree'; import type { Transformer, TransformerContext } from '../types'; +import { is } from '#estree/validators'; const bYield = (expr: EsExpression) => b.expressionStatement(b.yieldExpression(expr)); diff --git a/packages/@lwc/ssr-compiler/src/compile-template/transformers/for-each.ts b/packages/@lwc/ssr-compiler/src/compile-template/transformers/for-each.ts index a4b3d53e2a..8a866fe38c 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/transformers/for-each.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/transformers/for-each.ts @@ -5,7 +5,7 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { builders as b, is } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { esTemplate } from '../../estemplate'; import { irChildrenToEs } from '../ir-to-es'; import { getScopedExpression, optimizeAdjacentYieldStmts } from '../shared'; @@ -13,6 +13,7 @@ import { getScopedExpression, optimizeAdjacentYieldStmts } from '../shared'; import type { ForEach as IrForEach } from '@lwc/template-compiler'; import type { Expression as EsExpression, ForOfStatement as EsForOfStatement } from 'estree'; import type { Transformer } from '../types'; +import { is } from '#estree/validators'; const bForOfYieldFrom = esTemplate` for (let [${is.identifier}, ${is.identifier}] of Object.entries(${is.expression} ?? {})) { diff --git a/packages/@lwc/ssr-compiler/src/compile-template/transformers/for-of.ts b/packages/@lwc/ssr-compiler/src/compile-template/transformers/for-of.ts index dea800f1fd..0146b002a2 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/transformers/for-of.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/transformers/for-of.ts @@ -5,7 +5,7 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { builders as b, is } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { esTemplate } from '../../estemplate'; import { irChildrenToEs } from '../ir-to-es'; import { optimizeAdjacentYieldStmts } from '../shared'; @@ -18,6 +18,7 @@ import type { MemberExpression as EsMemberExpression, } from 'estree'; import type { Transformer } from '../types'; +import { is } from '#estree/validators'; function getRootMemberExpression(node: EsMemberExpression): EsMemberExpression { return node.object.type === 'MemberExpression' ? getRootMemberExpression(node.object) : node; diff --git a/packages/@lwc/ssr-compiler/src/compile-template/transformers/slot.ts b/packages/@lwc/ssr-compiler/src/compile-template/transformers/slot.ts index ac404a0801..1d9a1e01fc 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/transformers/slot.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/transformers/slot.ts @@ -5,7 +5,7 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { is, builders as b } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { esTemplateWithYield } from '../../estemplate'; @@ -20,6 +20,7 @@ import type { Expression as EsExpression, } from 'estree'; import type { Transformer } from '../types'; +import { is } from '#estree/validators'; const bConditionalSlot = esTemplateWithYield` if (isLightDom) { diff --git a/packages/@lwc/ssr-compiler/src/compile-template/transformers/text.ts b/packages/@lwc/ssr-compiler/src/compile-template/transformers/text.ts index b4ec3694bf..9cf1b3cc6c 100644 --- a/packages/@lwc/ssr-compiler/src/compile-template/transformers/text.ts +++ b/packages/@lwc/ssr-compiler/src/compile-template/transformers/text.ts @@ -5,7 +5,7 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { builders as b, is } from 'estree-toolkit'; +import { builders as b } from 'estree-toolkit'; import { esTemplateWithYield } from '../../estemplate'; import { expressionIrToEs } from '../expression'; import { isLiteral } from '../shared'; @@ -17,6 +17,7 @@ import type { } from 'estree'; import type { Text as IrText } from '@lwc/template-compiler'; import type { Transformer } from '../types'; +import { is } from '#estree/validators'; const bBufferTextContent = esTemplateWithYield` didBufferTextContent = true; diff --git a/packages/@lwc/ssr-compiler/src/estemplate.ts b/packages/@lwc/ssr-compiler/src/estemplate.ts index 6df0148fa0..4f0eb2bf06 100644 --- a/packages/@lwc/ssr-compiler/src/estemplate.ts +++ b/packages/@lwc/ssr-compiler/src/estemplate.ts @@ -16,15 +16,11 @@ import type { Statement as EsStatement, } from 'estree'; import type { Checker } from 'estree-toolkit/dist/generated/is-type'; +import type { Validator } from './estree/validators'; /** Placeholder value to use to opt out of validation. */ const NO_VALIDATION = false; -/** A function that accepts a node and checks that it is a particular type of node. */ -type Validator = ( - node: EsNode | null | undefined -) => node is T; - /** * A pointer to a previous value in the template literal, indicating that the value should be re-used. * @see {@linkcode esTemplate} @@ -93,15 +89,20 @@ const getReplacementNode = ( : validateReplacement(replacementNode)) ) { const expectedType = - (validateReplacement as any).__debugName || - validateReplacement.name || - '(could not determine)'; + validateReplacement.__debugName || validateReplacement.name || '(could not determine)'; const actualType = Array.isArray(replacementNode) ? `[${replacementNode.map((n) => n && n.type).join(', ')}]` : replacementNode?.type; - throw new Error( + const error = new Error( `Validation failed for templated node. Expected type ${expectedType}, but received ${actualType}.` ); + + if (validateReplacement?.__stack) { + error.message += `\n\n${validateReplacement.__stack.split('\n').slice(1).join('\n')}`; + error.stack = validateReplacement.__stack; + } + + throw error; } return replacementNode; diff --git a/packages/@lwc/ssr-compiler/src/estree/validators.ts b/packages/@lwc/ssr-compiler/src/estree/validators.ts index 69fd7c813c..c5172103b9 100644 --- a/packages/@lwc/ssr-compiler/src/estree/validators.ts +++ b/packages/@lwc/ssr-compiler/src/estree/validators.ts @@ -5,11 +5,13 @@ * For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT */ -import { is } from 'estree-toolkit'; +/* eslint-disable-next-line no-restricted-imports -- This is the only place where we should be importing `is` from estree-toolkit. */ +import { is as _is } from 'estree-toolkit'; + import { entries } from '@lwc/shared'; import type { Checker } from 'estree-toolkit/dist/generated/is-type'; import type { Node } from 'estree-toolkit/dist/helpers'; // estree's `Node` is not compatible? - +import type { Node as EsNode } from 'estree'; /** A validator that returns `true` if the node is `null`. */ type NullableChecker = (node: Node | null | undefined) => node is T | null; @@ -26,9 +28,29 @@ export function isNullableOf(validator: Checker): NullableChe isNullableOf.__debugName = 'isNullableOf'; +/** A function that accepts a node and checks that it is a particular type of node. */ +export type Validator = { + (node: EsNode | null | undefined): node is T; + __debugName?: string; + __stack?: string; +}; + +const is: { + [K in keyof typeof _is]: (typeof _is)[K] & { __debugName?: string; __stack?: string }; +} = structuredClone(_is); + if (process.env.NODE_ENV !== 'production') { - // Modifying another package's exports is a code smell! for (const [key, val] of entries(is)) { - (val as any).__debugName = key; + val.__debugName = key; + Object.defineProperty(is, key, { + get: function get() { + const stack: { stack?: string } = {}; + Error.captureStackTrace(stack, get); + val.__stack = stack.stack; + return val; + }, + }); } } + +export { is }; diff --git a/packages/@lwc/ssr-compiler/tsconfig.json b/packages/@lwc/ssr-compiler/tsconfig.json index c96c4bc6c9..8b5e7741f0 100644 --- a/packages/@lwc/ssr-compiler/tsconfig.json +++ b/packages/@lwc/ssr-compiler/tsconfig.json @@ -1,7 +1,8 @@ { "extends": "../../../tsconfig.json", "compilerOptions": { - "types": ["rollup", "node"] + "types": ["rollup", "node"], + "rootDir": "src" }, "include": ["src/"] } diff --git a/packages/@lwc/template-compiler/src/parser/html.ts b/packages/@lwc/template-compiler/src/parser/html.ts index f7e563cec3..4fb1ea2555 100644 --- a/packages/@lwc/template-compiler/src/parser/html.ts +++ b/packages/@lwc/template-compiler/src/parser/html.ts @@ -36,7 +36,10 @@ function getLwcErrorFromParse5Error(ctx: ParserCtx, code: string) { } } -export function parseHTML(ctx: ParserCtx, source: string) { +export function parseHTML( + ctx: ParserCtx, + source: string +): parse5.DefaultTreeAdapterTypes.DocumentFragment { const onParseError = (err: parse5.ParserError) => { const { code, ...location } = err; diff --git a/scripts/tasks/check-and-rewrite-package-json.js b/scripts/tasks/check-and-rewrite-package-json.js index cf3c5e6fab..9819121374 100644 --- a/scripts/tasks/check-and-rewrite-package-json.js +++ b/scripts/tasks/check-and-rewrite-package-json.js @@ -47,7 +47,8 @@ for (const dir of globSync('./packages/@lwc/*')) { continue; } - const { name, description, version, dependencies, devDependencies, peerDependencies } = pkg; + const { name, description, version, dependencies, devDependencies, peerDependencies, imports } = + pkg; let { keywords } = pkg; // Keywords aren't really important, but keep any that already exist and add 'lwc' @@ -112,6 +113,7 @@ for (const dir of globSync('./packages/@lwc/*')) { extends: '../../../package.json', }, ...buildProps, + imports, dependencies, devDependencies, peerDependencies, diff --git a/tsconfig.json b/tsconfig.json index 2774c7162d..5aa78b6706 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,8 +6,9 @@ "declarationMap": true, "sourceMap": true, - "module": "commonjs", - "moduleResolution": "node", + "module": "ESNext", + "moduleResolution": "bundler", + "resolvePackageJsonImports": true, "esModuleInterop": true, "target": "es2021", From f1b304727d53e03bac1c42a7a4595aa11344f668 Mon Sep 17 00:00:00 2001 From: Matheus Cardoso Date: Tue, 7 Jan 2025 12:14:17 -0300 Subject: [PATCH 2/3] test: validator reports location --- packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts | 2 +- packages/@lwc/ssr-compiler/src/estemplate.ts | 2 +- packages/@lwc/ssr-compiler/src/estree/validators.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts b/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts index ffb71f142d..bb14971e0a 100644 --- a/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts +++ b/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts @@ -57,7 +57,7 @@ describe.each( `; const doReplacement = () => tmpl(b.literal('I am not an identifier') as any); expect(doReplacement).toThrow( - 'Validation failed for templated node. Expected type identifier, but received Literal.' + `Validation failed for templated node. Expected type identifier, but received Literal.\n at ${__filename}:56:32` ); }); }); diff --git a/packages/@lwc/ssr-compiler/src/estemplate.ts b/packages/@lwc/ssr-compiler/src/estemplate.ts index 4f0eb2bf06..fc42379c67 100644 --- a/packages/@lwc/ssr-compiler/src/estemplate.ts +++ b/packages/@lwc/ssr-compiler/src/estemplate.ts @@ -98,7 +98,7 @@ const getReplacementNode = ( ); if (validateReplacement?.__stack) { - error.message += `\n\n${validateReplacement.__stack.split('\n').slice(1).join('\n')}`; + error.message += `\n${validateReplacement.__stack.split('\n')[1]}`; error.stack = validateReplacement.__stack; } diff --git a/packages/@lwc/ssr-compiler/src/estree/validators.ts b/packages/@lwc/ssr-compiler/src/estree/validators.ts index c5172103b9..db2c9418a7 100644 --- a/packages/@lwc/ssr-compiler/src/estree/validators.ts +++ b/packages/@lwc/ssr-compiler/src/estree/validators.ts @@ -37,7 +37,7 @@ export type Validator = { const is: { [K in keyof typeof _is]: (typeof _is)[K] & { __debugName?: string; __stack?: string }; -} = structuredClone(_is); +} = { ..._is }; if (process.env.NODE_ENV !== 'production') { for (const [key, val] of entries(is)) { From 2c92781ff2a8d6a933449a3134d4af6ad080fbb6 Mon Sep 17 00:00:00 2001 From: Matheus Cardoso Date: Tue, 7 Jan 2025 13:23:45 -0300 Subject: [PATCH 3/3] Update packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts Co-authored-by: Will Harney <62956339+wjhsf@users.noreply.github.com> --- packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts b/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts index bb14971e0a..6c0fb23733 100644 --- a/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts +++ b/packages/@lwc/ssr-compiler/src/__tests__/estemplate.spec.ts @@ -57,7 +57,7 @@ describe.each( `; const doReplacement = () => tmpl(b.literal('I am not an identifier') as any); expect(doReplacement).toThrow( - `Validation failed for templated node. Expected type identifier, but received Literal.\n at ${__filename}:56:32` + /Validation failed for templated node. Expected type identifier, but received Literal./ ); }); });