Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Migrate the RTK package to be full ESM #3095

Merged
merged 7 commits into from
Jan 21, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/toolkit/jest.config.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module.exports = {
export default {
testEnvironment: 'jest-environment-jsdom',
setupFilesAfterEnv: ['./jest.setup.js'],
testMatch: ['<rootDir>/src/**/*.(spec|test).[jt]s?(x)'],
24 changes: 21 additions & 3 deletions packages/toolkit/package.json
Original file line number Diff line number Diff line change
@@ -22,10 +22,28 @@
"publishConfig": {
"access": "public"
},
"main": "dist/index.js",
"type": "module",
"module": "dist/redux-toolkit.modern.js",
"unpkg": "dist/redux-toolkit.umd.min.js",
"main": "dist/cjs/index.js",
"types": "dist/index.d.ts",
"exports": {
"./package.json": "./package.json",
".": {
"types": "./dist/index.d.ts",
"import": "./dist/redux-toolkit.modern.js",
"default": "./dist/cjs/index.js"
},
"./query": {
"types": "./dist/query/index.d.ts",
"import": "./dist/query/rtk-query.modern.js",
"default": "./dist/query/cjs/index.js"
},
"./query/react": {
"types": "./dist/query/react/index.d.ts",
"import": "./dist/query/react/rtk-query-react.modern.js",
"default": "./dist/query/react/cjs/index.js"
}
},
"devDependencies": {
"@microsoft/api-extractor": "^7.13.2",
"@size-limit/preset-small-lib": "^4.11.0",
@@ -101,7 +119,7 @@
"dependencies": {
"immer": "^9.0.16",
"redux": "^4.2.0",
"redux-thunk": "^2.4.2",
"redux-thunk": "3.0.0-alpha.1",
"reselect": "^4.1.7"
},
"peerDependencies": {
14 changes: 11 additions & 3 deletions packages/toolkit/query/package.json
Original file line number Diff line number Diff line change
@@ -2,10 +2,18 @@
"name": "@reduxjs/toolkit-query",
"version": "1.0.0",
"description": "",
"main": "../dist/query/index.js",
"type": "module",
"module": "../dist/query/rtk-query.modern.js",
"unpkg": "../dist/query/rtk-query.umd.min.js",
"types": "../dist/query/index.d.ts",
"main": "../dist/query/cjs/index.js",
"types": "./../dist/query/index.d.ts",
"exports": {
"./package.json": "./package.json",
".": {
"types": "./../dist/query/index.d.ts",
"import": "./../dist/query/rtk-query.modern.js",
"default": "./../dist/query/cjs/index.js"
}
},
"author": "Mark Erikson <mark@isquaredsoftware.com>",
"license": "MIT",
"sideEffects": false
14 changes: 11 additions & 3 deletions packages/toolkit/query/react/package.json
Original file line number Diff line number Diff line change
@@ -2,11 +2,19 @@
"name": "@reduxjs/toolkit-query-react",
"version": "1.0.0",
"description": "",
"main": "../../dist/query/react/index.js",
"type": "module",
"module": "../../dist/query/react/rtk-query-react.modern.js",
"unpkg": "../../dist/query/react/rtk-query-react.umd.min.js",
"main": "../../dist/query/react/cjs/index.js",
"types": "./../../dist/query/react/index.d.ts",
"exports": {
"./package.json": "./package.json",
".": {
"types": "./../../dist/query/react/index.d.ts",
"import": "./../../dist/query/react/rtk-query-react.modern.js",
"default": "./../../dist/query/react/cjs/index.js"
}
},
"author": "Mark Erikson <mark@isquaredsoftware.com>",
"license": "MIT",
"types": "../../dist/query/react/index.d.ts",
"sideEffects": false
}
85 changes: 54 additions & 31 deletions packages/toolkit/scripts/build.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
/* eslint-disable import/first */
import { fileURLToPath } from 'url'

// @ts-check
import { build } from 'esbuild'
import terser from 'terser'
import { minify as terserMinify } from 'terser'
import { rollup } from 'rollup'
import path from 'path'
import fs from 'fs-extra'
@@ -16,7 +18,9 @@ import { extractInlineSourcemap, removeInlineSourceMap } from './sourcemap'
import type { BuildOptions, EntryPointOptions } from './types'
import { appendInlineSourceMap, getLocation } from './sourcemap'

const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
// No __dirname under Node ESM
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

const { argv } = yargs(process.argv)
.option('local', {
@@ -36,55 +40,55 @@ const buildTargets: BuildOptions[] = [
{
format: 'cjs',
name: 'cjs.development',
target: 'es2018',
target: 'esnext',
minify: false,
env: 'development',
},
{
format: 'cjs',
name: 'cjs.production.min',
target: 'es2018',
target: 'esnext',
minify: true,
env: 'production',
},
// ESM, embedded `process`, ES2017 syntax: modern Webpack dev
{
format: 'esm',
name: 'modern',
target: 'es2018',
target: 'esnext',
minify: false,
env: '',
},
// ESM, pre-compiled "dev", ES2017 syntax: browser development
{
format: 'esm',
name: 'modern.development',
target: 'es2018',
target: 'esnext',
minify: false,
env: 'development',
},
// ESM, pre-compiled "prod", ES2017 syntax: browser prod
{
format: 'esm',
name: 'modern.production.min',
target: 'es2018',
minify: true,
env: 'production',
},
{
format: 'umd',
name: 'umd',
target: 'es2018',
minify: false,
env: 'development',
},
{
format: 'umd',
name: 'umd.min',
target: 'es2018',
target: 'esnext',
minify: true,
env: 'production',
},
// {
// format: 'umd',
// name: 'umd',
// target: 'es2018',
// minify: false,
// env: 'development',
// },
// {
// format: 'umd',
// name: 'umd.min',
// target: 'es2018',
// minify: true,
// env: 'production',
// },
]

const entryPoints: EntryPointOptions[] = [
@@ -118,6 +122,9 @@ const esVersionMappings = {
es2018: ts.ScriptTarget.ES2018,
es2019: ts.ScriptTarget.ES2019,
es2020: ts.ScriptTarget.ES2020,
es2021: ts.ScriptTarget.ES2021,
es2022: ts.ScriptTarget.ES2022,
esnext: ts.ScriptTarget.ESNext,
}

async function bundle(options: BuildOptions & EntryPointOptions) {
@@ -132,10 +139,23 @@ async function bundle(options: BuildOptions & EntryPointOptions) {
entryPoint,
} = options

const outputFolder = path.join('dist', folder)
const folderSegments = [outputDir, folder]

if (format === 'cjs') {
folderSegments.push('cjs')
}

const outputFolder = path.join(...folderSegments)
const outputFilename = `${prefix}.${name}.js`

await fs.ensureDir(outputFolder)

const outputFilePath = path.join(outputFolder, outputFilename)

if (format === 'cjs') {
await writeCommonJSEntry(outputFolder, prefix)
}

const result = await build({
entryPoints: [entryPoint],
outfile: outputFilePath,
@@ -212,7 +232,7 @@ async function bundle(options: BuildOptions & EntryPointOptions) {
let mapping: RawSourceMap = mergedSourcemap

if (minify) {
const transformResult = await terser.minify(
const transformResult = await terserMinify(
appendInlineSourceMap(code, mapping),
{
sourceMap: {
@@ -237,12 +257,14 @@ async function bundle(options: BuildOptions & EntryPointOptions) {
}

const relativePath = path.relative(process.cwd(), chunk.path)
console.log(`Build artifact: ${relativePath}, settings: `, {
target,
output: ts.ScriptTarget[esVersion],
})
await fs.writeFile(chunk.path, code)
await fs.writeJSON(chunk.path + '.map', mapping)

if (!chunk.path.includes('.map')) {
console.log(`Build artifact: ${relativePath}, settings: `, {
target,
})
}
}
}

@@ -279,16 +301,18 @@ async function buildUMD(
}

// Generates an index file to handle importing CJS dev/prod
async function writeEntry(folder: string, prefix: string) {
async function writeCommonJSEntry(folder: string, prefix: string) {
await fs.writeFile(
path.join('dist', folder, 'index.js'),
path.join(folder, 'index.js'),
`'use strict'
if (process.env.NODE_ENV === 'production') {
module.exports = require('./${prefix}.cjs.production.min.js')
} else {
module.exports = require('./${prefix}.cjs.development.js')
}`
)

await fs.writeFile(path.join(folder, 'package.json'), `{"type": "commonjs"}`)
}

interface BuildArgs {
@@ -313,14 +337,13 @@ async function main({ skipExtraction = false, local = false }: BuildArgs) {
})
)
await Promise.all(bundlePromises)
await writeEntry(folder, prefix)
}

// Run UMD builds after everything else so we don't have to sleep after each set
for (let entryPoint of entryPoints) {
const { folder } = entryPoint
const outputPath = path.join('dist', folder)
await buildUMD(outputPath, entryPoint.prefix, entryPoint.globalName)
// await buildUMD(outputPath, entryPoint.prefix, entryPoint.globalName)
}

if (!skipExtraction) {
9 changes: 8 additions & 1 deletion packages/toolkit/scripts/types.ts
Original file line number Diff line number Diff line change
@@ -11,7 +11,14 @@ export interface BuildOptions {
| 'umd.min'
minify: boolean
env: 'development' | 'production' | ''
target?: 'es2017' | 'es2018' | 'es2019' | 'es2020'
target?:
| 'es2017'
| 'es2018'
| 'es2019'
| 'es2020'
| 'es2021'
| 'es2022'
| 'esnext'
}

export interface EntryPointOptions {
4 changes: 2 additions & 2 deletions packages/toolkit/src/configureStore.ts
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@ const IS_PRODUCTION = process.env.NODE_ENV === 'production'
* @public
*/
export type ConfigureEnhancersCallback<E extends Enhancers = Enhancers> = (
defaultEnhancers: readonly StoreEnhancer[]
defaultEnhancers: readonly StoreEnhancer[]
) => [...E]

/**
@@ -107,7 +107,7 @@ type Enhancers = ReadonlyArray<StoreEnhancer>
export interface ToolkitStore<
S = any,
A extends Action = AnyAction,
M extends Middlewares<S> = Middlewares<S>,
M extends Middlewares<S> = Middlewares<S>
> extends Store<S, A> {
/**
* The `dispatch` method of your store, enhanced by all its middlewares.
2 changes: 1 addition & 1 deletion packages/toolkit/src/createReducer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Draft } from 'immer'
import createNextState, { isDraft, isDraftable } from 'immer'
import { produce as createNextState, isDraft, isDraftable } from 'immer'
import type { AnyAction, Action, Reducer } from 'redux'
import type { ActionReducerMapBuilder } from './mapBuilders'
import { executeReducerBuilderCallback } from './mapBuilders'
2 changes: 1 addition & 1 deletion packages/toolkit/src/entities/state_adapter.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import createNextState, { isDraft } from 'immer'
import { produce as createNextState, isDraft } from 'immer'
import type { EntityState, PreventAny } from './models'
import type { PayloadAction } from '../createAction'
import { isFSA } from '../createAction'
6 changes: 2 additions & 4 deletions packages/toolkit/src/getDefaultMiddleware.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Middleware, AnyAction } from 'redux'
import type { ThunkMiddleware } from 'redux-thunk'
import thunkMiddleware from 'redux-thunk'
import { thunk as thunkMiddleware, withExtraArgument } from 'redux-thunk'
import type { ImmutableStateInvariantMiddlewareOptions } from './immutableStateInvariantMiddleware'
/* PROD_START_REMOVE_UMD */
import { createImmutableStateInvariantMiddleware } from './immutableStateInvariantMiddleware'
@@ -88,9 +88,7 @@ export function getDefaultMiddleware<
if (isBoolean(thunk)) {
middlewareArray.push(thunkMiddleware)
} else {
middlewareArray.push(
thunkMiddleware.withExtraArgument(thunk.extraArgument)
)
middlewareArray.push(withExtraArgument(thunk.extraArgument))
}
}

Loading