From 166fb4f172ec27c86bd8f977c3b57a85200d3c46 Mon Sep 17 00:00:00 2001 From: bhumik Date: Fri, 21 Feb 2025 13:56:31 +0530 Subject: [PATCH 01/14] refactor: implement ts exactoptionalPropertyType rule --- config/tsconfig.base.json | 2 +- packages/blocks/src/blocks/core-audio.tsx | 2 +- packages/blocks/src/blocks/core-button.tsx | 4 +-- packages/blocks/src/blocks/core-buttons.tsx | 2 +- packages/blocks/src/blocks/core-code.tsx | 2 +- packages/blocks/src/blocks/core-column.tsx | 2 +- packages/blocks/src/blocks/core-columns.tsx | 2 +- packages/blocks/src/blocks/core-cover.tsx | 6 ++-- packages/blocks/src/blocks/core-details.tsx | 2 +- packages/blocks/src/blocks/core-file.tsx | 5 +-- packages/blocks/src/blocks/core-gallery.tsx | 2 +- packages/blocks/src/blocks/core-group.tsx | 2 +- packages/blocks/src/blocks/core-heading.tsx | 2 +- packages/blocks/src/blocks/core-image.tsx | 14 ++++++--- packages/blocks/src/blocks/core-list-item.tsx | 2 +- packages/blocks/src/blocks/core-list.tsx | 2 +- .../blocks/src/blocks/core-media-text.tsx | 6 ++-- packages/blocks/src/blocks/core-paragraph.tsx | 2 +- .../blocks/src/blocks/core-preformatted.tsx | 2 +- packages/blocks/src/blocks/core-pullquote.tsx | 3 +- packages/blocks/src/blocks/core-quote.tsx | 2 +- packages/blocks/src/blocks/core-spacer.tsx | 2 +- packages/blocks/src/blocks/core-verse.tsx | 2 +- packages/blocks/src/blocks/core-video.tsx | 4 +-- .../src/blocks/tests/core-audio.test.tsx | 1 + .../src/blocks/tests/core-button.test.tsx | 1 + .../core/src/config/snapwp-config-manager.ts | 31 ++++++++++++++----- packages/next/src/components/image.tsx | 2 +- packages/next/src/components/link.tsx | 7 ++--- .../next/src/components/script-module.tsx | 4 +-- packages/next/src/react-parser/options.tsx | 12 +++---- packages/next/src/template-renderer/index.tsx | 9 ++++-- .../template-renderer/template-scripts.tsx | 11 +++---- .../query/src/utils/parse-global-styles.ts | 6 ++-- packages/query/src/utils/parse-template.ts | 25 ++++++++------- 35 files changed, 105 insertions(+), 80 deletions(-) diff --git a/config/tsconfig.base.json b/config/tsconfig.base.json index 660b3dfc..72fa3a16 100644 --- a/config/tsconfig.base.json +++ b/config/tsconfig.base.json @@ -7,7 +7,7 @@ "allowSyntheticDefaultImports": true, "allowUnreachableCode": false, "allowUnusedLabels": false, - "exactOptionalPropertyTypes": false, // @todo Enable this. + "exactOptionalPropertyTypes": true, "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, "noImplicitReturns": true, diff --git a/packages/blocks/src/blocks/core-audio.tsx b/packages/blocks/src/blocks/core-audio.tsx index 8fc64696..28ef6d10 100644 --- a/packages/blocks/src/blocks/core-audio.tsx +++ b/packages/blocks/src/blocks/core-audio.tsx @@ -25,7 +25,7 @@ const CoreAudio: CoreAudioType = ( { return null; } - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; /** * @todo replace with cssClassName once it's supported. diff --git a/packages/blocks/src/blocks/core-button.tsx b/packages/blocks/src/blocks/core-button.tsx index c56674f1..726a7c1f 100644 --- a/packages/blocks/src/blocks/core-button.tsx +++ b/packages/blocks/src/blocks/core-button.tsx @@ -30,7 +30,7 @@ const CoreButton: CoreButtonType = ( { attributes }: CoreButtonProps ) => { } = attributes || {}; const classNames = cn( cssClassName ); - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; const { homeUrl, nextUrl } = getConfig(); const commonProps = { @@ -60,7 +60,7 @@ const CoreButton: CoreButtonType = ( { attributes }: CoreButtonProps ) => {
diff --git a/packages/blocks/src/blocks/core-buttons.tsx b/packages/blocks/src/blocks/core-buttons.tsx index d3af3184..9e90f050 100644 --- a/packages/blocks/src/blocks/core-buttons.tsx +++ b/packages/blocks/src/blocks/core-buttons.tsx @@ -21,7 +21,7 @@ const CoreButtons: CoreButtonsType = ( { const { cssClassName, style } = attributes || {}; const classNames = cn( cssClassName ); - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; return (
diff --git a/packages/blocks/src/blocks/core-code.tsx b/packages/blocks/src/blocks/core-code.tsx index 736c8a10..6a96b2d3 100644 --- a/packages/blocks/src/blocks/core-code.tsx +++ b/packages/blocks/src/blocks/core-code.tsx @@ -13,7 +13,7 @@ import type { CoreCode as CoreCodeType, CoreCodeProps } from '@snapwp/types'; */ const CoreCode: CoreCodeType = ( { attributes }: CoreCodeProps ) => { const { style, cssClassName, content } = attributes || {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; return (
diff --git a/packages/blocks/src/blocks/core-column.tsx b/packages/blocks/src/blocks/core-column.tsx
index 8d9af039..d4fc4e00 100644
--- a/packages/blocks/src/blocks/core-column.tsx
+++ b/packages/blocks/src/blocks/core-column.tsx
@@ -21,7 +21,7 @@ const CoreColumn: CoreColumnType = ( {
 	const { cssClassName, style, width } = attributes || {};
 
 	const classNames = cn( cssClassName );
-	const styleObject = getStylesFromAttributes( { style } );
+	const styleObject = style ? getStylesFromAttributes( { style } ) : {};
 
 	const combinedStyles: React.CSSProperties = {
 		...styleObject,
diff --git a/packages/blocks/src/blocks/core-columns.tsx b/packages/blocks/src/blocks/core-columns.tsx
index 59a677cf..d3ea277c 100644
--- a/packages/blocks/src/blocks/core-columns.tsx
+++ b/packages/blocks/src/blocks/core-columns.tsx
@@ -20,7 +20,7 @@ const CoreColumns: CoreColumnsType = ( {
 }: CoreColumnsProps ) => {
 	const { cssClassName, style } = attributes || {};
 
-	const styleObject = getStylesFromAttributes( { style } );
+	const styleObject = style ? getStylesFromAttributes( { style } ) : {};
 	const classNames = cn( cssClassName );
 
 	return (
diff --git a/packages/blocks/src/blocks/core-cover.tsx b/packages/blocks/src/blocks/core-cover.tsx
index 992db7f4..1c606bfc 100644
--- a/packages/blocks/src/blocks/core-cover.tsx
+++ b/packages/blocks/src/blocks/core-cover.tsx
@@ -93,7 +93,7 @@ const CoreCover: CoreCoverType = ( {
 	const isImgElement = ! ( hasParallax || isRepeated );
 
 	const styleObject = {
-		...getStylesFromAttributes( { style } ),
+		...( style ? getStylesFromAttributes( { style } ) : {} ),
 		minHeight: minHeight || undefined,
 	};
 
@@ -146,11 +146,13 @@ const CoreCover: CoreCoverType = ( {
 					{
 				) : (
 					
{ const { style, showContent, summary } = attributes ?? {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; /** * @todo replace with cssClassName once it's supported. diff --git a/packages/blocks/src/blocks/core-file.tsx b/packages/blocks/src/blocks/core-file.tsx index 68d93eb3..877a071e 100644 --- a/packages/blocks/src/blocks/core-file.tsx +++ b/packages/blocks/src/blocks/core-file.tsx @@ -45,7 +45,7 @@ const CoreFile: CoreFileType = ( { : ''; const classNames = cn( classNamesFromString ); - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; const ariaLabel = fileName || FALLBACK_ARIA_LABEL; const downloadText = downloadButtonText || FALLBACK_DOWNLOAD_BUTTON_TEXT; @@ -68,7 +68,7 @@ const CoreFile: CoreFileType = ( { { !! fileName && } @@ -78,6 +78,7 @@ const CoreFile: CoreFileType = ( { diff --git a/packages/blocks/src/blocks/core-gallery.tsx b/packages/blocks/src/blocks/core-gallery.tsx index c95f12aa..7f95c749 100644 --- a/packages/blocks/src/blocks/core-gallery.tsx +++ b/packages/blocks/src/blocks/core-gallery.tsx @@ -26,7 +26,7 @@ const CoreGallery: CoreGalleryType = ( { }: CoreGalleryProps ) => { const { caption, style } = attributes || {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; /** * @todo replace with cssClassName once it's supported. diff --git a/packages/blocks/src/blocks/core-group.tsx b/packages/blocks/src/blocks/core-group.tsx index efe66bc9..12ef65d0 100644 --- a/packages/blocks/src/blocks/core-group.tsx +++ b/packages/blocks/src/blocks/core-group.tsx @@ -46,7 +46,7 @@ const CoreGroup: CoreGroupType = ( { }: CoreGroupProps ) => { const { style, tagName } = attributes ?? {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; /** * @todo replace with cssClassName once it's supported. diff --git a/packages/blocks/src/blocks/core-heading.tsx b/packages/blocks/src/blocks/core-heading.tsx index 9c77fe26..b5d11c2f 100644 --- a/packages/blocks/src/blocks/core-heading.tsx +++ b/packages/blocks/src/blocks/core-heading.tsx @@ -17,7 +17,7 @@ import type { const CoreHeading: CoreHeadingType = ( { attributes }: CoreHeadingProps ) => { const { style, cssClassName, content, level } = attributes || {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; const HeadingTag = level ? ( `h${ level }` as keyof JSX.IntrinsicElements ) diff --git a/packages/blocks/src/blocks/core-image.tsx b/packages/blocks/src/blocks/core-image.tsx index d25de732..bf41c43c 100644 --- a/packages/blocks/src/blocks/core-image.tsx +++ b/packages/blocks/src/blocks/core-image.tsx @@ -55,7 +55,7 @@ const Figure = ( { { children } @@ -124,7 +124,7 @@ const CoreImage: CoreImageType = ( { return (
@@ -189,7 +189,7 @@ const getImageProps = ( sizeSlug, } = attributes || {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; const imageStyles: CSSProperties = { ...styleObject, @@ -198,10 +198,14 @@ const getImageProps = ( }; const imageProps: ComponentProps< typeof Image > = { - src: url, - alt, title, }; + if ( url ) { + imageProps.src = url; + } + if ( alt ) { + imageProps.alt = alt; + } if ( connectedMediaItem?.node ) { imageProps.sizes = connectedMediaItem.node.sizes; diff --git a/packages/blocks/src/blocks/core-list-item.tsx b/packages/blocks/src/blocks/core-list-item.tsx index 599c4f4d..9a97334e 100644 --- a/packages/blocks/src/blocks/core-list-item.tsx +++ b/packages/blocks/src/blocks/core-list-item.tsx @@ -27,7 +27,7 @@ const CoreListItem: CoreListItemType = ( { }: CoreListItemProps ) => { const { content, style } = attributes || {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; /** * @todo replace with cssClassName once it's supported. diff --git a/packages/blocks/src/blocks/core-list.tsx b/packages/blocks/src/blocks/core-list.tsx index 65860aab..02383096 100644 --- a/packages/blocks/src/blocks/core-list.tsx +++ b/packages/blocks/src/blocks/core-list.tsx @@ -19,7 +19,7 @@ const CoreList: CoreListType = ( { attributes, children }: CoreListProps ) => { const classNames = cn( cssClassName ); - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; const combinedStyles: React.CSSProperties = { ...styleObject, diff --git a/packages/blocks/src/blocks/core-media-text.tsx b/packages/blocks/src/blocks/core-media-text.tsx index 53fed709..dd09b232 100644 --- a/packages/blocks/src/blocks/core-media-text.tsx +++ b/packages/blocks/src/blocks/core-media-text.tsx @@ -110,7 +110,7 @@ const CoreMediaText: CoreMediaTextType = ( { { @@ -121,7 +121,7 @@ const CoreMediaText: CoreMediaTextType = ( { { image } @@ -138,7 +138,7 @@ const CoreMediaText: CoreMediaTextType = ( { ? getClassNamesFromString( renderedHtml ) : ''; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; let gridTemplateColumns; if ( mediaWidth !== DEFAULT_MEDIA_WIDTH ) { diff --git a/packages/blocks/src/blocks/core-paragraph.tsx b/packages/blocks/src/blocks/core-paragraph.tsx index d9a01bf2..4ed42d62 100644 --- a/packages/blocks/src/blocks/core-paragraph.tsx +++ b/packages/blocks/src/blocks/core-paragraph.tsx @@ -28,7 +28,7 @@ const CoreParagraph: CoreParagraphType = ( { textColor, } = attributes || {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; /** * Add missing styles to the style object diff --git a/packages/blocks/src/blocks/core-preformatted.tsx b/packages/blocks/src/blocks/core-preformatted.tsx index 61ecfe6c..61a3dd72 100644 --- a/packages/blocks/src/blocks/core-preformatted.tsx +++ b/packages/blocks/src/blocks/core-preformatted.tsx @@ -25,7 +25,7 @@ const CorePreformatted: CorePreformattedType = ( { }: CorePreformattedProps ) => { const { content, style } = attributes || {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; /** * @todo replace with cssClassName once it's supported. diff --git a/packages/blocks/src/blocks/core-pullquote.tsx b/packages/blocks/src/blocks/core-pullquote.tsx index 14a77bc1..524d7aac 100644 --- a/packages/blocks/src/blocks/core-pullquote.tsx +++ b/packages/blocks/src/blocks/core-pullquote.tsx @@ -25,8 +25,7 @@ const CorePullquote: CorePullquoteType = ( { }: CorePullquoteProps ) => { const { style, pullquoteValue, citation } = attributes || {}; - const styleObject = getStylesFromAttributes( { style } ); - + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; /** * @todo replace with cssClassName once it's supported. */ diff --git a/packages/blocks/src/blocks/core-quote.tsx b/packages/blocks/src/blocks/core-quote.tsx index b0fec182..41c45753 100644 --- a/packages/blocks/src/blocks/core-quote.tsx +++ b/packages/blocks/src/blocks/core-quote.tsx @@ -18,7 +18,7 @@ const CoreQuote: CoreQuoteType = ( { }: CoreQuoteProps ) => { const { style, citation, cssClassName } = attributes || {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; return (
diff --git a/packages/blocks/src/blocks/core-spacer.tsx b/packages/blocks/src/blocks/core-spacer.tsx index cd5ddc36..2963ba85 100644 --- a/packages/blocks/src/blocks/core-spacer.tsx +++ b/packages/blocks/src/blocks/core-spacer.tsx @@ -31,7 +31,7 @@ const CoreSpacer: CoreSpacerType = ( { const finalHeight = selfStretch === 'fill' || selfStretch === 'fit' ? undefined : height; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; const classNamesFromString = renderedHtml ? getClassNamesFromString( renderedHtml ) diff --git a/packages/blocks/src/blocks/core-verse.tsx b/packages/blocks/src/blocks/core-verse.tsx index cd650ee2..b87e3088 100644 --- a/packages/blocks/src/blocks/core-verse.tsx +++ b/packages/blocks/src/blocks/core-verse.tsx @@ -22,7 +22,7 @@ const CoreVerse: CoreVerseType = ( { }: CoreVerseProps ) => { const { style, content } = attributes ?? {}; - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; /** * @todo replace with cssClassName once it's supported. diff --git a/packages/blocks/src/blocks/core-video.tsx b/packages/blocks/src/blocks/core-video.tsx index 87114c2c..34c25db3 100644 --- a/packages/blocks/src/blocks/core-video.tsx +++ b/packages/blocks/src/blocks/core-video.tsx @@ -69,7 +69,7 @@ const CoreVideo: CoreVideoType = ( { return null; } - const styleObject = getStylesFromAttributes( { style } ); + const styleObject = style ? getStylesFromAttributes( { style } ) : {}; /** * @todo replace with cssClassName once it's supported. @@ -110,7 +110,7 @@ const CoreVideo: CoreVideoType = ( { src={ src } playsInline={ playsInline || undefined } > - + { caption && ( diff --git a/packages/blocks/src/blocks/tests/core-audio.test.tsx b/packages/blocks/src/blocks/tests/core-audio.test.tsx index d982e2f9..11251110 100644 --- a/packages/blocks/src/blocks/tests/core-audio.test.tsx +++ b/packages/blocks/src/blocks/tests/core-audio.test.tsx @@ -70,6 +70,7 @@ describe( 'CoreAudio', () => { }; const { container, asFragment } = render( + // @ts-ignore to test undefined props ); expect( container.firstChild ).toBeNull(); diff --git a/packages/blocks/src/blocks/tests/core-button.test.tsx b/packages/blocks/src/blocks/tests/core-button.test.tsx index 0b9c57cb..7011b1e6 100644 --- a/packages/blocks/src/blocks/tests/core-button.test.tsx +++ b/packages/blocks/src/blocks/tests/core-button.test.tsx @@ -210,6 +210,7 @@ describe( 'CoreButton Component', () => { test( 'renders with undefined attributes', () => { const { asFragment, container } = render( + //@ts-ignore to test undefined props ); const linkElement = container.querySelector( 'a' ); diff --git a/packages/core/src/config/snapwp-config-manager.ts b/packages/core/src/config/snapwp-config-manager.ts index 77aeeac8..d6285595 100644 --- a/packages/core/src/config/snapwp-config-manager.ts +++ b/packages/core/src/config/snapwp-config-manager.ts @@ -59,10 +59,7 @@ type ConfigSchema< T > = { }; }; -/** - * Default configuration. - */ -const defaultConfig: Partial< SnapWPEnv & SnapWPConfig > = { +const DEFAULTS = { graphqlEndpoint: 'index.php?graphql', uploadsDirectory: '/wp-content/uploads', restUrlPrefix: '/wp-json', @@ -71,6 +68,17 @@ const defaultConfig: Partial< SnapWPEnv & SnapWPConfig > = { useCorsProxy: process.env.NODE_ENV === 'development', }; +/** + * Default configuration. + */ +const defaultConfig: Partial< SnapWPEnv & SnapWPConfig > = { + graphqlEndpoint: DEFAULTS.graphqlEndpoint, + uploadsDirectory: DEFAULTS.uploadsDirectory, + restUrlPrefix: DEFAULTS.restUrlPrefix, + corsProxyPrefix: DEFAULTS.corsProxyPrefix, + useCorsProxy: DEFAULTS.useCorsProxy, +}; + /** * Get the configuration from environment variables. * @@ -78,15 +86,22 @@ const defaultConfig: Partial< SnapWPEnv & SnapWPConfig > = { * * @return The configuration object. */ +//@ts-ignore - ignore check for nextUrl,homeUrl to run missing environment variable test. const envConfig = (): Partial< SnapWPEnv > => ( { /* eslint-disable n/no-process-env */ nextUrl: process.env.NEXT_PUBLIC_URL, homeUrl: process.env.NEXT_PUBLIC_WORDPRESS_URL, - graphqlEndpoint: process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT, - uploadsDirectory: process.env.NEXT_PUBLIC_WORDPRESS_UPLOADS_PATH, - restUrlPrefix: process.env.NEXT_PUBLIC_WORDPRESS_REST_URL_PREFIX, + graphqlEndpoint: + process.env.NEXT_PUBLIC_GRAPHQL_ENDPOINT || DEFAULTS.graphqlEndpoint, + uploadsDirectory: + process.env.NEXT_PUBLIC_WORDPRESS_UPLOADS_PATH || + DEFAULTS.uploadsDirectory, + restUrlPrefix: + process.env.NEXT_PUBLIC_WORDPRESS_REST_URL_PREFIX || + DEFAULTS.restUrlPrefix, useCorsProxy: process.env.NEXT_PUBLIC_USE_CORS_PROXY === 'true', - corsProxyPrefix: process.env.NEXT_PUBLIC_CORS_PROXY_PREFIX, + corsProxyPrefix: + process.env.NEXT_PUBLIC_CORS_PROXY_PREFIX || DEFAULTS.corsProxyPrefix, /* eslint-enable n/no-process-env */ } ); diff --git a/packages/next/src/components/image.tsx b/packages/next/src/components/image.tsx index d32c8deb..4ca8ec01 100644 --- a/packages/next/src/components/image.tsx +++ b/packages/next/src/components/image.tsx @@ -151,7 +151,7 @@ export default function Image( { className={ cn( className, imageProps?.fill && 'object-cover' ) } src={ src } alt={ altText } - priority={ priority } + priority={ priority ?? false } /> ) : null; } diff --git a/packages/next/src/components/link.tsx b/packages/next/src/components/link.tsx index ce13528e..6c258a8d 100644 --- a/packages/next/src/components/link.tsx +++ b/packages/next/src/components/link.tsx @@ -1,6 +1,6 @@ import React, { - type AnchorHTMLAttributes, type CSSProperties, + type HTMLAttributes, type PropsWithChildren, } from 'react'; import { replaceHostUrl } from '@snapwp/core'; @@ -12,6 +12,7 @@ interface LinkInterface { style?: CSSProperties | undefined; className?: string | undefined; } +interface NavLinkProps extends LinkProps, HTMLAttributes< HTMLAnchorElement > {} /** * Link component to handle internal and external links. @@ -30,9 +31,7 @@ export default function Link( { className, children, ...props -}: PropsWithChildren< - LinkInterface & ( LinkProps | AnchorHTMLAttributes< HTMLAnchorElement > ) -> ) { +}: PropsWithChildren< LinkInterface & NavLinkProps > ) { const { homeUrl, nextUrl, graphqlEndpoint } = getConfig(); const internalUri = href diff --git a/packages/next/src/components/script-module.tsx b/packages/next/src/components/script-module.tsx index afb7e920..36b43dd1 100644 --- a/packages/next/src/components/script-module.tsx +++ b/packages/next/src/components/script-module.tsx @@ -65,7 +65,6 @@ export default function ScriptModule( { return (