Skip to content

Commit

Permalink
chore: Validate "exports" field in package.json (#5350)
Browse files Browse the repository at this point in the history
Co-authored-by: Dominik Dorfmeister <office@dorfmeister.cc>
  • Loading branch information
lachlancollins and TkDodo committed May 1, 2023
1 parent 5e43e00 commit f1ac845
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 47 deletions.
7 changes: 7 additions & 0 deletions packages/eslint-plugin-query/package.json
Expand Up @@ -11,6 +11,13 @@
"url": "https://github.com/sponsors/tannerlinsley"
},
"main": "build/lib/index.js",
"exports": {
".": {
"require": "./build/lib/index.js",
"default": "./build/lib/index.js"
},
"./package.json": "./package.json"
},
"scripts": {
"clean": "rimraf ./build",
"dev": "tsup --watch --sourcemap",
Expand Down
33 changes: 20 additions & 13 deletions packages/svelte-query/package.json
Expand Up @@ -2,24 +2,40 @@
"name": "@tanstack/svelte-query",
"version": "4.29.5",
"description": "Primitives for managing, caching and syncing asynchronous and remote data in Svelte",
"author": "Dre Johnson",
"author": "Lachlan Collins",
"license": "MIT",
"repository": "tanstack/query",
"homepage": "https://tanstack.com/query",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
},
"type": "module",
"types": "build/lib/index.d.ts",
"module": "build/lib/index.js",
"type": "module",
"svelte": "build/lib/index.js",
"exports": {
".": {
"types": "./build/lib/index.d.ts",
"import": "./build/lib/index.js",
"svelte": "./build/lib/index.js",
"default": "./build/lib/index.js"
},
"./package.json": "./package.json"
},
"files": [
"build/lib",
"src",
"!build/lib/__tests__",
"!src/__tests__"
],
"scripts": {
"clean": "rimraf ./build",
"test:types": "svelte-check --tsconfig ./tsconfig.json",
"test:eslint": "eslint --ext .svelte,.ts ./src",
"test:lib": "vitest run --coverage true",
"test:lib:dev": "vitest watch",
"build": "svelte-package --input ./src --output ./build/lib && rimraf ./build/lib/__tests__"
"build": "svelte-package --input ./src --output ./build/lib"
},
"devDependencies": {
"@sveltejs/package": "^2.0.2",
Expand All @@ -40,14 +56,5 @@
},
"peerDependencies": {
"svelte": "^3.54.0"
},
"exports": {
"./package.json": "./package.json",
".": "./build/lib/index.js"
},
"svelte": "./build/lib/index.js",
"files": [
"build/lib/*",
"src"
]
}
}
8 changes: 3 additions & 5 deletions packages/svelte-query/src/__tests__/CreateMutation.svelte
@@ -1,10 +1,8 @@
<script lang="ts">
import {
createMutation,
QueryClient,
type CreateMutationOptions,
} from '../index'
import { QueryClient } from '@tanstack/query-core'
import { setQueryClientContext } from '../context'
import { createMutation } from '../createMutation'
import type { CreateMutationOptions } from '../types'
export let options: CreateMutationOptions
Expand Down
3 changes: 2 additions & 1 deletion packages/svelte-query/src/__tests__/CreateQueries.svelte
@@ -1,6 +1,7 @@
<script lang="ts">
import { createQueries, QueryClient } from '../index'
import { QueryClient } from '@tanstack/query-core'
import { setQueryClientContext } from '../context'
import { createQueries } from '../createQueries'
import type { QueriesOptions } from '../createQueries'
export let options: readonly [...QueriesOptions<any>]
Expand Down
4 changes: 3 additions & 1 deletion packages/svelte-query/src/__tests__/CreateQuery.svelte
@@ -1,6 +1,8 @@
<script lang="ts">
import { createQuery, QueryClient, type CreateQueryOptions } from '../index'
import { QueryClient } from '@tanstack/query-core'
import { setQueryClientContext } from '../context'
import { createQuery } from '../createQuery'
import type { CreateQueryOptions } from '../types'
export let options: CreateQueryOptions
Expand Down
13 changes: 6 additions & 7 deletions packages/svelte-query/src/__tests__/createMutation.test.ts
@@ -1,24 +1,23 @@
import { describe, it, expect, vi } from 'vitest'
import { fireEvent, render, screen } from '@testing-library/svelte'
import { fireEvent, render, waitFor } from '@testing-library/svelte'
import CreateMutation from './CreateMutation.svelte'
import { sleep } from './utils'

