diff --git a/.github/actions/yarn-nm-install/action.yml b/.github/actions/yarn-nm-install/action.yml index 02851e1d4fd..67687ce2ee9 100644 --- a/.github/actions/yarn-nm-install/action.yml +++ b/.github/actions/yarn-nm-install/action.yml @@ -51,7 +51,7 @@ inputs: enable-corepack: description: 'Enable corepack' required: false - default: 'false' + default: 'true' skip-prisma-postinstall-generate: description: 'Avoid prisma to automatically generate schema on postinstall' required: false @@ -62,7 +62,9 @@ runs: steps: - name: ⚙️ Enable Corepack - if: ${{ inputs.enable-corepack }} == 'true' + # Booleans aren't booleans + # https://github.com/actions/runner/issues/2238 (https://github.com/actions/runner/issues/1483) + if: inputs.enable-corepack == 'true' shell: bash working-directory: ${{ inputs.cwd }} run: corepack enable diff --git a/apps/nextjs-app/src/components/avatar/TextAvatar.tsx b/apps/nextjs-app/src/components/avatar/TextAvatar.tsx index c775a0df810..964081fd96b 100644 --- a/apps/nextjs-app/src/components/avatar/TextAvatar.tsx +++ b/apps/nextjs-app/src/components/avatar/TextAvatar.tsx @@ -12,7 +12,7 @@ type Props = { const mapToFullName = (nameOrFullName: string | FullName): FullName => { if (typeof nameOrFullName === 'string') { - const [firstName, lastName] = nameOrFullName.split(' '); + const [firstName = 'F', lastName = 'L'] = nameOrFullName.split(' '); return { firstName, lastName, diff --git a/apps/nextjs-app/src/features/demo/blocks/jumbotron/Jumbotron.tsx b/apps/nextjs-app/src/features/demo/blocks/jumbotron/Jumbotron.tsx index 4be872f3f80..8eaf215aa02 100644 --- a/apps/nextjs-app/src/features/demo/blocks/jumbotron/Jumbotron.tsx +++ b/apps/nextjs-app/src/features/demo/blocks/jumbotron/Jumbotron.tsx @@ -75,13 +75,13 @@ const GradientText = styled.span` } `; -const titles: [string, GradientTextBackgrounds][] = [ +const titles = [ ['Typescript', 'sky'], ['React', 'orange'], ['Nextjs', 'violet'], ['Prisma', 'yellow'], ['Emotion', 'fun'], -]; +] satisfies [string, GradientTextBackgrounds][]; export const Jumbotron: FC = () => { const [count, setCount] = useState(0); @@ -104,7 +104,7 @@ export const Jumbotron: FC = () => { One of many possibles
made with {titles.map((title, idx) => { - const [label, grad] = titles[idx]; + const [label, grad] = title; const curr = idx === count; return ( { - const index = String(idx + 1).padStart(2, '0'); - return `/shared-assets/images/water/water-${index}.jpg`; -}); - -export const PoemGrid: FC<{ poems: SearchPoems; children?: never }> = ( - props -) => { +export const PoemGrid: FC<{ poems: SearchPoems }> = (props) => { const { poems } = props; - let images = waterImages; return (
{poems.map((poem) => { - const randomImg = ArrayUtils.getRandom(images); - const defaultImg = `/_next/image?url=${encodeURIComponent( - randomImg - )}&w=640&q=85`; - images = - images.length < 1 - ? waterImages - : ArrayUtils.removeItem(images, randomImg); - const unsplashImg = `https://source.unsplash.com/random/640x480?${( poem.keywords ?? [] ) @@ -42,7 +24,6 @@ export const PoemGrid: FC<{ poems: SearchPoems; children?: never }> = ( author={poem.author} keywords={poem.keywords} img={unsplashImg} - defaultImg={defaultImg} />
); diff --git a/apps/nextjs-app/src/pages/_document.tsx b/apps/nextjs-app/src/pages/_document.tsx index 09892da745e..c26cf5abd14 100644 --- a/apps/nextjs-app/src/pages/_document.tsx +++ b/apps/nextjs-app/src/pages/_document.tsx @@ -9,7 +9,7 @@ type Props = DocumentProps & { }; class MyDocument extends Document { - render() { + override render() { const locale = this.props.locale ?? defaultLocale; return ( diff --git a/packages/db-main-prisma/src/prisma-manager.ts b/packages/db-main-prisma/src/prisma-manager.ts index 20111a378c4..cd8d4e54e1e 100644 --- a/packages/db-main-prisma/src/prisma-manager.ts +++ b/packages/db-main-prisma/src/prisma-manager.ts @@ -32,7 +32,7 @@ export class PrismaManager { PrismaManager.instances ??= {}; PrismaManager.instances[instanceKey] = prismaClientFactory(); } - return PrismaManager.instances[instanceKey]; + return PrismaManager.instances[instanceKey] as PrismaClient; } else { // PrismaClient is attached to the `global` object in development to prevent // exhausting your database connection limit. @@ -43,7 +43,7 @@ export class PrismaManager { '[PrismaFactory.createDevSafeInstance]: Dev instance created and preserved globally.' ); } - return global.__PRISMA_INSTANCES__[instanceKey]; + return global.__PRISMA_INSTANCES__[instanceKey] as PrismaClient; } } } diff --git a/packages/ts-utils/src/array/ArrayUtils.ts b/packages/ts-utils/src/array/ArrayUtils.ts index 6de9d6d388e..bc4ec58d034 100644 --- a/packages/ts-utils/src/array/ArrayUtils.ts +++ b/packages/ts-utils/src/array/ArrayUtils.ts @@ -1,8 +1,10 @@ import { getRandomInt } from '../random/index'; +import type { NonEmptyArray } from '../types'; export class ArrayUtils { - static getRandom(items: T[]): T { - return items[getRandomInt(0, items.length - 1)]; + static getRandom(items: NonEmptyArray): T { + if (items.length === 1) return items[0]; + return items[getRandomInt(0, items.length - 1)] as unknown as T; } static removeItem(arr: T[], item: T): T[] { diff --git a/packages/ts-utils/src/array/__tests__/ArrayUtils.test.ts b/packages/ts-utils/src/array/__tests__/ArrayUtils.test.ts index 8442c3eb8c5..0bc5ab005e0 100644 --- a/packages/ts-utils/src/array/__tests__/ArrayUtils.test.ts +++ b/packages/ts-utils/src/array/__tests__/ArrayUtils.test.ts @@ -1,3 +1,4 @@ +import type { NonEmptyArray } from '../../types'; import { ArrayUtils } from '../ArrayUtils'; describe('ArrayUtils', () => { @@ -11,8 +12,8 @@ describe('ArrayUtils', () => { }); describe('getRandom', () => { it('should return different elements', () => { - const arr = ['cool', 'test', true, 0]; - const results: typeof arr = []; + const arr = ['cool', 'test', true, 0] satisfies NonEmptyArray; + const results: NonEmptyArray<(typeof arr)[number]> = [0]; const maxIterations = 20; for (let i = 0; i < maxIterations; i++) { results.push(ArrayUtils.getRandom(arr)); @@ -21,7 +22,7 @@ describe('ArrayUtils', () => { expect(unique.length).toBeGreaterThan(1); }); it('should always return an element from the array', () => { - const arr = ['cool', 'test', true, 0]; + const arr = ['cool', 'test', true, 0] satisfies NonEmptyArray; const maxIterations = 20; for (let i = 0; i < maxIterations; i++) { const el = ArrayUtils.getRandom(arr); diff --git a/packages/ts-utils/src/typeguards/typeguards.ts b/packages/ts-utils/src/typeguards/typeguards.ts index fec52971600..b4929bd9080 100644 --- a/packages/ts-utils/src/typeguards/typeguards.ts +++ b/packages/ts-utils/src/typeguards/typeguards.ts @@ -1,3 +1,5 @@ +import type { NonEmptyArray } from '../types'; + export type IsoDateString = string; export const isIsoDateString = (dateStr: unknown): dateStr is IsoDateString => { if ( @@ -14,6 +16,10 @@ export const isIsoDateString = (dateStr: unknown): dateStr is IsoDateString => { } }; +export const isNonEmptyArray = (v: unknown): v is NonEmptyArray => { + return Array.isArray(v) && v.length > 0; +}; + export const isNonEmptyString = (v: unknown, trim = true): v is string => { return typeof v === 'string' && (trim ? v.trim() : v).length > 0; }; diff --git a/packages/ts-utils/src/types/NonEmptyArray.ts b/packages/ts-utils/src/types/NonEmptyArray.ts new file mode 100644 index 00000000000..5ae448c0c96 --- /dev/null +++ b/packages/ts-utils/src/types/NonEmptyArray.ts @@ -0,0 +1 @@ +export type NonEmptyArray = [T, ...T[]]; diff --git a/packages/ts-utils/src/types/index.ts b/packages/ts-utils/src/types/index.ts index 9e107f44c86..72cce015c6d 100644 --- a/packages/ts-utils/src/types/index.ts +++ b/packages/ts-utils/src/types/index.ts @@ -1 +1,2 @@ export type { UnPromisify } from './Unpromisify'; +export type { NonEmptyArray } from './NonEmptyArray'; diff --git a/packages/ui-lib/src/ux/text/GradientText.stories.tsx b/packages/ui-lib/src/ux/text/GradientText.stories.tsx index 45a54f1c892..d2ecb5c1cab 100644 --- a/packages/ui-lib/src/ux/text/GradientText.stories.tsx +++ b/packages/ui-lib/src/ux/text/GradientText.stories.tsx @@ -64,7 +64,7 @@ export const AnimatedExample: StoryObj = { > Typescript {titles.map((title, idx) => { - const [label, grad] = titles[idx]; + const [label, grad] = title; const curr = idx === activeIdx; return (