Skip to content
Open
Show file tree
Hide file tree
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
5 changes: 5 additions & 0 deletions .changeset/fix-process-not-defined.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/table-core': patch
---

Guard process.env.NODE_ENV checks with typeof to prevent ReferenceError in non-bundled environments
6 changes: 3 additions & 3 deletions packages/table-core/src/core/column.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
RowData,
ColumnDefResolved,
} from '../types'
import { getMemoOptions, memo } from '../utils'
import { getMemoOptions, isDev, memo } from '../utils'

export interface CoreColumn<TData extends RowData, TValue> {
/**
Expand Down Expand Up @@ -100,7 +100,7 @@ export function createColumn<TData extends RowData, TValue>(

for (const key of accessorKey.split('.')) {
result = result?.[key]
if (process.env.NODE_ENV !== 'production' && result === undefined) {
if (isDev() && result === undefined) {
console.warn(
`"${key}" in deeply nested key "${accessorKey}" returned undefined.`,
)
Expand All @@ -116,7 +116,7 @@ export function createColumn<TData extends RowData, TValue>(
}

if (!id) {
if (process.env.NODE_ENV !== 'production') {
if (isDev()) {
throw new Error(
resolvedColumnDef.accessorFn
? `Columns require an id when using an accessorFn`
Expand Down
8 changes: 4 additions & 4 deletions packages/table-core/src/core/table.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { functionalUpdate, getMemoOptions, memo, RequiredKeys } from '../utils'
import { functionalUpdate, getMemoOptions, isDev, memo, RequiredKeys } from '../utils'

import {
Updater,
Expand Down Expand Up @@ -284,7 +284,7 @@ export function createTable<TData extends RowData>(
options: TableOptionsResolved<TData>,
): Table<TData> {
if (
process.env.NODE_ENV !== 'production' &&
isDev() &&
(options.debugAll || options.debugTable)
) {
console.info('Creating Table Instance...')
Expand Down Expand Up @@ -399,7 +399,7 @@ export function createTable<TData extends RowData>(
if (!row) {
row = table.getCoreRowModel().rowsById[id]
if (!row) {
if (process.env.NODE_ENV !== 'production') {
if (isDev()) {
throw new Error(`getRow could not find row with ID: ${id}`)
}
throw new Error()
Expand Down Expand Up @@ -510,7 +510,7 @@ export function createTable<TData extends RowData>(
getColumn: (columnId) => {
const column = table._getAllFlatColumnsById()[columnId]

if (process.env.NODE_ENV !== 'production' && !column) {
if (isDev() && !column) {
console.error(`[Table] Column with id '${columnId}' does not exist.`)
}

Expand Down
14 changes: 13 additions & 1 deletion packages/table-core/src/utils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
import { TableOptionsResolved, TableState, Updater } from './types'

/**
* Safely checks if we are in a non-production (development) environment.
* Guards against `process` not being defined in environments like
* vanilla JS loaded via importmaps without a bundler (e.g. Rails, browser ESM).
*/
export function isDev(): boolean {
return (
typeof process !== 'undefined' &&
process.env?.NODE_ENV !== 'production'
)
}

export type PartialKeys<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
export type RequiredKeys<T, K extends keyof T> = Omit<T, K> &
Required<Pick<T, K>>
Expand Down Expand Up @@ -213,7 +225,7 @@ export function getMemoOptions(
) {
return {
debug: () => tableOptions?.debugAll ?? tableOptions[debugLevel],
key: process.env.NODE_ENV === 'development' && key,
key: isDev() && key,
onChange,
}
}
4 changes: 2 additions & 2 deletions packages/table-core/src/utils/getFilteredRowModel.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ResolvedColumnFilter } from '../features/ColumnFiltering'
import { Table, RowModel, Row, RowData } from '../types'
import { getMemoOptions, memo } from '../utils'
import { getMemoOptions, isDev, memo } from '../utils'
import { filterRows } from './filterRowsUtils'

export function getFilteredRowModel<TData extends RowData>(): (
Expand Down Expand Up @@ -38,7 +38,7 @@ export function getFilteredRowModel<TData extends RowData>(): (
const filterFn = column.getFilterFn()

if (!filterFn) {
if (process.env.NODE_ENV !== 'production') {
if (isDev()) {
console.warn(
`Could not find a valid 'column.filterFn' for column with the ID: ${column.id}.`,
)
Expand Down