describe('createMutation', () => {
it('Call mutate and check function runs', async () => {
const mutationFn = vi.fn()

render(CreateMutation, {
const rendered = render(CreateMutation, {
props: {
options: {
mutationFn,
},
},
})

fireEvent.click(screen.getByRole('button'))
fireEvent.click(rendered.getByRole('button'))

await sleep(20)

expect(mutationFn).toHaveBeenCalledTimes(1)
await waitFor(() => {
expect(mutationFn).toHaveBeenCalledTimes(1)
})
})
})
18 changes: 10 additions & 8 deletions packages/svelte-query/src/__tests__/createQueries.test.ts
@@ -1,11 +1,11 @@
import { describe, it, expect } from 'vitest'
import { render, screen } from '@testing-library/svelte'
import { render, waitFor } from '@testing-library/svelte'
import CreateQueries from './CreateQueries.svelte'
import { sleep } from './utils'

describe('createQueries', () => {
it('Render and wait for success', async () => {
render(CreateQueries, {
const rendered = render(CreateQueries, {
props: {
options: [
{
Expand All @@ -26,12 +26,14 @@ describe('createQueries', () => {
},
})

expect(screen.queryByText('Success 1')).not.toBeInTheDocument()
expect(screen.queryByText('Success 2')).not.toBeInTheDocument()

await sleep(20)
await waitFor(() => {
expect(rendered.queryByText('Success 1')).not.toBeInTheDocument()
expect(rendered.queryByText('Success 2')).not.toBeInTheDocument()
})

expect(screen.queryByText('Success 1')).toBeInTheDocument()
expect(screen.queryByText('Success 2')).toBeInTheDocument()
await waitFor(() => {
expect(rendered.queryByText('Success 1')).toBeInTheDocument()
expect(rendered.queryByText('Success 2')).toBeInTheDocument()
})
})
})
24 changes: 22 additions & 2 deletions scripts/config.ts
Expand Up @@ -3,57 +3,77 @@ import type { BranchConfig, Package } from './types'

// TODO: List your npm packages here. The first package will be used as the versioner.
export const packages: Package[] = [
{ name: '@tanstack/query-core', packageDir: 'query-core', srcDir: 'src' },
{
name: '@tanstack/query-core',
packageDir: 'query-core',
srcDir: 'src',
entries: ['main', 'module', 'types'],
},
{
name: '@tanstack/query-persist-client-core',
packageDir: 'query-persist-client-core',
srcDir: 'src',
entries: ['main', 'module', 'types'],
},
{
name: '@tanstack/query-async-storage-persister',
packageDir: 'query-async-storage-persister',
srcDir: 'src',
entries: ['main', 'module', 'types'],
},
{
name: '@tanstack/query-broadcast-client-experimental',
packageDir: 'query-broadcast-client-experimental',
srcDir: 'src',
entries: ['main', 'module', 'types'],
},
{
name: '@tanstack/query-sync-storage-persister',
packageDir: 'query-sync-storage-persister',
srcDir: 'src',
entries: ['main', 'module', 'types'],
},
{
name: '@tanstack/react-query',
packageDir: 'react-query',
srcDir: 'src',
entries: ['main', 'module', 'types'],
},
{ name: '@tanstack/react-query', packageDir: 'react-query', srcDir: 'src' },
{
name: '@tanstack/react-query-devtools',
packageDir: 'react-query-devtools',
srcDir: 'src',
entries: ['main', 'module', 'types'],
},
{
name: '@tanstack/react-query-persist-client',
packageDir: 'react-query-persist-client',
srcDir: 'src',
entries: ['main', 'module', 'types'],
},
{
name: '@tanstack/solid-query',
packageDir: 'solid-query',
srcDir: 'src',
entries: ['main', 'module', 'types'],
},
{
name: '@tanstack/svelte-query',
packageDir: 'svelte-query',
srcDir: 'src',
entries: ['module', 'svelte', 'types'],
},
{
name: '@tanstack/vue-query',
packageDir: 'vue-query',
srcDir: 'src',
entries: ['main', 'module', 'types'],
},
{
name: '@tanstack/eslint-plugin-query',
packageDir: 'eslint-plugin-query',
srcDir: 'src',
entries: ['main'],
},
]

Expand Down
1 change: 1 addition & 0 deletions scripts/types.ts
Expand Up @@ -38,6 +38,7 @@ export type Package = {
name: string
packageDir: string
srcDir: string
entries: Array<'main' | 'module' | 'svelte' | 'types'>
}

export type BranchConfig = {
Expand Down
34 changes: 24 additions & 10 deletions scripts/validate-packages.ts
Expand Up @@ -15,18 +15,11 @@ async function run() {
path.resolve(rootDir, 'packages', pkg.packageDir, 'package.json'),
)

const entries =
pkg.name === '@tanstack/eslint-plugin-query'
? (['main'] as const)
: pkg.name === '@tanstack/svelte-query'
? (['types', 'module'] as const)
: (['main', 'types', 'module'] as const)

await Promise.all(
entries.map(async (entryKey) => {
const entry = pkgJson[entryKey] as string
pkg.entries.map(async (entryKey) => {
const entry = pkgJson[entryKey] as unknown

if (!entry) {
if (typeof entry !== 'string') {
throw new Error(
`Missing entry for "${entryKey}" in ${pkg.packageDir}/package.json!`,
)
Expand All @@ -46,6 +39,27 @@ async function run() {
}
}),
)

const defaultExport = pkgJson.exports?.['.']?.['default'] as unknown

if (typeof defaultExport !== 'string') {
throw new Error(
`Missing exports['.']['default'] in ${pkg.packageDir}/package.json!`,
)
}

const filePath = path.resolve(
rootDir,
'packages',
pkg.packageDir,
defaultExport,
)

try {
await fsp.access(filePath)
} catch (err) {
failedValidations.push(`Missing build file: ${filePath}`)
}
}),
)
console.info('')
Expand Down

0 comments on commit f1ac845

Please sign in to comment.