diff --git a/Makefile b/Makefile index e380f98f71e..408ad2b9311 100644 --- a/Makefile +++ b/Makefile @@ -181,4 +181,4 @@ check-documentation-videos-format: ## Check the documentation format ./scripts/check-documentation-videos-format.sh release: ## Start the release process and publish the packages to npm using lerna - ./scripts/release.sh \ No newline at end of file + ./scripts/release.sh diff --git a/eslint.config.mjs b/eslint.config.mjs index 6168d394d1e..ef2527a5c96 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -86,7 +86,14 @@ export default defineConfig([ { name: 'lodash', message: - "Named import from lodash should be avoided for performance reasons. Use a default import instead. E.g. `import merge from 'lodash/merge';` instead of `import { merge } from 'lodash';`.", + "Named import from lodash should be avoided for performance reasons. Use a default import instead. E.g. `import merge from 'lodash/merge.js';` (note the file extension) instead of `import { merge } from 'lodash';`.", + }, + ], + patterns: [ + { + regex: 'lodash/(?![a-zA-Z]*\\.js$)', + message: + 'Always specify the file extension when importing from lodash or it will cause runtime issues for ESM environments.', }, ], }, diff --git a/examples/crm/package.json b/examples/crm/package.json index 7d24b6ce764..8e6a0f718b7 100644 --- a/examples/crm/package.json +++ b/examples/crm/package.json @@ -4,6 +4,7 @@ "private": true, "type": "module", "dependencies": { + "@faker-js/faker": "^10.0.0", "@hello-pangea/dnd": "^16.3.0", "@mui/icons-material": "^5.16.12", "@mui/material": "^5.16.12", @@ -11,7 +12,6 @@ "@nivo/core": "^0.80.0", "clsx": "^2.1.1", "date-fns": "^3.6.0", - "faker": "~5.4.0", "fakerest": "4.1.3", "lodash": "~4.17.5", "papaparse": "^5.4.1", @@ -28,7 +28,6 @@ "@testing-library/jest-dom": "^6.4.5", "@testing-library/react": "^15.0.7", "@testing-library/user-event": "^14.5.2", - "@types/faker": "^5.1.7", "@types/jest": "^29.5.2", "@types/jsonexport": "^3.0.5", "@types/lodash": "~4.14.168", diff --git a/examples/crm/src/deals/DealListContent.tsx b/examples/crm/src/deals/DealListContent.tsx index 460fe3700e7..1b498fd3f0c 100644 --- a/examples/crm/src/deals/DealListContent.tsx +++ b/examples/crm/src/deals/DealListContent.tsx @@ -1,6 +1,6 @@ import { DragDropContext, OnDragEndResponder } from '@hello-pangea/dnd'; import { Box } from '@mui/material'; -import isEqual from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual.js'; import { useEffect, useState } from 'react'; import { DataProvider, useDataProvider, useListContext } from 'react-admin'; diff --git a/examples/crm/src/providers/fakerest/dataGenerator/companies.ts b/examples/crm/src/providers/fakerest/dataGenerator/companies.ts index 6b8a2ff7311..ed9081fcfec 100644 --- a/examples/crm/src/providers/fakerest/dataGenerator/companies.ts +++ b/examples/crm/src/providers/fakerest/dataGenerator/companies.ts @@ -1,11 +1,4 @@ -import { - address, - company, - internet, - lorem, - phone, - random, -} from 'faker/locale/en_US'; +import { faker } from '@faker-js/faker'; import { randomDate } from './utils'; import { defaultCompanySectors } from '../../../root/defaultConfiguration'; @@ -18,35 +11,42 @@ const regex = /\W+/; export const generateCompanies = (db: Db): Required[] => { return Array.from(Array(55).keys()).map(id => { - const name = company.companyName(); + const name = faker.company.name(); return { id, name: name, logo: { - title: lorem.text(1), + title: faker.lorem.text(), src: `./logos/${id}.png`, } as RAFile, - sector: random.arrayElement(defaultCompanySectors), - size: random.arrayElement(sizes) as 1 | 10 | 50 | 250 | 500, + sector: faker.helpers.arrayElement(defaultCompanySectors), + size: faker.helpers.arrayElement(sizes) as 1 | 10 | 50 | 250 | 500, linkedin_url: `https://www.linkedin.com/company/${name .toLowerCase() .replace(regex, '_')}`, - website: internet.url(), - phone_number: phone.phoneNumber(), - address: address.streetAddress(), - zipcode: address.zipCode(), - city: address.city(), - stateAbbr: address.stateAbbr(), + website: faker.internet.url(), + phone_number: faker.phone.number(), + address: faker.location.streetAddress(), + zipcode: faker.location.zipCode(), + city: faker.location.city(), + stateAbbr: faker.location.state({ abbreviated: true }), nb_contacts: 0, nb_deals: 0, // at least 1/3rd of companies for Jane Doe sales_id: - random.number(2) === 0 ? 0 : random.arrayElement(db.sales).id, + faker.number.int(2) === 0 + ? 0 + : faker.helpers.arrayElement(db.sales).id, created_at: randomDate().toISOString(), - description: lorem.paragraph(), - revenue: random.arrayElement(['$1M', '$10M', '$100M', '$1B']), - tax_identifier: random.alphaNumeric(10), - country: random.arrayElement(['USA', 'France', 'UK']), + description: faker.lorem.paragraph(), + revenue: faker.helpers.arrayElement([ + '$1M', + '$10M', + '$100M', + '$1B', + ]), + tax_identifier: faker.string.alphanumeric({ length: 10 }), + country: faker.helpers.arrayElement(['USA', 'France', 'UK']), context_links: [], }; }); diff --git a/examples/crm/src/providers/fakerest/dataGenerator/contactNotes.ts b/examples/crm/src/providers/fakerest/dataGenerator/contactNotes.ts index 4ca68192d8a..a95548e3b31 100644 --- a/examples/crm/src/providers/fakerest/dataGenerator/contactNotes.ts +++ b/examples/crm/src/providers/fakerest/dataGenerator/contactNotes.ts @@ -1,4 +1,4 @@ -import { lorem, random } from 'faker/locale/en_US'; +import { faker } from '@faker-js/faker'; import { defaultNoteStatuses } from '../../../root/defaultConfiguration'; import { ContactNote } from '../../../types'; @@ -7,7 +7,7 @@ import { randomDate } from './utils'; export const generateContactNotes = (db: Db): ContactNote[] => { return Array.from(Array(1200).keys()).map(id => { - const contact = random.arrayElement(db.contacts); + const contact = faker.helpers.arrayElement(db.contacts); const date = randomDate(new Date(contact.first_seen)); contact.last_seen = date > new Date(contact.last_seen) @@ -16,10 +16,10 @@ export const generateContactNotes = (db: Db): ContactNote[] => { return { id, contact_id: contact.id, - text: lorem.paragraphs(random.number({ min: 1, max: 4 })), + text: faker.lorem.paragraphs(faker.number.int({ min: 1, max: 4 })), date: date.toISOString(), sales_id: contact.sales_id, - status: random.arrayElement(defaultNoteStatuses).value, + status: faker.helpers.arrayElement(defaultNoteStatuses).value, }; }); }; diff --git a/examples/crm/src/providers/fakerest/dataGenerator/contacts.ts b/examples/crm/src/providers/fakerest/dataGenerator/contacts.ts index 6c6c460fc9f..e2b668493f5 100644 --- a/examples/crm/src/providers/fakerest/dataGenerator/contacts.ts +++ b/examples/crm/src/providers/fakerest/dataGenerator/contacts.ts @@ -1,11 +1,4 @@ -import { - company as fakerCompany, - internet, - lorem, - name, - phone, - random, -} from 'faker/locale/en_US'; +import { faker } from '@faker-js/faker'; import { defaultContactGender, @@ -30,10 +23,13 @@ export const generateContacts = (db: Db): Required[] => { return Array.from(Array(500).keys()).map(id => { const has_avatar = weightedBoolean(25) && numberOfContacts < nbAvailblePictures; - const gender = random.arrayElement(defaultContactGender).value; - const first_name = name.firstName(gender as any); - const last_name = name.lastName(); - const email = internet.email(first_name, last_name); + const gender = faker.helpers.arrayElement(defaultContactGender).value; + const first_name = faker.person.firstName(gender as any); + const last_name = faker.person.lastName(); + const email = faker.internet.email({ + firstName: first_name, + lastName: last_name, + }); const avatar = { src: has_avatar ? 'https://marmelab.com/posters/avatar-' + @@ -41,7 +37,7 @@ export const generateContacts = (db: Db): Required[] => { '.jpeg' : undefined, }; - const title = fakerCompany.bsAdjective(); + const title = faker.company.buzzAdjective(); if (has_avatar) { numberOfContacts++; @@ -50,7 +46,7 @@ export const generateContacts = (db: Db): Required[] => { // choose company with people left to know let company: Required; do { - company = random.arrayElement(db.companies); + company = faker.helpers.arrayElement(db.companies); } while (company.nb_contacts >= maxContacts[company.size]); company.nb_contacts++; @@ -68,19 +64,22 @@ export const generateContacts = (db: Db): Required[] => { company_id: company.id, company_name: company.name, email, - phone_1_number: phone.phoneNumber(), - phone_1_type: random.arrayElement(['Work', 'Home', 'Other']), - phone_2_number: phone.phoneNumber(), - phone_2_type: random.arrayElement(['Work', 'Home', 'Other']), - background: lorem.sentence(), - acquisition: random.arrayElement(['inbound', 'outbound']), + phone_1_number: faker.phone.number(), + phone_1_type: faker.helpers.arrayElement(['Work', 'Home', 'Other']), + phone_2_number: faker.phone.number(), + phone_2_type: faker.helpers.arrayElement(['Work', 'Home', 'Other']), + background: faker.lorem.sentence(), + acquisition: faker.helpers.arrayElement(['inbound', 'outbound']), avatar, first_seen: first_seen, last_seen: last_seen, has_newsletter: weightedBoolean(30), - status: random.arrayElement(defaultNoteStatuses).value, - tags: random - .arrayElements(db.tags, random.arrayElement([0, 0, 0, 1, 1, 2])) + status: faker.helpers.arrayElement(defaultNoteStatuses).value, + tags: faker.helpers + .arrayElements( + db.tags, + faker.helpers.arrayElement([0, 0, 0, 1, 1, 2]) + ) .map(tag => tag.id), // finalize sales_id: company.sales_id, nb_tasks: 0, diff --git a/examples/crm/src/providers/fakerest/dataGenerator/dealNotes.ts b/examples/crm/src/providers/fakerest/dataGenerator/dealNotes.ts index 62ea798944c..a719088c407 100644 --- a/examples/crm/src/providers/fakerest/dataGenerator/dealNotes.ts +++ b/examples/crm/src/providers/fakerest/dataGenerator/dealNotes.ts @@ -1,15 +1,15 @@ -import { random, lorem } from 'faker/locale/en_US'; +import { faker } from '@faker-js/faker'; import { Db } from './types'; import { randomDate } from './utils'; export const generateDealNotes = (db: Db) => { return Array.from(Array(300).keys()).map(id => { - const deal = random.arrayElement(db.deals); + const deal = faker.helpers.arrayElement(db.deals); return { id, deal_id: deal.id, - text: lorem.paragraphs(random.number({ min: 1, max: 4 })), + text: faker.lorem.paragraphs(faker.number.int({ min: 1, max: 4 })), date: randomDate( new Date(db.deals[deal.id as number].created_at) ).toISOString(), diff --git a/examples/crm/src/providers/fakerest/dataGenerator/deals.ts b/examples/crm/src/providers/fakerest/dataGenerator/deals.ts index 6dc68725c4e..7b39596140a 100644 --- a/examples/crm/src/providers/fakerest/dataGenerator/deals.ts +++ b/examples/crm/src/providers/fakerest/dataGenerator/deals.ts @@ -1,5 +1,5 @@ import { add } from 'date-fns'; -import { lorem, random } from 'faker/locale/en_US'; +import { faker } from '@faker-js/faker'; import { defaultDealCategories, @@ -11,13 +11,13 @@ import { randomDate } from './utils'; export const generateDeals = (db: Db): Deal[] => { const deals = Array.from(Array(50).keys()).map(id => { - const company = random.arrayElement(db.companies); + const company = faker.helpers.arrayElement(db.companies); company.nb_deals++; - const contacts = random.arrayElements( + const contacts = faker.helpers.arrayElements( db.contacts.filter(contact => contact.company_id === company.id), - random.number({ min: 1, max: 3 }) + faker.number.int({ min: 1, max: 3 }) ); - const lowercaseName = lorem.words(); + const lowercaseName = faker.lorem.words(); const created_at = randomDate( new Date(company.created_at) ).toISOString(); @@ -32,10 +32,12 @@ export const generateDeals = (db: Db): Deal[] => { name: lowercaseName[0].toUpperCase() + lowercaseName.slice(1), company_id: company.id, contact_ids: contacts.map(contact => contact.id), - category: random.arrayElement(defaultDealCategories), - stage: random.arrayElement(defaultDealStages).value, - description: lorem.paragraphs(random.number({ min: 1, max: 4 })), - amount: random.number(1000) * 100, + category: faker.helpers.arrayElement(defaultDealCategories), + stage: faker.helpers.arrayElement(defaultDealStages).value, + description: faker.lorem.paragraphs( + faker.number.int({ min: 1, max: 4 }) + ), + amount: faker.number.int(1000) * 100, created_at, updated_at: randomDate(new Date(created_at)).toISOString(), expected_closing_date, diff --git a/examples/crm/src/providers/fakerest/dataGenerator/sales.ts b/examples/crm/src/providers/fakerest/dataGenerator/sales.ts index d51df94ecdc..88cb6c2dd3e 100644 --- a/examples/crm/src/providers/fakerest/dataGenerator/sales.ts +++ b/examples/crm/src/providers/fakerest/dataGenerator/sales.ts @@ -1,13 +1,16 @@ -import { internet, name } from 'faker/locale/en_US'; +import { faker } from '@faker-js/faker'; import { RAFile, Sale } from '../../../types'; import { Db } from './types'; export const generateSales = (_: Db): Sale[] => { const randomSales = Array.from(Array(5).keys()).map(id => { - const first_name = name.firstName(); - const last_name = name.lastName(); - const email = internet.email(first_name, last_name); + const first_name = faker.person.firstName(); + const last_name = faker.person.lastName(); + const email = faker.internet.email({ + firstName: first_name, + lastName: last_name, + }); return { id: id + 1, diff --git a/examples/crm/src/providers/fakerest/dataGenerator/tasks.ts b/examples/crm/src/providers/fakerest/dataGenerator/tasks.ts index e7ce318a013..19d5a046c17 100644 --- a/examples/crm/src/providers/fakerest/dataGenerator/tasks.ts +++ b/examples/crm/src/providers/fakerest/dataGenerator/tasks.ts @@ -1,4 +1,4 @@ -import { lorem, random } from 'faker/locale/en_US'; +import { faker } from '@faker-js/faker'; import { defaultTaskTypes } from '../../../root/defaultConfiguration'; import { Task } from '../../../types'; @@ -37,15 +37,17 @@ export const type: TaskType[] = [ export const generateTasks = (db: Db) => { return Array.from(Array(400).keys()).map(id => { - const contact = random.arrayElement(db.contacts); + const contact = faker.helpers.arrayElement(db.contacts); contact.nb_tasks++; return { id, contact_id: contact.id, - type: random.arrayElement(defaultTaskTypes), - text: lorem.sentence(), + type: faker.helpers.arrayElement(defaultTaskTypes), + text: faker.lorem.sentence(), due_date: randomDate( - random.boolean() ? new Date() : new Date(contact.first_seen), + faker.datatype.boolean() + ? new Date() + : new Date(contact.first_seen), new Date(Date.now() + 100 * 24 * 60 * 60 * 1000) ).toISOString(), done_date: undefined, diff --git a/examples/crm/src/providers/fakerest/dataGenerator/utils.ts b/examples/crm/src/providers/fakerest/dataGenerator/utils.ts index 41f5bdf1ad4..0e5cff86369 100644 --- a/examples/crm/src/providers/fakerest/dataGenerator/utils.ts +++ b/examples/crm/src/providers/fakerest/dataGenerator/utils.ts @@ -1,7 +1,7 @@ -import faker from 'faker/locale/en'; +import { faker } from '@faker-js/faker'; export const weightedArrayElement = (values: any[], weights: any) => - faker.random.arrayElement( + faker.helpers.arrayElement( values.reduce( (acc, value, index) => acc.concat(new Array(weights[index]).fill(value)), @@ -10,7 +10,7 @@ export const weightedArrayElement = (values: any[], weights: any) => ); export const weightedBoolean = (likelyhood: number) => - faker.random.number(99) < likelyhood; + faker.number.int(99) < likelyhood; export const randomDate = (minDate?: Date, maxDate?: Date) => { const minTs = @@ -19,11 +19,11 @@ export const randomDate = (minDate?: Date, maxDate?: Date) => { : Date.now() - 5 * 365 * 24 * 60 * 60 * 1000; // 5 years const maxTs = maxDate instanceof Date ? maxDate.getTime() : Date.now(); const range = maxTs - minTs; - const randomRange = faker.random.number({ max: range }); + const randomRange = faker.number.int({ max: range }); // move it more towards today to account for traffic increase const ts = Math.sqrt(randomRange / range) * range; return new Date(minTs + ts); }; export const randomFloat = (min: number, max: number) => - parseFloat(faker.random.number({ min, max, precision: 0.01 }).toFixed(2)); + parseFloat(faker.number.float({ min, max, fractionDigits: 2 }).toFixed(2)); diff --git a/examples/crm/src/providers/fakerest/internal/transformOrFilter.ts b/examples/crm/src/providers/fakerest/internal/transformOrFilter.ts index f79bffd5063..b89b13faf06 100644 --- a/examples/crm/src/providers/fakerest/internal/transformOrFilter.ts +++ b/examples/crm/src/providers/fakerest/internal/transformOrFilter.ts @@ -1,4 +1,4 @@ -import isObject from 'lodash/isObject'; +import isObject from 'lodash/isObject.js'; // @or filter is an equivaluent of fakerest `q=` export function transformOrFilter(values: any) { diff --git a/examples/data-generator/package.json b/examples/data-generator/package.json index fa81b8b89c8..dc5d71a77a3 100644 --- a/examples/data-generator/package.json +++ b/examples/data-generator/package.json @@ -4,27 +4,35 @@ "homepage": "https://github.com/marmelab/react-admin/tree/master/examples/data-generator", "bugs": "https://github.com/marmelab/react-admin/issues", "license": "MIT", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { - "date-fns": "^3.6.0", - "faker": "^4.1.0" + "@faker-js/faker": "^10.0.0", + "date-fns": "^3.6.0" }, "devDependencies": { - "cross-env": "^5.2.0", "ra-core": "^5.12.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "peerDependencies": { "ra-core": "^5.0.0" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "files": [ + "dist" + ], + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/examples/data-generator/src/customers.ts b/examples/data-generator/src/customers.ts index 4aba849031f..0f9af212988 100644 --- a/examples/data-generator/src/customers.ts +++ b/examples/data-generator/src/customers.ts @@ -1,4 +1,4 @@ -import { date, name, internet, address } from 'faker/locale/en'; +import { faker } from '@faker-js/faker'; import { randomDate, weightedBoolean } from './utils'; @@ -12,10 +12,13 @@ export const generateCustomers = (): Customer[] => { const last_seen = randomDate(first_seen); const has_ordered = weightedBoolean(25) && numberOfCustomers < maxCustomers; - const first_name = name.firstName(); - const last_name = name.lastName(); - const email = internet.email(first_name, last_name); - const birthday = has_ordered ? date.past(60) : null; + const first_name = faker.person.firstName(); + const last_name = faker.person.lastName(); + const email = faker.internet.email({ + firstName: first_name, + lastName: last_name, + }); + const birthday = has_ordered ? faker.date.recent({ days: 60 }) : null; const avatar = has_ordered ? 'https://marmelab.com/posters/avatar-' + numberOfCustomers + @@ -31,10 +34,12 @@ export const generateCustomers = (): Customer[] => { first_name, last_name, email, - address: has_ordered ? address.streetAddress() : null, - zipcode: has_ordered ? address.zipCode() : null, - city: has_ordered ? address.city() : null, - stateAbbr: has_ordered ? address.stateAbbr() : null, + address: has_ordered ? faker.location.streetAddress() : null, + zipcode: has_ordered ? faker.location.zipCode() : null, + city: has_ordered ? faker.location.city() : null, + stateAbbr: has_ordered + ? faker.location.state({ abbreviated: true }) + : null, avatar, birthday: birthday ? birthday.toISOString() : null, first_seen: first_seen.toISOString(), diff --git a/examples/data-generator/src/orders.ts b/examples/data-generator/src/orders.ts index bb0aae9529e..09f3032d98c 100644 --- a/examples/data-generator/src/orders.ts +++ b/examples/data-generator/src/orders.ts @@ -1,4 +1,4 @@ -import { random } from 'faker/locale/en'; +import { faker } from '@faker-js/faker'; import { isAfter, subDays } from 'date-fns'; import { @@ -23,7 +23,7 @@ export const generateOrders = (db: Db): Order[] => { const basket = Array.from(Array(nbProducts).keys()).map(() => { let product_id; do { - product_id = random.number({ + product_id = faker.number.int({ min: 0, max: 10 * 13 - 1, }); @@ -46,20 +46,24 @@ export const generateOrders = (db: Db): Order[] => { ); const delivery_fees = randomFloat(3, 8); - const tax_rate = random.arrayElement([0.12, 0.17, 0.2]); + const tax_rate = faker.helpers.arrayElement([0.12, 0.17, 0.2]); const taxes = parseFloat( ((total_ex_taxes + delivery_fees) * tax_rate).toFixed(2) ); - const customer = random.arrayElement(realCustomers); + const customer = faker.helpers.arrayElement(realCustomers); const date = randomDate(customer.first_seen, customer.last_seen); const status: OrderStatus = - isAfter(date, aMonthAgo) && random.boolean() + isAfter(date, aMonthAgo) && faker.datatype.boolean() ? 'ordered' : weightedArrayElement(['delivered', 'cancelled'], [10, 1]); return { id, - reference: random.alphaNumeric(6).toUpperCase(), + reference: faker.string + .alphanumeric({ + length: 8, + }) + .toUpperCase(), date: date.toISOString(), customer_id: customer.id, basket: basket, diff --git a/examples/data-generator/src/products.ts b/examples/data-generator/src/products.ts index d4cfe80d850..b08bcef4dd6 100644 --- a/examples/data-generator/src/products.ts +++ b/examples/data-generator/src/products.ts @@ -1,4 +1,4 @@ -import { random, lorem } from 'faker/locale/en'; +import { faker } from '@faker-js/faker'; import { randomFloat, weightedBoolean } from './utils'; import type { Db } from './types'; @@ -195,10 +195,10 @@ export const generateProducts = (db: Db): Product[] => { '-' + (index + 1) + '.jpeg', - description: lorem.paragraph(), + description: faker.lorem.paragraph(), stock: weightedBoolean(10) ? 0 - : random.number({ min: 0, max: 150 }), + : faker.number.int({ min: 0, max: 150 }), sales: 0, }; }), diff --git a/examples/data-generator/src/reviews.ts b/examples/data-generator/src/reviews.ts index 8935898b792..f3e4235274e 100644 --- a/examples/data-generator/src/reviews.ts +++ b/examples/data-generator/src/reviews.ts @@ -1,4 +1,4 @@ -import { random, lorem } from 'faker/locale/en'; +import { faker } from '@faker-js/faker'; import { subDays, isAfter } from 'date-fns'; import { randomDate, weightedArrayElement, weightedBoolean } from './utils'; @@ -40,12 +40,12 @@ export const generateReviews = (db: Db): Review[] => { order_id: order.id, product_id: product.product_id, customer_id: order.customer_id, - rating: random.number({ min: 1, max: 5 }), + rating: faker.number.int({ min: 1, max: 5 }), comment: Array.apply( null, - Array(random.number({ min: 1, max: 5 })) + Array(faker.number.int({ min: 1, max: 5 })) ) - .map(() => lorem.sentences()) + .map(() => faker.lorem.sentences()) .join('\n \r'), }; }), diff --git a/examples/data-generator/src/utils.ts b/examples/data-generator/src/utils.ts index 412c5736c80..48b230f6a8f 100644 --- a/examples/data-generator/src/utils.ts +++ b/examples/data-generator/src/utils.ts @@ -1,7 +1,7 @@ -import faker from 'faker/locale/en'; +import { faker } from '@faker-js/faker'; export const weightedArrayElement = (values: T[], weights): T => - faker.random.arrayElement( + faker.helpers.arrayElement( values.reduce( (acc, value, index) => acc.concat(new Array(weights[index]).fill(value)), @@ -9,8 +9,7 @@ export const weightedArrayElement = (values: T[], weights): T => ) ); -export const weightedBoolean = likelyhood => - faker.random.number(99) < likelyhood; +export const weightedBoolean = likelyhood => faker.number.int(99) < likelyhood; export const randomDate = ( minDate?: Date | string, @@ -30,11 +29,11 @@ export const randomDate = ( : Date.now(); const range = maxTs - minTs; - const randomRange = faker.random.number({ max: range }); + const randomRange = faker.number.int({ max: range }); // move it more towards today to account for traffic increase const ts = Math.sqrt(randomRange / range) * range; return new Date(minTs + ts); }; export const randomFloat = (min, max) => - parseFloat(faker.random.number({ min, max, precision: 0.01 }).toFixed(2)); + parseFloat(faker.number.float({ min, max, fractionDigits: 2 }).toFixed(2)); diff --git a/examples/data-generator/tsconfig.json b/examples/data-generator/tsconfig.json index 04f238f9657..aa84324d168 100644 --- a/examples/data-generator/tsconfig.json +++ b/examples/data-generator/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "declaration": true, "declarationMap": true, diff --git a/examples/simple/src/dataProvider.tsx b/examples/simple/src/dataProvider.tsx index 1d5c913f408..362c22eac92 100644 --- a/examples/simple/src/dataProvider.tsx +++ b/examples/simple/src/dataProvider.tsx @@ -1,6 +1,6 @@ import fakeRestProvider from 'ra-data-fakerest'; import { DataProvider, withLifecycleCallbacks, HttpError } from 'react-admin'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import addUploadFeature from './addUploadFeature'; import { queryClient } from './queryClient'; import data from './data'; diff --git a/examples/simple/src/posts/PostList.tsx b/examples/simple/src/posts/PostList.tsx index da45ed8e72c..e3ed7b979cd 100644 --- a/examples/simple/src/posts/PostList.tsx +++ b/examples/simple/src/posts/PostList.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import BookIcon from '@mui/icons-material/Book'; import { Chip, useMediaQuery } from '@mui/material'; import { Theme } from '@mui/material/styles'; -import lodashGet from 'lodash/get'; +import lodashGet from 'lodash/get.js'; import jsonExport from 'jsonexport/dist'; import { BooleanField, diff --git a/jest.config.js b/jest.config.js index 83942a5f39d..c0ace515f73 100644 --- a/jest.config.js +++ b/jest.config.js @@ -25,7 +25,7 @@ module.exports = { '/packages/create-react-admin/templates', ], transformIgnorePatterns: [ - '[/\\\\]node_modules[/\\\\](?!(@hookform|react-hotkeys-hook)/).+\\.(js|jsx|mjs|ts|tsx)$', + '[/\\\\]node_modules[/\\\\](?!(@hookform|react-hotkeys-hook|@faker-js/faker)/).+\\.(js|jsx|mjs|ts|tsx)$', ], transform: { // '^.+\\.[tj]sx?$' to process js/ts with `ts-jest` diff --git a/packages/ra-core/package.json b/packages/ra-core/package.json index 3cd6824479c..2a2ec81f01c 100644 --- a/packages/ra-core/package.json +++ b/packages/ra-core/package.json @@ -8,9 +8,18 @@ "src", "codemods" ], - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, "sideEffects": false, "authors": [ "François Zaninotto", @@ -21,10 +30,7 @@ "bugs": "https://github.com/marmelab/react-admin/issues", "license": "MIT", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "devDependencies": { "@hookform/resolvers": "^3.2.0", @@ -36,7 +42,6 @@ "@types/node": "^20.10.7", "@types/node-polyglot": "^0.4.31", "@types/react": "^18.3.3", - "cross-env": "^5.2.0", "echarts": "^5.6.0", "expect": "^27.4.6", "ignore-styles": "~5.0.1", @@ -46,10 +51,10 @@ "react-hook-form": "^7.53.0", "react-router": "^6.28.1", "react-router-dom": "^6.28.1", - "rimraf": "^3.0.2", "typescript": "^5.1.3", "yup": "^0.32.11", - "zod": "^3.22.1" + "zod": "^3.22.1", + "zshy": "^0.4.4" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", diff --git a/packages/ra-core/src/controller/field/useReferenceArrayFieldController.ts b/packages/ra-core/src/controller/field/useReferenceArrayFieldController.ts index a657a681ba1..655e1a096b8 100644 --- a/packages/ra-core/src/controller/field/useReferenceArrayFieldController.ts +++ b/packages/ra-core/src/controller/field/useReferenceArrayFieldController.ts @@ -1,4 +1,4 @@ -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { RaRecord, SortPayload } from '../../types'; import { useGetManyAggregate } from '../../dataProvider'; import { ListControllerResult, useList } from '../list'; diff --git a/packages/ra-core/src/controller/field/useReferenceManyFieldController.ts b/packages/ra-core/src/controller/field/useReferenceManyFieldController.ts index 66495665d4b..513c11728ce 100644 --- a/packages/ra-core/src/controller/field/useReferenceManyFieldController.ts +++ b/packages/ra-core/src/controller/field/useReferenceManyFieldController.ts @@ -1,8 +1,8 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { useQueryClient, UseQueryOptions } from '@tanstack/react-query'; -import get from 'lodash/get'; -import isEqual from 'lodash/isEqual'; -import lodashDebounce from 'lodash/debounce'; +import get from 'lodash/get.js'; +import isEqual from 'lodash/isEqual.js'; +import lodashDebounce from 'lodash/debounce.js'; import { removeEmpty, useEvent } from '../../util'; import { useDataProvider, useGetManyReference } from '../../dataProvider'; diff --git a/packages/ra-core/src/controller/field/useReferenceOneFieldController.tsx b/packages/ra-core/src/controller/field/useReferenceOneFieldController.tsx index 7a17987637a..8912505ffa5 100644 --- a/packages/ra-core/src/controller/field/useReferenceOneFieldController.tsx +++ b/packages/ra-core/src/controller/field/useReferenceOneFieldController.tsx @@ -1,4 +1,4 @@ -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { UseQueryOptions } from '@tanstack/react-query'; import { useRecordContext } from '../record'; diff --git a/packages/ra-core/src/controller/input/useReferenceParams.ts b/packages/ra-core/src/controller/input/useReferenceParams.ts index d31a0a220fc..67a7172019b 100644 --- a/packages/ra-core/src/controller/input/useReferenceParams.ts +++ b/packages/ra-core/src/controller/input/useReferenceParams.ts @@ -1,5 +1,5 @@ import { useCallback, useMemo, useState, useRef, useEffect } from 'react'; -import lodashDebounce from 'lodash/debounce'; +import lodashDebounce from 'lodash/debounce.js'; import { SortPayload, FilterPayload } from '../../types'; import removeEmpty from '../../util/removeEmpty'; diff --git a/packages/ra-core/src/controller/list/ListFilterContext.tsx b/packages/ra-core/src/controller/list/ListFilterContext.tsx index e096d947f9c..ff9688d0593 100644 --- a/packages/ra-core/src/controller/list/ListFilterContext.tsx +++ b/packages/ra-core/src/controller/list/ListFilterContext.tsx @@ -1,5 +1,5 @@ import { createContext, useMemo } from 'react'; -import pick from 'lodash/pick'; +import pick from 'lodash/pick.js'; import { ListControllerResult } from './useListController'; /** diff --git a/packages/ra-core/src/controller/list/ListPaginationContext.tsx b/packages/ra-core/src/controller/list/ListPaginationContext.tsx index 5793bc7386b..a47fc224ad4 100644 --- a/packages/ra-core/src/controller/list/ListPaginationContext.tsx +++ b/packages/ra-core/src/controller/list/ListPaginationContext.tsx @@ -1,5 +1,5 @@ import { createContext, useMemo } from 'react'; -import pick from 'lodash/pick'; +import pick from 'lodash/pick.js'; import { ListControllerResult } from './useListController'; /** diff --git a/packages/ra-core/src/controller/list/ListSortContext.tsx b/packages/ra-core/src/controller/list/ListSortContext.tsx index 3d66b883e06..e0f0381f0a9 100644 --- a/packages/ra-core/src/controller/list/ListSortContext.tsx +++ b/packages/ra-core/src/controller/list/ListSortContext.tsx @@ -1,5 +1,5 @@ import { createContext, useMemo } from 'react'; -import pick from 'lodash/pick'; +import pick from 'lodash/pick.js'; import { ListControllerResult } from './useListController'; /** diff --git a/packages/ra-core/src/controller/list/queryReducer.ts b/packages/ra-core/src/controller/list/queryReducer.ts index cc0918e8ae6..da9252ae89a 100644 --- a/packages/ra-core/src/controller/list/queryReducer.ts +++ b/packages/ra-core/src/controller/list/queryReducer.ts @@ -1,5 +1,5 @@ import { Reducer } from 'react'; -import set from 'lodash/set'; +import set from 'lodash/set.js'; import removeEmpty from '../../util/removeEmpty'; import removeKey from '../../util/removeKey'; diff --git a/packages/ra-core/src/controller/list/useList.ts b/packages/ra-core/src/controller/list/useList.ts index 072ade60b0a..481da4649d5 100644 --- a/packages/ra-core/src/controller/list/useList.ts +++ b/packages/ra-core/src/controller/list/useList.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useRef, useState } from 'react'; -import get from 'lodash/get'; -import isEqual from 'lodash/isEqual'; +import get from 'lodash/get.js'; +import isEqual from 'lodash/isEqual.js'; import { removeEmpty } from '../../util'; import { FilterPayload, RaRecord, SortPayload } from '../../types'; diff --git a/packages/ra-core/src/controller/list/useListContextWithProps.ts b/packages/ra-core/src/controller/list/useListContextWithProps.ts index 12afb5b5e0f..e0a0ec22928 100644 --- a/packages/ra-core/src/controller/list/useListContextWithProps.ts +++ b/packages/ra-core/src/controller/list/useListContextWithProps.ts @@ -1,5 +1,5 @@ import { useContext, useMemo } from 'react'; -import defaults from 'lodash/defaults'; +import defaults from 'lodash/defaults.js'; import { ListContext } from './ListContext'; import { ListControllerResult } from './useListController'; diff --git a/packages/ra-core/src/controller/list/useListParams.ts b/packages/ra-core/src/controller/list/useListParams.ts index 49697e6af90..eca5484aed5 100644 --- a/packages/ra-core/src/controller/list/useListParams.ts +++ b/packages/ra-core/src/controller/list/useListParams.ts @@ -1,6 +1,6 @@ import { useCallback, useMemo, useEffect, useState, useRef } from 'react'; import { parse, stringify } from 'query-string'; -import lodashDebounce from 'lodash/debounce'; +import lodashDebounce from 'lodash/debounce.js'; import { useNavigate, useLocation } from 'react-router-dom'; import { useStore } from '../../store'; diff --git a/packages/ra-core/src/controller/saveContext/usePickSaveContext.ts b/packages/ra-core/src/controller/saveContext/usePickSaveContext.ts index c8020da5958..0f2964ba43c 100644 --- a/packages/ra-core/src/controller/saveContext/usePickSaveContext.ts +++ b/packages/ra-core/src/controller/saveContext/usePickSaveContext.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import pick from 'lodash/pick'; +import pick from 'lodash/pick.js'; import { SaveContextValue } from './SaveContext'; /** diff --git a/packages/ra-core/src/controller/saveContext/useRegisterMutationMiddleware.stories.tsx b/packages/ra-core/src/controller/saveContext/useRegisterMutationMiddleware.stories.tsx index 1b8f132167c..2bda7dd0024 100644 --- a/packages/ra-core/src/controller/saveContext/useRegisterMutationMiddleware.stories.tsx +++ b/packages/ra-core/src/controller/saveContext/useRegisterMutationMiddleware.stories.tsx @@ -11,8 +11,8 @@ import { SimpleForm, useRegisterMutationMiddleware, } from 'react-admin'; -import get from 'lodash/get'; -import set from 'lodash/set'; +import get from 'lodash/get.js'; +import set from 'lodash/set.js'; import fakerestDataProvider from 'ra-data-fakerest'; export default { diff --git a/packages/ra-core/src/controller/useFilterState.ts b/packages/ra-core/src/controller/useFilterState.ts index 54525be744f..2918e9e9a74 100644 --- a/packages/ra-core/src/controller/useFilterState.ts +++ b/packages/ra-core/src/controller/useFilterState.ts @@ -1,6 +1,6 @@ import { useEffect, useRef, useCallback, useState } from 'react'; -import debounce from 'lodash/debounce'; -import isEqual from 'lodash/isEqual'; +import debounce from 'lodash/debounce.js'; +import isEqual from 'lodash/isEqual.js'; import { FilterPayload } from '../types'; diff --git a/packages/ra-core/src/core/ResourceDefinitionContext.tsx b/packages/ra-core/src/core/ResourceDefinitionContext.tsx index 1753c6d5c3a..ad61a5316e5 100644 --- a/packages/ra-core/src/core/ResourceDefinitionContext.tsx +++ b/packages/ra-core/src/core/ResourceDefinitionContext.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { createContext, useCallback, useState, useMemo } from 'react'; -import isEqual from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual.js'; import { AdminChildren, ResourceDefinition, ResourceOptions } from '../types'; diff --git a/packages/ra-core/src/core/useGetRecordRepresentation.ts b/packages/ra-core/src/core/useGetRecordRepresentation.ts index 5fdd403928c..213e0b2d540 100644 --- a/packages/ra-core/src/core/useGetRecordRepresentation.ts +++ b/packages/ra-core/src/core/useGetRecordRepresentation.ts @@ -1,6 +1,6 @@ import * as React from 'react'; import { useCallback, ReactNode } from 'react'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { useResourceDefinition } from './useResourceDefinition'; diff --git a/packages/ra-core/src/core/useResourceDefinition.ts b/packages/ra-core/src/core/useResourceDefinition.ts index d2875803bfa..214abdb3971 100644 --- a/packages/ra-core/src/core/useResourceDefinition.ts +++ b/packages/ra-core/src/core/useResourceDefinition.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react'; -import defaults from 'lodash/defaults'; +import defaults from 'lodash/defaults.js'; import { useResourceDefinitions } from './useResourceDefinitions'; import { useResourceContext } from './useResourceContext'; diff --git a/packages/ra-core/src/dataProvider/useGetManyAggregate.ts b/packages/ra-core/src/dataProvider/useGetManyAggregate.ts index e390d9b34f0..051021de965 100644 --- a/packages/ra-core/src/dataProvider/useGetManyAggregate.ts +++ b/packages/ra-core/src/dataProvider/useGetManyAggregate.ts @@ -5,7 +5,7 @@ import { useQuery, UseQueryOptions, } from '@tanstack/react-query'; -import union from 'lodash/union'; +import union from 'lodash/union.js'; import { UseGetManyHookValue } from './useGetMany'; import { Identifier, RaRecord, GetManyParams, DataProvider } from '../types'; diff --git a/packages/ra-core/src/dataTable/DataTableBase.tsx b/packages/ra-core/src/dataTable/DataTableBase.tsx index 1453a08da99..e7884c90c90 100644 --- a/packages/ra-core/src/dataTable/DataTableBase.tsx +++ b/packages/ra-core/src/dataTable/DataTableBase.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { useEffect, useMemo, useRef, type FC, type ReactNode } from 'react'; -import union from 'lodash/union'; -import difference from 'lodash/difference'; +import union from 'lodash/union.js'; +import difference from 'lodash/difference.js'; import { OptionalResourceContextProvider, useResourceContext } from '../core'; import { useEvent } from '../util'; diff --git a/packages/ra-core/src/export/defaultExporter.ts b/packages/ra-core/src/export/defaultExporter.ts index 55d0ed4721e..69647714953 100644 --- a/packages/ra-core/src/export/defaultExporter.ts +++ b/packages/ra-core/src/export/defaultExporter.ts @@ -1,4 +1,4 @@ -import jsonExport from 'jsonexport/dist'; +import jsonExport from 'jsonexport/dist/index.js'; import { downloadCSV } from './downloadCSV'; import { Exporter } from '../types'; diff --git a/packages/ra-core/src/form/FilterLiveForm.tsx b/packages/ra-core/src/form/FilterLiveForm.tsx index 453218072ff..679172258bd 100644 --- a/packages/ra-core/src/form/FilterLiveForm.tsx +++ b/packages/ra-core/src/form/FilterLiveForm.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; -import isEqual from 'lodash/isEqual'; -import cloneDeep from 'lodash/cloneDeep'; -import get from 'lodash/get'; -import mergeWith from 'lodash/mergeWith'; -import set from 'lodash/set'; +import isEqual from 'lodash/isEqual.js'; +import cloneDeep from 'lodash/cloneDeep.js'; +import get from 'lodash/get.js'; +import mergeWith from 'lodash/mergeWith.js'; +import set from 'lodash/set.js'; import { ReactNode, useEffect } from 'react'; import { FormProvider, useForm, UseFormProps } from 'react-hook-form'; import { @@ -11,11 +11,8 @@ import { SourceContextValue, useResourceContext, } from '../core'; -import { - FormGroupsProvider, - getSimpleValidationResolver, - ValidateForm, -} from '.'; +import { FormGroupsProvider } from './groups/FormGroupsProvider'; +import { getSimpleValidationResolver, type ValidateForm } from './validation'; import { useDebouncedEvent } from '../util'; import { useListContext } from '../controller/list/useListContext'; diff --git a/packages/ra-core/src/form/FormDataConsumer.tsx b/packages/ra-core/src/form/FormDataConsumer.tsx index 9fb20ce380a..60f2d6d1e4c 100644 --- a/packages/ra-core/src/form/FormDataConsumer.tsx +++ b/packages/ra-core/src/form/FormDataConsumer.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { ReactNode } from 'react'; import { useFormContext, FieldValues } from 'react-hook-form'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { useFormValues } from './useFormValues'; import { useWrappedSource } from '../core'; diff --git a/packages/ra-core/src/form/choices/useChoices.tsx b/packages/ra-core/src/form/choices/useChoices.tsx index c1ce1a0709f..7d1cd0abcc1 100644 --- a/packages/ra-core/src/form/choices/useChoices.tsx +++ b/packages/ra-core/src/form/choices/useChoices.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { ReactElement, isValidElement, useCallback } from 'react'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { useTranslate } from '../../i18n'; import { RaRecord } from '../../types'; diff --git a/packages/ra-core/src/form/getFormInitialValues.ts b/packages/ra-core/src/form/getFormInitialValues.ts index a6ae3121a05..51ec1cbe107 100644 --- a/packages/ra-core/src/form/getFormInitialValues.ts +++ b/packages/ra-core/src/form/getFormInitialValues.ts @@ -1,4 +1,4 @@ -import merge from 'lodash/merge'; +import merge from 'lodash/merge.js'; import { RaRecord } from '../types'; export default function getFormInitialValues( diff --git a/packages/ra-core/src/form/groups/index.tsx b/packages/ra-core/src/form/groups/index.ts similarity index 100% rename from packages/ra-core/src/form/groups/index.tsx rename to packages/ra-core/src/form/groups/index.ts diff --git a/packages/ra-core/src/form/groups/useFormGroup.ts b/packages/ra-core/src/form/groups/useFormGroup.ts index 256773fa49f..ca10641ecc5 100644 --- a/packages/ra-core/src/form/groups/useFormGroup.ts +++ b/packages/ra-core/src/form/groups/useFormGroup.ts @@ -1,6 +1,6 @@ import { useEffect, useState } from 'react'; -import get from 'lodash/get'; -import isEqual from 'lodash/isEqual'; +import get from 'lodash/get.js'; +import isEqual from 'lodash/isEqual.js'; import { useFormState } from 'react-hook-form'; import { useFormGroups } from './useFormGroups'; import { useEvent } from '../../util'; diff --git a/packages/ra-core/src/form/useApplyInputDefaultValues.ts b/packages/ra-core/src/form/useApplyInputDefaultValues.ts index 1857964f42d..721d862f2d1 100644 --- a/packages/ra-core/src/form/useApplyInputDefaultValues.ts +++ b/packages/ra-core/src/form/useApplyInputDefaultValues.ts @@ -4,7 +4,7 @@ import { UseFieldArrayReturn, useFormContext, } from 'react-hook-form'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { useRecordContext } from '../controller'; import { InputProps } from './useInput'; import { useWrappedSource } from '../core'; diff --git a/packages/ra-core/src/form/useAugmentedForm.ts b/packages/ra-core/src/form/useAugmentedForm.ts index 6f47a36fb43..b27df15e233 100644 --- a/packages/ra-core/src/form/useAugmentedForm.ts +++ b/packages/ra-core/src/form/useAugmentedForm.ts @@ -11,7 +11,7 @@ import { useForm, UseFormProps, } from 'react-hook-form'; -import merge from 'lodash/merge'; +import merge from 'lodash/merge.js'; import { RaRecord } from '../types'; import { SaveHandler, useRecordContext, useSaveContext } from '../controller'; import getFormInitialValues from './getFormInitialValues'; diff --git a/packages/ra-core/src/form/useInput.ts b/packages/ra-core/src/form/useInput.ts index bade85c03f4..e60235322ff 100644 --- a/packages/ra-core/src/form/useInput.ts +++ b/packages/ra-core/src/form/useInput.ts @@ -8,7 +8,7 @@ import { UseFormStateReturn, } from 'react-hook-form'; import type { EditorEvents } from '@tiptap/react'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { useRecordContext } from '../controller'; import { composeValidators, Validator, isRequired } from './validation'; diff --git a/packages/ra-core/src/form/useRecordFromLocation.ts b/packages/ra-core/src/form/useRecordFromLocation.ts index d071596038d..bf387e187d9 100644 --- a/packages/ra-core/src/form/useRecordFromLocation.ts +++ b/packages/ra-core/src/form/useRecordFromLocation.ts @@ -1,7 +1,7 @@ import { useEffect, useRef, useState } from 'react'; import { parse } from 'query-string'; import { Location, useLocation } from 'react-router-dom'; -import isEqual from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual.js'; import { RaRecord } from '../types'; /** diff --git a/packages/ra-core/src/form/useSuggestions.ts b/packages/ra-core/src/form/useSuggestions.ts index 2dc47cdfc25..a6020efd740 100644 --- a/packages/ra-core/src/form/useSuggestions.ts +++ b/packages/ra-core/src/form/useSuggestions.ts @@ -1,5 +1,5 @@ import { useCallback, isValidElement, ReactElement } from 'react'; -import set from 'lodash/set'; +import set from 'lodash/set.js'; import { useChoices, OptionText, diff --git a/packages/ra-core/src/form/validation/useUnique.ts b/packages/ra-core/src/form/validation/useUnique.ts index 825a9213cd8..426059145d7 100644 --- a/packages/ra-core/src/form/validation/useUnique.ts +++ b/packages/ra-core/src/form/validation/useUnique.ts @@ -1,6 +1,6 @@ import { useCallback, useRef } from 'react'; -import merge from 'lodash/merge'; -import set from 'lodash/set'; +import merge from 'lodash/merge.js'; +import set from 'lodash/set.js'; import { useResourceContext } from '../../core'; import { useDataProvider } from '../../dataProvider'; import { useTranslate, useTranslateLabel } from '../../i18n'; diff --git a/packages/ra-core/src/form/validation/validate.ts b/packages/ra-core/src/form/validation/validate.ts index 605b9645467..62f5e153032 100644 --- a/packages/ra-core/src/form/validation/validate.ts +++ b/packages/ra-core/src/form/validation/validate.ts @@ -1,4 +1,4 @@ -import lodashMemoize from 'lodash/memoize'; +import lodashMemoize from 'lodash/memoize.js'; /* @link http://stackoverflow.com/questions/46155/validate-email-address-in-javascript */ const EMAIL_REGEX = diff --git a/packages/ra-core/src/i18n/TestTranslationProvider.tsx b/packages/ra-core/src/i18n/TestTranslationProvider.tsx index 3a7743c49fb..7b990c59e62 100644 --- a/packages/ra-core/src/i18n/TestTranslationProvider.tsx +++ b/packages/ra-core/src/i18n/TestTranslationProvider.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import lodashGet from 'lodash/get'; +import lodashGet from 'lodash/get.js'; import { I18nContextProvider } from './I18nContextProvider'; import { I18nProvider } from '../types'; diff --git a/packages/ra-core/src/i18n/TranslationUtils.ts b/packages/ra-core/src/i18n/TranslationUtils.ts index 22fb03fbebd..669552e0227 100644 --- a/packages/ra-core/src/i18n/TranslationUtils.ts +++ b/packages/ra-core/src/i18n/TranslationUtils.ts @@ -1,4 +1,4 @@ -import merge from 'lodash/merge'; +import merge from 'lodash/merge.js'; import { DEFAULT_LOCALE } from './index'; interface AllNavigatorLanguage extends NavigatorLanguage { diff --git a/packages/ra-core/src/i18n/useTranslatable.ts b/packages/ra-core/src/i18n/useTranslatable.ts index d06067b1ddf..ae6f9c94077 100644 --- a/packages/ra-core/src/i18n/useTranslatable.ts +++ b/packages/ra-core/src/i18n/useTranslatable.ts @@ -1,7 +1,7 @@ import { useState, useMemo } from 'react'; -import set from 'lodash/set'; -import get from 'lodash/get'; -import cloneDeep from 'lodash/cloneDeep'; +import set from 'lodash/set.js'; +import get from 'lodash/get.js'; +import cloneDeep from 'lodash/cloneDeep.js'; import { TranslatableContextValue } from './TranslatableContext'; import { useLocaleState } from './useLocaleState'; diff --git a/packages/ra-core/src/routing/useRestoreScrollPosition.ts b/packages/ra-core/src/routing/useRestoreScrollPosition.ts index 5db1a7ef615..619b6c4a7a9 100644 --- a/packages/ra-core/src/routing/useRestoreScrollPosition.ts +++ b/packages/ra-core/src/routing/useRestoreScrollPosition.ts @@ -1,6 +1,6 @@ import { useEffect } from 'react'; import { useLocation } from 'react-router'; -import debounce from 'lodash/debounce'; +import debounce from 'lodash/debounce.js'; import { useStore } from '../store'; diff --git a/packages/ra-core/src/store/memoryStore.tsx b/packages/ra-core/src/store/memoryStore.tsx index 83a41828aed..9601770e48e 100644 --- a/packages/ra-core/src/store/memoryStore.tsx +++ b/packages/ra-core/src/store/memoryStore.tsx @@ -1,6 +1,6 @@ -import set from 'lodash/set'; -import unset from 'lodash/unset'; -import get from 'lodash/get'; +import set from 'lodash/set.js'; +import unset from 'lodash/unset.js'; +import get from 'lodash/get.js'; import { Store } from './types'; type Subscription = { diff --git a/packages/ra-core/src/store/useStore.ts b/packages/ra-core/src/store/useStore.ts index 7f3d1cf6a16..94019d2834d 100644 --- a/packages/ra-core/src/store/useStore.ts +++ b/packages/ra-core/src/store/useStore.ts @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react'; -import isEqual from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual.js'; import { useEvent } from '../util'; import { useStoreContext } from './useStoreContext'; diff --git a/packages/ra-core/src/util/asyncDebounce.ts b/packages/ra-core/src/util/asyncDebounce.ts index e3f2a2a41c8..e5e889f4bc7 100644 --- a/packages/ra-core/src/util/asyncDebounce.ts +++ b/packages/ra-core/src/util/asyncDebounce.ts @@ -1,4 +1,4 @@ -import debounce from 'lodash/debounce'; +import debounce from 'lodash/debounce.js'; /** * A version of lodash/debounce that always returns a promise but wait for the debounced function to return to resolve it. diff --git a/packages/ra-core/src/util/getValue.ts b/packages/ra-core/src/util/getValue.ts index 958e3579f95..43ed93b6762 100644 --- a/packages/ra-core/src/util/getValue.ts +++ b/packages/ra-core/src/util/getValue.ts @@ -1,4 +1,4 @@ -import get from 'lodash/get'; +import get from 'lodash/get.js'; export default (value, path) => { if (typeof value === 'object') { diff --git a/packages/ra-core/src/util/hooks.ts b/packages/ra-core/src/util/hooks.ts index 33120d97cc8..5139373b7f8 100644 --- a/packages/ra-core/src/util/hooks.ts +++ b/packages/ra-core/src/util/hooks.ts @@ -1,5 +1,5 @@ import { useRef, useEffect, useState, useCallback } from 'react'; -import isEqual from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual.js'; // thanks Kent C Dodds for the following helpers diff --git a/packages/ra-core/src/util/useDebouncedEvent.ts b/packages/ra-core/src/util/useDebouncedEvent.ts index 10ac7643f3c..abd608e75fb 100644 --- a/packages/ra-core/src/util/useDebouncedEvent.ts +++ b/packages/ra-core/src/util/useDebouncedEvent.ts @@ -1,6 +1,6 @@ import * as React from 'react'; import { useCallback, useRef } from 'react'; -import debounce from 'lodash/debounce'; +import debounce from 'lodash/debounce.js'; import { useEvent } from './useEvent'; // allow the hook to work in SSR diff --git a/packages/ra-core/src/util/useFieldValue.ts b/packages/ra-core/src/util/useFieldValue.ts index 97168ea3700..dcbf3180641 100644 --- a/packages/ra-core/src/util/useFieldValue.ts +++ b/packages/ra-core/src/util/useFieldValue.ts @@ -1,4 +1,4 @@ -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { useRecordContext } from '../controller'; import { ExtractRecordPaths } from '../types'; diff --git a/packages/ra-core/tsconfig.json b/packages/ra-core/tsconfig.json index d4c2c252ddb..58156d31c43 100644 --- a/packages/ra-core/tsconfig.json +++ b/packages/ra-core/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false, "strictNullChecks": true diff --git a/packages/ra-data-fakerest/package.json b/packages/ra-data-fakerest/package.json index 2ad16669284..4409cd6cd83 100644 --- a/packages/ra-data-fakerest/package.json +++ b/packages/ra-data-fakerest/package.json @@ -2,9 +2,11 @@ "name": "ra-data-fakerest", "version": "5.12.0", "description": "JSON Server data provider for react-admin", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "files": [ "LICENSE", @@ -31,24 +33,27 @@ }, "homepage": "https://github.com/marmelab/react-admin#readme", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "fakerest": "^4.0.1" }, "devDependencies": { "@types/jest": "^29.5.2", - "cross-env": "^5.2.0", "expect": "^27.4.6", "ra-core": "^5.12.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "peerDependencies": { "ra-core": "^5.0.0" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-data-fakerest/tsconfig.json b/packages/ra-data-fakerest/tsconfig.json index 1194b48345b..4a1336a43aa 100644 --- a/packages/ra-data-fakerest/tsconfig.json +++ b/packages/ra-data-fakerest/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false, "strictNullChecks": true diff --git a/packages/ra-data-graphql-simple/package.json b/packages/ra-data-graphql-simple/package.json index 573f5844be1..9754f95b9cf 100644 --- a/packages/ra-data-graphql-simple/package.json +++ b/packages/ra-data-graphql-simple/package.json @@ -2,9 +2,11 @@ "name": "ra-data-graphql-simple", "version": "5.12.0", "description": "A GraphQL simple data provider for react-admin", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "repository": { "type": "git", @@ -27,10 +29,7 @@ ], "license": "MIT", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "@apollo/client": "^3.3.19", @@ -44,10 +43,19 @@ "ra-core": "^5.0.0" }, "devDependencies": { - "cross-env": "^5.2.0", "graphql": "^15.6.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "files": [ + "dist" + ], + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-data-graphql-simple/src/index.ts b/packages/ra-data-graphql-simple/src/index.ts index 24be1dee85b..a7e0760699f 100644 --- a/packages/ra-data-graphql-simple/src/index.ts +++ b/packages/ra-data-graphql-simple/src/index.ts @@ -1,4 +1,4 @@ -import merge from 'lodash/merge'; +import merge from 'lodash/merge.js'; import buildDataProvider, { BuildQueryFactory, Options, diff --git a/packages/ra-data-graphql-simple/tsconfig.json b/packages/ra-data-graphql-simple/tsconfig.json index d4980ef9fa6..28274dcf752 100644 --- a/packages/ra-data-graphql-simple/tsconfig.json +++ b/packages/ra-data-graphql-simple/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false }, diff --git a/packages/ra-data-graphql/package.json b/packages/ra-data-graphql/package.json index 7d1ff440b11..865a34d40c0 100644 --- a/packages/ra-data-graphql/package.json +++ b/packages/ra-data-graphql/package.json @@ -2,9 +2,11 @@ "name": "ra-data-graphql", "version": "5.12.0", "description": "A GraphQL data provider for react-admin", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "repository": { "type": "git", @@ -27,10 +29,7 @@ ], "license": "MIT", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "@apollo/client": "^3.3.19", @@ -43,10 +42,19 @@ "ra-core": "^5.0.0" }, "devDependencies": { - "cross-env": "^5.2.0", "graphql": "^15.6.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "files": [ + "dist" + ], + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-data-graphql/src/index.ts b/packages/ra-data-graphql/src/index.ts index 209084bb4c3..0aefac5aad7 100644 --- a/packages/ra-data-graphql/src/index.ts +++ b/packages/ra-data-graphql/src/index.ts @@ -1,5 +1,5 @@ -import merge from 'lodash/merge'; -import get from 'lodash/get'; +import merge from 'lodash/merge.js'; +import get from 'lodash/get.js'; import pluralize from 'pluralize'; import { DataProvider, diff --git a/packages/ra-data-graphql/tsconfig.json b/packages/ra-data-graphql/tsconfig.json index 6ac2e21ab53..b67af63046d 100644 --- a/packages/ra-data-graphql/tsconfig.json +++ b/packages/ra-data-graphql/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false, "strictNullChecks": true diff --git a/packages/ra-data-json-server/package.json b/packages/ra-data-json-server/package.json index 5a313ab057f..85e1566c1bd 100644 --- a/packages/ra-data-json-server/package.json +++ b/packages/ra-data-json-server/package.json @@ -2,9 +2,11 @@ "name": "ra-data-json-server", "version": "5.12.0", "description": "JSON Server data provider for react-admin", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "files": [ "*.md", @@ -19,19 +21,22 @@ "bugs": "https://github.com/marmelab/react-admin/issues", "license": "MIT", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "query-string": "^7.1.3", "ra-core": "^5.12.0" }, "devDependencies": { - "cross-env": "^5.2.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-data-json-server/tsconfig.json b/packages/ra-data-json-server/tsconfig.json index 1194b48345b..4a1336a43aa 100644 --- a/packages/ra-data-json-server/tsconfig.json +++ b/packages/ra-data-json-server/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false, "strictNullChecks": true diff --git a/packages/ra-data-local-forage/package.json b/packages/ra-data-local-forage/package.json index f837165220a..fe1c3294445 100644 --- a/packages/ra-data-local-forage/package.json +++ b/packages/ra-data-local-forage/package.json @@ -2,9 +2,11 @@ "name": "ra-data-local-forage", "version": "5.12.0", "description": "LocalForage data provider for react-admin", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "files": [ "LICENSE", @@ -34,10 +36,7 @@ }, "homepage": "https://github.com/marmelab/react-admin#readme", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "localforage": "^1.7.1", @@ -45,12 +44,18 @@ "ra-data-fakerest": "^5.12.0" }, "devDependencies": { - "cross-env": "^5.2.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "peerDependencies": { "ra-core": "*" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-data-local-forage/src/index.ts b/packages/ra-data-local-forage/src/index.ts index 275d3092745..461af6db48f 100644 --- a/packages/ra-data-local-forage/src/index.ts +++ b/packages/ra-data-local-forage/src/index.ts @@ -13,7 +13,7 @@ import { UpdateManyParams, DeleteManyParams, } from 'ra-core'; -import pullAt from 'lodash/pullAt'; +import pullAt from 'lodash/pullAt.js'; import localforage from 'localforage'; /** diff --git a/packages/ra-data-local-forage/tsconfig.json b/packages/ra-data-local-forage/tsconfig.json index 279cbd554ea..d748bfb0e9e 100644 --- a/packages/ra-data-local-forage/tsconfig.json +++ b/packages/ra-data-local-forage/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "declaration": true, "declarationMap": true, diff --git a/packages/ra-data-local-storage/package.json b/packages/ra-data-local-storage/package.json index d476972768d..ca5e758d79b 100644 --- a/packages/ra-data-local-storage/package.json +++ b/packages/ra-data-local-storage/package.json @@ -2,9 +2,11 @@ "name": "ra-data-local-storage", "version": "5.12.0", "description": "Local storage data provider for react-admin", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "files": [ "LICENSE", @@ -31,22 +33,25 @@ }, "homepage": "https://github.com/marmelab/react-admin#readme", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "lodash": "~4.17.5", "ra-data-fakerest": "^5.12.0" }, "devDependencies": { - "cross-env": "^5.2.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "peerDependencies": { "ra-core": "*" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-data-local-storage/src/index.ts b/packages/ra-data-local-storage/src/index.ts index 99d23261ccc..3138f4feb5b 100644 --- a/packages/ra-data-local-storage/src/index.ts +++ b/packages/ra-data-local-storage/src/index.ts @@ -1,7 +1,7 @@ /* eslint-disable eqeqeq */ import fakeRestProvider from 'ra-data-fakerest'; import { DataProvider, RaRecord } from 'ra-core'; -import pullAt from 'lodash/pullAt'; +import pullAt from 'lodash/pullAt.js'; /** * Respond to react-admin data queries using a local database persisted in localStorage diff --git a/packages/ra-data-local-storage/tsconfig.json b/packages/ra-data-local-storage/tsconfig.json index 1194b48345b..4a1336a43aa 100644 --- a/packages/ra-data-local-storage/tsconfig.json +++ b/packages/ra-data-local-storage/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false, "strictNullChecks": true diff --git a/packages/ra-data-simple-rest/package.json b/packages/ra-data-simple-rest/package.json index e0db07ba3fd..e9b4be65a0c 100644 --- a/packages/ra-data-simple-rest/package.json +++ b/packages/ra-data-simple-rest/package.json @@ -2,9 +2,11 @@ "name": "ra-data-simple-rest", "version": "5.12.0", "description": "Simple REST data provider for react-admin", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "files": [ "*.md", @@ -19,22 +21,25 @@ "bugs": "https://github.com/marmelab/react-admin/issues", "license": "MIT", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "query-string": "^7.1.3" }, "devDependencies": { - "cross-env": "^5.2.0", "ra-core": "^5.12.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "peerDependencies": { "ra-core": "^5.0.0" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-data-simple-rest/tsconfig.json b/packages/ra-data-simple-rest/tsconfig.json index 1194b48345b..4a1336a43aa 100644 --- a/packages/ra-data-simple-rest/tsconfig.json +++ b/packages/ra-data-simple-rest/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false, "strictNullChecks": true diff --git a/packages/ra-i18n-i18next/package.json b/packages/ra-i18n-i18next/package.json index 3c520f65878..1117eb50da3 100644 --- a/packages/ra-i18n-i18next/package.json +++ b/packages/ra-i18n-i18next/package.json @@ -2,9 +2,11 @@ "name": "ra-i18n-i18next", "version": "5.12.0", "description": "i18next i18n provider for react-admin", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "files": [ "*.md", @@ -19,10 +21,7 @@ "bugs": "https://github.com/marmelab/react-admin/issues", "license": "MIT", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "i18next": "^23.5.1", @@ -31,15 +30,21 @@ "react-i18next": "^14.1.1" }, "devDependencies": { - "cross-env": "^5.2.0", "i18next-resources-to-backend": "^1.1.4", "ra-language-english": "^5.12.0", "ra-language-french": "^5.12.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-i18n-i18next/src/convertRaTranslationsToI18next.ts b/packages/ra-i18n-i18next/src/convertRaTranslationsToI18next.ts index a74e542cf9b..6e1f10ed959 100644 --- a/packages/ra-i18n-i18next/src/convertRaTranslationsToI18next.ts +++ b/packages/ra-i18n-i18next/src/convertRaTranslationsToI18next.ts @@ -1,4 +1,4 @@ -import clone from 'lodash/clone'; +import clone from 'lodash/clone.js'; /** * A function that takes translations from a standard react-admin language package and converts them to i18next format. diff --git a/packages/ra-i18n-i18next/tsconfig.json b/packages/ra-i18n-i18next/tsconfig.json index 6fb08aeb372..4fc99e7ce69 100644 --- a/packages/ra-i18n-i18next/tsconfig.json +++ b/packages/ra-i18n-i18next/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false }, diff --git a/packages/ra-i18n-polyglot/package.json b/packages/ra-i18n-polyglot/package.json index 40fb36849ea..4f44ca64ac0 100644 --- a/packages/ra-i18n-polyglot/package.json +++ b/packages/ra-i18n-polyglot/package.json @@ -2,9 +2,11 @@ "name": "ra-i18n-polyglot", "version": "5.12.0", "description": "Polyglot i18n provider for react-admin", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "files": [ "*.md", @@ -19,19 +21,22 @@ "bugs": "https://github.com/marmelab/react-admin/issues", "license": "MIT", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "node-polyglot": "^2.2.2", "ra-core": "^5.12.0" }, "devDependencies": { - "cross-env": "^5.2.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-i18n-polyglot/tsconfig.json b/packages/ra-i18n-polyglot/tsconfig.json index 6fb08aeb372..4fc99e7ce69 100644 --- a/packages/ra-i18n-polyglot/tsconfig.json +++ b/packages/ra-i18n-polyglot/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false }, diff --git a/packages/ra-input-rich-text/package.json b/packages/ra-input-rich-text/package.json index 6b61881af86..4af577a7100 100644 --- a/packages/ra-input-rich-text/package.json +++ b/packages/ra-input-rich-text/package.json @@ -12,15 +12,14 @@ "dist", "src" ], - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "@tiptap/core": "^2.0.3", @@ -58,9 +57,16 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-hook-form": "^7.53.0", - "rimraf": "^3.0.2", "tippy.js": "^6.3.7", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-input-rich-text/src/index.ts b/packages/ra-input-rich-text/src/index.ts index 64d23244016..b018f94cd0f 100644 --- a/packages/ra-input-rich-text/src/index.ts +++ b/packages/ra-input-rich-text/src/index.ts @@ -1,3 +1,4 @@ +import type {} from '@mui/material/themeCssVarsAugmentation'; export * from './RichTextInput'; export * from './buttons'; export * from './RichTextInputToolbar'; diff --git a/packages/ra-input-rich-text/src/mui.d.ts b/packages/ra-input-rich-text/src/mui.d.ts deleted file mode 100644 index 88a8176a131..00000000000 --- a/packages/ra-input-rich-text/src/mui.d.ts +++ /dev/null @@ -1 +0,0 @@ -import type {} from '@mui/material/themeCssVarsAugmentation'; diff --git a/packages/ra-input-rich-text/tsconfig.json b/packages/ra-input-rich-text/tsconfig.json index 70874690c29..2406503cd7a 100644 --- a/packages/ra-input-rich-text/tsconfig.json +++ b/packages/ra-input-rich-text/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false }, diff --git a/packages/ra-language-english/package.json b/packages/ra-language-english/package.json index 56e21bf7b34..d88c4ddb5fd 100644 --- a/packages/ra-language-english/package.json +++ b/packages/ra-language-english/package.json @@ -11,21 +11,20 @@ "dist", "src" ], - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "ra-core": "^5.12.0" }, "devDependencies": { - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "keywords": [ "react", @@ -39,5 +38,12 @@ "url": "https://github.com/marmelab/react-admin/issues" }, "homepage": "https://github.com/marmelab/react-admin#readme", - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-language-english/tsconfig.json b/packages/ra-language-english/tsconfig.json index a18665f388c..57c68223c8b 100644 --- a/packages/ra-language-english/tsconfig.json +++ b/packages/ra-language-english/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false }, diff --git a/packages/ra-language-french/package.json b/packages/ra-language-french/package.json index c8f68b8eccd..98d9ccb869d 100644 --- a/packages/ra-language-french/package.json +++ b/packages/ra-language-french/package.json @@ -11,21 +11,20 @@ "dist", "src" ], - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "dependencies": { "ra-core": "^5.12.0" }, "devDependencies": { - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "keywords": [ "react", @@ -39,5 +38,12 @@ "url": "https://github.com/marmelab/react-admin/issues" }, "homepage": "https://github.com/marmelab/react-admin#readme", - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-language-french/tsconfig.json b/packages/ra-language-french/tsconfig.json index a18665f388c..57c68223c8b 100644 --- a/packages/ra-language-french/tsconfig.json +++ b/packages/ra-language-french/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false }, diff --git a/packages/ra-no-code/package.json b/packages/ra-no-code/package.json index 87e37aa2141..bd1affb0be8 100644 --- a/packages/ra-no-code/package.json +++ b/packages/ra-no-code/package.json @@ -7,9 +7,11 @@ "dist", "src" ], - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "authors": [ "Gildas Garcia" @@ -19,22 +21,18 @@ "bugs": "https://github.com/marmelab/react-admin/issues", "license": "MIT", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "devDependencies": { "@tanstack/react-query": "^5.90.2", "@testing-library/react": "^15.0.7", "@testing-library/user-event": "^14.5.2", - "cross-env": "^5.2.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router": "^6.22.0", "react-router-dom": "^6.22.0", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "peerDependencies": { "@mui/icons-material": "^5.16.12 || ^6.0.0 || ^7.0.0", @@ -53,5 +51,12 @@ "react-admin": "^5.12.0", "react-dropzone": "^14.2.3" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-no-code/src/ResourceConfiguration/ConfigurationInputsFromFieldDefinition.tsx b/packages/ra-no-code/src/ResourceConfiguration/ConfigurationInputsFromFieldDefinition.tsx index 2974d1e54ea..537cf42b60b 100644 --- a/packages/ra-no-code/src/ResourceConfiguration/ConfigurationInputsFromFieldDefinition.tsx +++ b/packages/ra-no-code/src/ResourceConfiguration/ConfigurationInputsFromFieldDefinition.tsx @@ -4,7 +4,7 @@ import { InferredElementDescription, SelectInput, } from 'react-admin'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { useResourcesConfiguration } from './useResourcesConfiguration'; export const ConfigurationInputsFromFieldDefinition = ({ diff --git a/packages/ra-no-code/src/index.ts b/packages/ra-no-code/src/index.ts index 047a899829c..d92b20c127f 100644 --- a/packages/ra-no-code/src/index.ts +++ b/packages/ra-no-code/src/index.ts @@ -1,3 +1,4 @@ +import type {} from '@mui/material/themeCssVarsAugmentation'; export * from './Admin'; export * from './ApplicationsDashboard'; export * from './Root'; diff --git a/packages/ra-no-code/src/mui.d.ts b/packages/ra-no-code/src/mui.d.ts deleted file mode 100644 index 88a8176a131..00000000000 --- a/packages/ra-no-code/src/mui.d.ts +++ /dev/null @@ -1 +0,0 @@ -import type {} from '@mui/material/themeCssVarsAugmentation'; diff --git a/packages/ra-no-code/src/ui/Menu.tsx b/packages/ra-no-code/src/ui/Menu.tsx index 9dec40000a5..c18a2315abd 100644 --- a/packages/ra-no-code/src/ui/Menu.tsx +++ b/packages/ra-no-code/src/ui/Menu.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { styled } from '@mui/material/styles'; import { FC } from 'react'; -import lodashGet from 'lodash/get'; +import lodashGet from 'lodash/get.js'; import clsx from 'clsx'; import { DashboardMenuItem, useSidebarState } from 'react-admin'; diff --git a/packages/ra-no-code/src/ui/useImportResourceFromCsv.tsx b/packages/ra-no-code/src/ui/useImportResourceFromCsv.tsx index f5c181a6c77..0e7ee520e5e 100644 --- a/packages/ra-no-code/src/ui/useImportResourceFromCsv.tsx +++ b/packages/ra-no-code/src/ui/useImportResourceFromCsv.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; import { parse } from 'papaparse'; import { getValuesFromRecords, RaRecord, useDataProvider } from 'react-admin'; -import set from 'lodash/set'; +import set from 'lodash/set.js'; import { useResourcesConfiguration, diff --git a/packages/ra-no-code/tsconfig.json b/packages/ra-no-code/tsconfig.json index d358bd5bccf..83e038cdba5 100644 --- a/packages/ra-no-code/tsconfig.json +++ b/packages/ra-no-code/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false, "types": [ diff --git a/packages/ra-ui-materialui/package.json b/packages/ra-ui-materialui/package.json index d8a0cc01be1..c1130646e80 100644 --- a/packages/ra-ui-materialui/package.json +++ b/packages/ra-ui-materialui/package.json @@ -7,9 +7,11 @@ "dist", "src" ], - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "authors": [ "François Zaninotto", @@ -20,12 +22,10 @@ "bugs": "https://github.com/marmelab/react-admin/issues", "license": "MIT", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "devDependencies": { + "@faker-js/faker": "^10.0.0", "@mui/icons-material": "^5.16.12", "@mui/material": "^5.16.12", "@mui/system": "^5.16.12", @@ -37,7 +37,6 @@ "@types/react-dom": "^18.3.0", "@types/react-is": "^18.3.0", "@types/react-transition-group": "^4.4.10", - "cross-env": "^5.2.0", "csstype": "^3.1.3", "expect": "^27.4.6", "file-api": "~0.10.4", @@ -51,8 +50,8 @@ "react-is": "^18.2.0 || ^19.0.0", "react-router": "^6.28.1", "react-router-dom": "^6.28.1", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "peerDependencies": { "@mui/icons-material": "^5.16.12 || ^6.0.0 || ^7.0.0", @@ -84,5 +83,12 @@ "react-hotkeys-hook": "^5.1.0", "react-transition-group": "^4.4.5" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/ra-ui-materialui/src/button/CreateButton.tsx b/packages/ra-ui-materialui/src/button/CreateButton.tsx index fa8cad02073..2c5d6424547 100644 --- a/packages/ra-ui-materialui/src/button/CreateButton.tsx +++ b/packages/ra-ui-materialui/src/button/CreateButton.tsx @@ -7,8 +7,8 @@ import { useThemeProps, } from '@mui/material/styles'; import clsx from 'clsx'; -import isEqual from 'lodash/isEqual'; -import merge from 'lodash/merge'; +import isEqual from 'lodash/isEqual.js'; +import merge from 'lodash/merge.js'; import { useCreatePath, useCanAccess, diff --git a/packages/ra-ui-materialui/src/button/PrevNextButtons.spec.tsx b/packages/ra-ui-materialui/src/button/PrevNextButtons.spec.tsx index c400bbf6f50..176882440d6 100644 --- a/packages/ra-ui-materialui/src/button/PrevNextButtons.spec.tsx +++ b/packages/ra-ui-materialui/src/button/PrevNextButtons.spec.tsx @@ -1,6 +1,5 @@ import * as React from 'react'; import { fireEvent, render, screen } from '@testing-library/react'; -import { address, internet, name } from 'faker/locale/en_GB'; import fakeRestDataProvider from 'ra-data-fakerest'; import { @@ -23,7 +22,7 @@ describe('', () => { it('should render the current record position according to the clicked item in the list', async () => { render(); - const tr = await screen.findByText('Deja'); + const tr = await screen.findByText('first_name_3'); fireEvent.click(tr); await screen.findByRole('navigation'); expect(screen.getByText('4 / 900')).toBeDefined(); @@ -31,7 +30,7 @@ describe('', () => { it('should render previous button as disabled if there is no previous record', async () => { render(); - const tr = await screen.findByText('Maurine'); + const tr = await screen.findByText('first_name_0'); fireEvent.click(tr); await screen.findByRole('navigation'); const previousButton = screen.getByLabelText('Go to previous page'); @@ -43,7 +42,7 @@ describe('', () => { render(); const lastPage = await screen.findByText('90'); fireEvent.click(lastPage); - const tr = await screen.findByText('Maxwell'); + const tr = await screen.findByText('first_name_899'); fireEvent.click(tr); await screen.findByRole('navigation'); const nextButton = screen.getByLabelText('Go to next page'); @@ -54,16 +53,17 @@ describe('', () => { it('should render a total based on query filter', async () => { render(); const input = await screen.findByLabelText('Search'); - fireEvent.change(input, { target: { value: 'east' } }); - const item = await screen.findByText('217'); + fireEvent.change(input, { target: { value: 'city_0' } }); + await screen.findByText('1-10 of 50'); + const item = await screen.findByText('first_name_9'); fireEvent.click(item); await screen.findByRole('navigation'); - await screen.findByText('10 / 57'); + await screen.findByText('10 / 50'); }); it('should link to the edit view by default', async () => { render(); - const row = await screen.findByText('Deja'); + const row = await screen.findByText('first_name_0'); fireEvent.click(row); fireEvent.click(await screen.findByLabelText('Edit')); const next = await screen.findByLabelText('Go to next page'); @@ -90,7 +90,7 @@ describe('', () => { describe('linkType', () => { it('should link to the show view when linkType is show', async () => { render(); - const row = await screen.findByText('Deja'); + const row = await screen.findByText('first_name_0'); fireEvent.click(row); const next = await screen.findByLabelText('Go to next page'); fireEvent.click(next); @@ -102,10 +102,10 @@ describe('', () => { describe('filter', () => { it('should render a total based on filter', async () => { render(); - const item = await screen.findByText('822'); + const item = await screen.findByText('first_name_5'); fireEvent.click(item); await screen.findByRole('navigation'); - expect(screen.getByText('1 / 5')).toBeDefined(); + expect(screen.getByText('5 / 50')).toBeDefined(); }); }); @@ -119,16 +119,16 @@ describe('', () => { it('should limit the number of items fetched from the data provider', async () => { const data = { customers: Array.from(Array(900).keys()).map(id => { - const first_name = name.firstName(); - const last_name = name.lastName(); - const email = internet.email(first_name, last_name); + const first_name = `first_name_${id}`; + const last_name = `last_name_${id}`; + const email = `first_name_${id}.last_name_${id}@example.com`; return { id, first_name, last_name, email, - city: address.city(), + city: `city_${id}`, }; }), }; @@ -151,49 +151,49 @@ describe('', () => { describe('pagination', () => { it('should compute the index correctly when opening first record of page 2', async () => { render(); - await screen.findByText('Deja'); + await screen.findByText('first_name_1'); fireEvent.click(await screen.findByLabelText('Go to page 2')); - const tr = await screen.findByText('Hamill'); + const tr = await screen.findByText('first_name_10'); fireEvent.click(tr); await screen.findByText('11 / 900'); }); it('should compute the index correctly when opening second record of page 2', async () => { render(); - await screen.findByText('Deja'); + await screen.findByText('first_name_1'); fireEvent.click(await screen.findByLabelText('Go to page 2')); - const tr = await screen.findByText('Kub'); + const tr = await screen.findByText('first_name_11'); fireEvent.click(tr); await screen.findByText('12 / 900'); }); it('should compute the index correctly when opening last record of page 2', async () => { render(); - await screen.findByText('Deja'); + await screen.findByText('first_name_1'); fireEvent.click(await screen.findByLabelText('Go to page 2')); - const tr = await screen.findByText('Langworth'); + const tr = await screen.findByText('first_name_19'); fireEvent.click(tr); await screen.findByText('20 / 900'); }); it('should compute the index correctly when opening first record of page 3', async () => { render(); - await screen.findByText('Deja'); + await screen.findByText('first_name_1'); fireEvent.click(await screen.findByLabelText('Go to page 3')); - const tr = await screen.findByText('Spinka'); + const tr = await screen.findByText('first_name_20'); fireEvent.click(tr); await screen.findByText('21 / 900'); }); it('should compute the index correctly when opening second record of page 3', async () => { render(); - await screen.findByText('Deja'); + await screen.findByText('first_name_5'); fireEvent.click(await screen.findByLabelText('Go to page 3')); - const tr = await screen.findByText('Lowe'); + const tr = await screen.findByText('first_name_21'); fireEvent.click(tr); await screen.findByText('22 / 900'); }); it('should compute the index correctly when opening last record of page 3', async () => { render(); - await screen.findByText('Deja'); + await screen.findByText('first_name_5'); fireEvent.click(await screen.findByLabelText('Go to page 3')); - const tr = await screen.findByText('Grimes'); + const tr = await screen.findByText('first_name_29'); fireEvent.click(tr); await screen.findByText('30 / 900'); }); diff --git a/packages/ra-ui-materialui/src/button/PrevNextButtons.stories.tsx b/packages/ra-ui-materialui/src/button/PrevNextButtons.stories.tsx index bd7cd6058bb..bf33081d380 100644 --- a/packages/ra-ui-materialui/src/button/PrevNextButtons.stories.tsx +++ b/packages/ra-ui-materialui/src/button/PrevNextButtons.stories.tsx @@ -9,7 +9,6 @@ import { } from 'ra-core'; import englishMessages from 'ra-language-english'; import polyglotI18nProvider from 'ra-i18n-polyglot'; -import { seed, address, internet, name } from 'faker/locale/en_GB'; import { QueryClient } from '@tanstack/react-query'; import { @@ -32,20 +31,26 @@ export default { title: 'ra-ui-materialui/button/PrevNextButtons' }; const i18nProvider = polyglotI18nProvider(() => englishMessages, 'en'); -seed(123); // we want consistent results +let cityCounter = 0; +let city = `city_${cityCounter}`; const data = { - customers: Array.from(Array(900).keys()).map(id => { - const first_name = name.firstName(); - const last_name = name.lastName(); - const email = internet.email(first_name, last_name); + customers: Array.from(Array(900).keys()).map((id, index) => { + const first_name = `first_name_${id}`; + const last_name = `last_name_${id}`; + const email = `email_${id}@example.com`; + // Increment city every 50 records + if (index % 50 === 0 && index !== 0) { + cityCounter += 1; + city = `city_${cityCounter}`; + } return { id, first_name, last_name, email, - city: address.city(), + city, }; }), }; @@ -159,7 +164,7 @@ export const WithFilter = () => ( name="customers" list={ } @@ -172,7 +177,7 @@ export const WithFilter = () => ( field: 'first_name', order: 'DESC', }} - filter={{ city_q: 'East A' }} + filter={{ city_q: 'city_0' }} /> @@ -189,7 +194,7 @@ export const WithFilter = () => ( field: 'first_name', order: 'DESC', }} - filter={{ city_q: 'East A' }} + filter={{ city_q: 'city_0' }} /> diff --git a/packages/ra-ui-materialui/src/field/FileField.tsx b/packages/ra-ui-materialui/src/field/FileField.tsx index 505cc0e8776..b18d45274f9 100644 --- a/packages/ra-ui-materialui/src/field/FileField.tsx +++ b/packages/ra-ui-materialui/src/field/FileField.tsx @@ -6,7 +6,7 @@ import { type Theme, useThemeProps, } from '@mui/material/styles'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import Typography from '@mui/material/Typography'; import { type ExtractRecordPaths, diff --git a/packages/ra-ui-materialui/src/field/ImageField.tsx b/packages/ra-ui-materialui/src/field/ImageField.tsx index ba987cd283f..5e0f8c63774 100644 --- a/packages/ra-ui-materialui/src/field/ImageField.tsx +++ b/packages/ra-ui-materialui/src/field/ImageField.tsx @@ -7,7 +7,7 @@ import { useThemeProps, } from '@mui/material/styles'; import { Box, Typography } from '@mui/material'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { type ExtractRecordPaths, type HintedString, diff --git a/packages/ra-ui-materialui/src/field/ReferenceManyCount.tsx b/packages/ra-ui-materialui/src/field/ReferenceManyCount.tsx index 88c3aa36944..94d33152843 100644 --- a/packages/ra-ui-materialui/src/field/ReferenceManyCount.tsx +++ b/packages/ra-ui-materialui/src/field/ReferenceManyCount.tsx @@ -14,7 +14,7 @@ import { useThemeProps, } from '@mui/material/styles'; import ErrorIcon from '@mui/icons-material/Error'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { FieldProps } from './types'; import { sanitizeFieldRestProps } from './sanitizeFieldRestProps'; diff --git a/packages/ra-ui-materialui/src/form/TabbedForm.tsx b/packages/ra-ui-materialui/src/form/TabbedForm.tsx index dfb6ce494ff..46a5f978382 100644 --- a/packages/ra-ui-materialui/src/form/TabbedForm.tsx +++ b/packages/ra-ui-materialui/src/form/TabbedForm.tsx @@ -7,7 +7,7 @@ import { HtmlHTMLAttributes, } from 'react'; import { Form, FormProps, MutationMode, RaRecord } from 'ra-core'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { TabbedFormView, TabbedFormViewProps } from './TabbedFormView'; import { useFormRootPath } from './useFormRootPath'; diff --git a/packages/ra-ui-materialui/src/form/index.tsx b/packages/ra-ui-materialui/src/form/index.ts similarity index 100% rename from packages/ra-ui-materialui/src/form/index.tsx rename to packages/ra-ui-materialui/src/form/index.ts diff --git a/packages/ra-ui-materialui/src/index.ts b/packages/ra-ui-materialui/src/index.ts index 811508dd4e3..f2ec1ddb1d2 100644 --- a/packages/ra-ui-materialui/src/index.ts +++ b/packages/ra-ui-materialui/src/index.ts @@ -1,3 +1,4 @@ +import type {} from '@mui/material/themeCssVarsAugmentation'; export * from './auth'; export * from './button'; export * from './theme'; diff --git a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx index 3ec36a14316..6c3ae245baf 100644 --- a/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx +++ b/packages/ra-ui-materialui/src/input/ArrayInput/SimpleFormIterator.tsx @@ -20,7 +20,7 @@ import { useEvent, useGetArrayInputNewItemDefaults, } from 'ra-core'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { SimpleFormIteratorClasses, diff --git a/packages/ra-ui-materialui/src/input/AutocompleteInput.tsx b/packages/ra-ui-materialui/src/input/AutocompleteInput.tsx index 3a84dce2582..5e451577f63 100644 --- a/packages/ra-ui-materialui/src/input/AutocompleteInput.tsx +++ b/packages/ra-ui-materialui/src/input/AutocompleteInput.tsx @@ -8,9 +8,9 @@ import { useState, type ReactNode, } from 'react'; -import debounce from 'lodash/debounce'; -import get from 'lodash/get'; -import isEqual from 'lodash/isEqual'; +import debounce from 'lodash/debounce.js'; +import get from 'lodash/get.js'; +import isEqual from 'lodash/isEqual.js'; import clsx from 'clsx'; import { Autocomplete, diff --git a/packages/ra-ui-materialui/src/input/CheckboxGroupInput.tsx b/packages/ra-ui-materialui/src/input/CheckboxGroupInput.tsx index b1a155c85f7..cd186fab7a3 100644 --- a/packages/ra-ui-materialui/src/input/CheckboxGroupInput.tsx +++ b/packages/ra-ui-materialui/src/input/CheckboxGroupInput.tsx @@ -6,7 +6,7 @@ import { } from '@mui/material/styles'; import clsx from 'clsx'; import { useCallback } from 'react'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { type CheckboxProps, FormLabel, diff --git a/packages/ra-ui-materialui/src/input/DateInput.stories.tsx b/packages/ra-ui-materialui/src/input/DateInput.stories.tsx index 1b94491ff44..22b09a83cfd 100644 --- a/packages/ra-ui-materialui/src/input/DateInput.stories.tsx +++ b/packages/ra-ui-materialui/src/input/DateInput.stories.tsx @@ -5,7 +5,7 @@ import { minValue, useRecordContext } from 'ra-core'; import { useFormContext, useWatch } from 'react-hook-form'; import { Box, Button, createTheme, Typography } from '@mui/material'; import { ThemeOptions } from '@mui/material/styles'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { AdminContext } from '../AdminContext'; import { Create } from '../detail'; diff --git a/packages/ra-ui-materialui/src/input/DateTimeInput.stories.tsx b/packages/ra-ui-materialui/src/input/DateTimeInput.stories.tsx index 16441805db7..49f3e6d889a 100644 --- a/packages/ra-ui-materialui/src/input/DateTimeInput.stories.tsx +++ b/packages/ra-ui-materialui/src/input/DateTimeInput.stories.tsx @@ -5,7 +5,7 @@ import { useRecordContext } from 'ra-core'; import { useFormContext, useWatch } from 'react-hook-form'; import { Box, Button, createTheme, Typography } from '@mui/material'; import { ThemeOptions } from '@mui/material/styles'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { AdminContext } from '../AdminContext'; import { Create } from '../detail'; diff --git a/packages/ra-ui-materialui/src/input/InPlaceEditor/InPlaceEditor.tsx b/packages/ra-ui-materialui/src/input/InPlaceEditor/InPlaceEditor.tsx index 53ce1d9130f..d8756b61b12 100644 --- a/packages/ra-ui-materialui/src/input/InPlaceEditor/InPlaceEditor.tsx +++ b/packages/ra-ui-materialui/src/input/InPlaceEditor/InPlaceEditor.tsx @@ -11,7 +11,7 @@ import { type UseUpdateOptions, type RaRecord, } from 'ra-core'; -import isEqual from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual.js'; import { styled } from '@mui/material/styles'; import { Box, IconButton, type SxProps } from '@mui/material'; import SaveIcon from '@mui/icons-material/Save'; diff --git a/packages/ra-ui-materialui/src/input/RadioButtonGroupInput.tsx b/packages/ra-ui-materialui/src/input/RadioButtonGroupInput.tsx index d94a9662c5b..082d77e55ec 100644 --- a/packages/ra-ui-materialui/src/input/RadioButtonGroupInput.tsx +++ b/packages/ra-ui-materialui/src/input/RadioButtonGroupInput.tsx @@ -13,7 +13,7 @@ import { RadioGroup, type RadioGroupProps, } from '@mui/material'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { useInput, FieldTitle, diff --git a/packages/ra-ui-materialui/src/input/useSupportCreateSuggestion.tsx b/packages/ra-ui-materialui/src/input/useSupportCreateSuggestion.tsx index 17f3e3887ac..36b0ec4e9fe 100644 --- a/packages/ra-ui-materialui/src/input/useSupportCreateSuggestion.tsx +++ b/packages/ra-ui-materialui/src/input/useSupportCreateSuggestion.tsx @@ -9,7 +9,7 @@ import { useState, } from 'react'; import { Identifier, OptionText, useTranslate } from 'ra-core'; -import set from 'lodash/set'; +import set from 'lodash/set.js'; /** * This hook provides support for suggestion creation in inputs which have choices. diff --git a/packages/ra-ui-materialui/src/layout/Menu.tsx b/packages/ra-ui-materialui/src/layout/Menu.tsx index 53b7ddf91ea..7dba3f00df5 100644 --- a/packages/ra-ui-materialui/src/layout/Menu.tsx +++ b/packages/ra-ui-materialui/src/layout/Menu.tsx @@ -6,7 +6,7 @@ import { styled, useThemeProps, } from '@mui/material/styles'; -import lodashGet from 'lodash/get'; +import lodashGet from 'lodash/get.js'; import clsx from 'clsx'; import { DRAWER_WIDTH, CLOSED_DRAWER_WIDTH } from './Sidebar'; diff --git a/packages/ra-ui-materialui/src/layout/Sidebar.tsx b/packages/ra-ui-materialui/src/layout/Sidebar.tsx index 03ddac86f77..ac85d0ebe33 100644 --- a/packages/ra-ui-materialui/src/layout/Sidebar.tsx +++ b/packages/ra-ui-materialui/src/layout/Sidebar.tsx @@ -13,7 +13,7 @@ import { type Theme, useScrollTrigger, } from '@mui/material'; -import lodashGet from 'lodash/get'; +import lodashGet from 'lodash/get.js'; import { useLocale } from 'ra-core'; import { useSidebarState } from './useSidebarState'; diff --git a/packages/ra-ui-materialui/src/list/datagrid/Datagrid.tsx b/packages/ra-ui-materialui/src/list/datagrid/Datagrid.tsx index 95b0be7aa57..39afb5c36b4 100644 --- a/packages/ra-ui-materialui/src/list/datagrid/Datagrid.tsx +++ b/packages/ra-ui-materialui/src/list/datagrid/Datagrid.tsx @@ -24,8 +24,8 @@ import { } from 'ra-core'; import { Table, TableProps, SxProps, useThemeProps } from '@mui/material'; import clsx from 'clsx'; -import union from 'lodash/union'; -import difference from 'lodash/difference'; +import union from 'lodash/union.js'; +import difference from 'lodash/difference.js'; import { DatagridHeader } from './DatagridHeader'; import DatagridLoading from './DatagridLoading'; diff --git a/packages/ra-ui-materialui/src/list/datagrid/useDatagridContext.ts b/packages/ra-ui-materialui/src/list/datagrid/useDatagridContext.ts index efda342d335..c9b130eb3b0 100644 --- a/packages/ra-ui-materialui/src/list/datagrid/useDatagridContext.ts +++ b/packages/ra-ui-materialui/src/list/datagrid/useDatagridContext.ts @@ -1,7 +1,7 @@ import { useContext, useMemo } from 'react'; import { DatagridProps } from './Datagrid'; import DatagridContext, { DatagridContextValue } from './DatagridContext'; -import defaults from 'lodash/defaults'; +import defaults from 'lodash/defaults.js'; export const useDatagridContext = ( props?: DatagridProps diff --git a/packages/ra-ui-materialui/src/list/datatable/DataTableCell.tsx b/packages/ra-ui-materialui/src/list/datatable/DataTableCell.tsx index 7def5212002..20a52019972 100644 --- a/packages/ra-ui-materialui/src/list/datatable/DataTableCell.tsx +++ b/packages/ra-ui-materialui/src/list/datatable/DataTableCell.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { useDataTableStoreContext, useRecordContext, useStore } from 'ra-core'; import { TableCell, useThemeProps, type SxProps } from '@mui/material'; import { type ComponentsOverrides, styled } from '@mui/material/styles'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import clsx from 'clsx'; import { DataTableColumnProps } from './DataTableColumn'; diff --git a/packages/ra-ui-materialui/src/list/filter/FilterButton.tsx b/packages/ra-ui-materialui/src/list/filter/FilterButton.tsx index 423789528de..746f1d8b83d 100644 --- a/packages/ra-ui-materialui/src/list/filter/FilterButton.tsx +++ b/packages/ra-ui-materialui/src/list/filter/FilterButton.tsx @@ -22,7 +22,7 @@ import BookmarkAddIcon from '@mui/icons-material/BookmarkAdd'; import BookmarkRemoveIcon from '@mui/icons-material/BookmarkRemove'; import BookmarkBorderIcon from '@mui/icons-material/BookmarkBorder'; import ContentFilter from '@mui/icons-material/FilterList'; -import isEqual from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual.js'; import { useFilterContext, useListContext, diff --git a/packages/ra-ui-materialui/src/list/filter/FilterForm.tsx b/packages/ra-ui-materialui/src/list/filter/FilterForm.tsx index 9f428191809..e9e7b463d69 100644 --- a/packages/ra-ui-materialui/src/list/filter/FilterForm.tsx +++ b/packages/ra-ui-materialui/src/list/filter/FilterForm.tsx @@ -3,7 +3,7 @@ import { styled, useThemeProps, } from '@mui/material/styles'; -import get from 'lodash/get'; +import get from 'lodash/get.js'; import { FilterLiveForm, useFilterContext, diff --git a/packages/ra-ui-materialui/src/list/filter/FilterListItem.tsx b/packages/ra-ui-materialui/src/list/filter/FilterListItem.tsx index 6db7a8d01b3..fc2505b437b 100644 --- a/packages/ra-ui-materialui/src/list/filter/FilterListItem.tsx +++ b/packages/ra-ui-materialui/src/list/filter/FilterListItem.tsx @@ -22,8 +22,8 @@ import { shallowEqual, useEvent, } from 'ra-core'; -import matches from 'lodash/matches'; -import pickBy from 'lodash/pickBy'; +import matches from 'lodash/matches.js'; +import pickBy from 'lodash/pickBy.js'; const arePropsEqual = (prevProps, nextProps) => prevProps.label === nextProps.label && diff --git a/packages/ra-ui-materialui/src/list/filter/RemoveSavedQueryDialog.tsx b/packages/ra-ui-materialui/src/list/filter/RemoveSavedQueryDialog.tsx index 156846e1d9b..608e60f053d 100644 --- a/packages/ra-ui-materialui/src/list/filter/RemoveSavedQueryDialog.tsx +++ b/packages/ra-ui-materialui/src/list/filter/RemoveSavedQueryDialog.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { ReactElement } from 'react'; -import isEqual from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual.js'; import { useListContext, useTranslate } from 'ra-core'; import { Button, diff --git a/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.stories.tsx b/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.stories.tsx index 1e176030406..a82de620e11 100644 --- a/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.stories.tsx +++ b/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.stories.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import merge from 'lodash/merge'; +import merge from 'lodash/merge.js'; import { Admin, diff --git a/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.tsx b/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.tsx index 228a439db8b..594d3858c36 100644 --- a/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.tsx +++ b/packages/ra-ui-materialui/src/list/filter/SavedQueriesList.tsx @@ -9,7 +9,7 @@ import { import BookmarkIcon from '@mui/icons-material/BookmarkBorder'; import HelpIcon from '@mui/icons-material/HelpOutline'; import { useListContext, useTranslate } from 'ra-core'; -import isEqual from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual.js'; import { extractValidSavedQueries, useSavedQueries } from './useSavedQueries'; import { RemoveSavedQueryIconButton } from './RemoveSavedQueryIconButton'; diff --git a/packages/ra-ui-materialui/src/list/filter/SavedQueryFilterListItem.tsx b/packages/ra-ui-materialui/src/list/filter/SavedQueryFilterListItem.tsx index bf2e85e9a98..eb5a11da1fb 100644 --- a/packages/ra-ui-materialui/src/list/filter/SavedQueryFilterListItem.tsx +++ b/packages/ra-ui-materialui/src/list/filter/SavedQueryFilterListItem.tsx @@ -12,7 +12,7 @@ import { useThemeProps, } from '@mui/material'; import CancelIcon from '@mui/icons-material/CancelOutlined'; -import isEqual from 'lodash/isEqual'; +import isEqual from 'lodash/isEqual.js'; import { useNavigate } from 'react-router-dom'; import { stringify } from 'query-string'; import { useListContext } from 'ra-core'; diff --git a/packages/ra-ui-materialui/src/mui.d.ts b/packages/ra-ui-materialui/src/mui.d.ts deleted file mode 100644 index 88a8176a131..00000000000 --- a/packages/ra-ui-materialui/src/mui.d.ts +++ /dev/null @@ -1 +0,0 @@ -import type {} from '@mui/material/themeCssVarsAugmentation'; diff --git a/packages/ra-ui-materialui/tsconfig.json b/packages/ra-ui-materialui/tsconfig.json index d0d5a4fa45e..fb8bc0bb30f 100644 --- a/packages/ra-ui-materialui/tsconfig.json +++ b/packages/ra-ui-materialui/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "strictNullChecks": true }, diff --git a/packages/react-admin/package.json b/packages/react-admin/package.json index 2990f04056e..008ad2b3c20 100644 --- a/packages/react-admin/package.json +++ b/packages/react-admin/package.json @@ -7,9 +7,11 @@ "dist", "src" ], - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/cjs/index.d.ts", + "zshy": "./src/index.ts", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.cts", + "type": "module", "sideEffects": false, "authors": [ "François Zaninotto" @@ -19,19 +21,15 @@ "bugs": "https://github.com/marmelab/react-admin/issues", "license": "MIT", "scripts": { - "build": "yarn run build-cjs && yarn run build-esm", - "build-cjs": "rimraf ./dist/cjs && tsc --outDir dist/cjs", - "build-esm": "rimraf ./dist/esm && tsc --outDir dist/esm --module es2015", - "watch": "tsc --outDir dist/esm --module es2015 --watch" + "build": "zshy" }, "devDependencies": { "@tanstack/react-query": "^5.90.2", - "cross-env": "^5.2.0", "expect": "^27.4.6", "react-router": "^6.28.1", "react-router-dom": "^6.28.1", - "rimraf": "^3.0.2", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "zshy": "^0.4.4" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", @@ -51,5 +49,12 @@ "react-router": "^6.28.1 || ^7.1.1", "react-router-dom": "^6.28.1 || ^7.1.1" }, - "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7" + "gitHead": "587df4c27bfcec4a756df4f95e5fc14728dfc0d7", + "exports": { + ".": { + "types": "./dist/index.d.cts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } } diff --git a/packages/react-admin/tsconfig.json b/packages/react-admin/tsconfig.json index a18665f388c..57c68223c8b 100644 --- a/packages/react-admin/tsconfig.json +++ b/packages/react-admin/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "lib", + "outDir": "dist", "rootDir": "src", "allowJs": false }, diff --git a/yarn.lock b/yarn.lock index 1fec90be30c..f59da5cc333 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2272,6 +2272,13 @@ __metadata: languageName: node linkType: hard +"@faker-js/faker@npm:^10.0.0": + version: 10.0.0 + resolution: "@faker-js/faker@npm:10.0.0" + checksum: 7692f21cad661cd0cb150d72d4dff79322c892923c97a263c12ae74de45739306bea4e2630e8ac852dd4395ead2cb76be3715011395256c56e8a9b39acdcb97a + languageName: node + linkType: hard + "@gar/promisify@npm:^1.0.1, @gar/promisify@npm:^1.1.3": version: 1.1.3 resolution: "@gar/promisify@npm:1.1.3" @@ -5865,13 +5872,6 @@ __metadata: languageName: node linkType: hard -"@types/faker@npm:^5.1.7": - version: 5.5.9 - resolution: "@types/faker@npm:5.5.9" - checksum: 2c1e2de0709a9eab249904a3fdf69ad2b2a8233187b9547ee1a081ae25867382bae5f47bbc6fc80929fd8464564783b783e77d1196d0111cc3773e0343005c66 - languageName: node - linkType: hard - "@types/fontkit@npm:^2.0.8": version: 2.0.8 resolution: "@types/fontkit@npm:2.0.8" @@ -7081,15 +7081,15 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.9.0": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" +"ajv@npm:^8.0.0, ajv@npm:^8.0.1, ajv@npm:^8.9.0": + version: 8.17.1 + resolution: "ajv@npm:8.17.1" dependencies: - fast-deep-equal: "npm:^3.1.1" + fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e + checksum: ec3ba10a573c6b60f94639ffc53526275917a2df6810e4ab5a6b959d87459f9ef3f00d5e7865b82677cb7d21590355b34da14d1d0b9c32d75f95a187e76fff35 languageName: node linkType: hard @@ -7216,7 +7216,7 @@ __metadata: languageName: node linkType: hard -"arg@npm:^5.0.0": +"arg@npm:^5.0.0, arg@npm:^5.0.2": version: 5.0.2 resolution: "arg@npm:5.0.2" checksum: ccaf86f4e05d342af6666c569f844bec426595c567d32a8289715087825c2ca7edd8a3d204e4d2fb2aa4602e09a57d0c13ea8c9eea75aac3dbb4af5514e6800e @@ -9592,12 +9592,11 @@ __metadata: version: 0.0.0-use.local resolution: "data-generator-retail@workspace:examples/data-generator" dependencies: - cross-env: "npm:^5.2.0" + "@faker-js/faker": "npm:^10.0.0" date-fns: "npm:^3.6.0" - faker: "npm:^4.1.0" ra-core: "npm:^5.12.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: ra-core: ^5.0.0 languageName: unknown @@ -11450,20 +11449,6 @@ __metadata: languageName: node linkType: hard -"faker@npm:^4.1.0": - version: 4.1.0 - resolution: "faker@npm:4.1.0" - checksum: eaa96a7db715451128c4641c6df148b53ac80b863a64a16e9d7d416dd7b1fac53b5d02a300a3d36168467edb8a4ce2a169af2d820df7915ed0732044d997a50a - languageName: node - linkType: hard - -"faker@npm:~5.4.0": - version: 5.4.0 - resolution: "faker@npm:5.4.0" - checksum: 9af664eac6f97d3eaeffe8cdb6e172f410d7675d0573c2cfc1baf794817adba6717014b4aec157e256451bb36a8f0e11efbc95795749b7641cbeaaa5128a54b7 - languageName: node - linkType: hard - "fakerest@npm:4.1.3, fakerest@npm:^4.0.1, fakerest@npm:^4.1.1, fakerest@npm:^4.1.3": version: 4.1.3 resolution: "fakerest@npm:4.1.3" @@ -11528,6 +11513,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: 44364adca566f70f40d1e9b772c923138d47efeac2ae9732a872baafd77061f26b097ba2f68f0892885ad177becd065520412b8ffeec34b16c99433c5b9e2de7 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": version: 1.13.0 resolution: "fastq@npm:1.13.0" @@ -15749,6 +15741,13 @@ __metadata: languageName: node linkType: hard +"lodash.truncate@npm:^4.4.2": + version: 4.4.2 + resolution: "lodash.truncate@npm:4.4.2" + checksum: 4e870d54e8a6c86c8687e057cec4069d2e941446ccab7f40b4d9555fa5872d917d0b6aa73bece7765500a3123f1723bcdba9ae881b679ef120bba9e1a0b0ed70 + languageName: node + linkType: hard + "lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:~4.17.5": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -19291,7 +19290,6 @@ __metadata: "@types/node": "npm:^20.10.7" "@types/node-polyglot": "npm:^0.4.31" "@types/react": "npm:^18.3.3" - cross-env: "npm:^5.2.0" date-fns: "npm:^3.6.0" echarts: "npm:^5.6.0" eventemitter3: "npm:^5.0.1" @@ -19309,10 +19307,10 @@ __metadata: react-is: "npm:^18.2.0 || ^19.0.0" react-router: "npm:^6.28.1" react-router-dom: "npm:^6.28.1" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" yup: "npm:^0.32.11" zod: "npm:^3.22.1" + zshy: "npm:^0.4.4" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -19327,12 +19325,11 @@ __metadata: resolution: "ra-data-fakerest@workspace:packages/ra-data-fakerest" dependencies: "@types/jest": "npm:^29.5.2" - cross-env: "npm:^5.2.0" expect: "npm:^27.4.6" fakerest: "npm:^4.0.1" ra-core: "npm:^5.12.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: ra-core: ^5.0.0 languageName: unknown @@ -19343,14 +19340,13 @@ __metadata: resolution: "ra-data-graphql-simple@workspace:packages/ra-data-graphql-simple" dependencies: "@apollo/client": "npm:^3.3.19" - cross-env: "npm:^5.2.0" graphql: "npm:^15.6.0" graphql-ast-types-browser: "npm:~1.0.2" lodash: "npm:~4.17.5" pluralize: "npm:~7.0.0" ra-data-graphql: "npm:^5.12.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: graphql: ^15.6.0 ra-core: ^5.0.0 @@ -19362,13 +19358,12 @@ __metadata: resolution: "ra-data-graphql@workspace:packages/ra-data-graphql" dependencies: "@apollo/client": "npm:^3.3.19" - cross-env: "npm:^5.2.0" graphql: "npm:^15.6.0" graphql-tag: "npm:^2.12.6" lodash: "npm:~4.17.5" pluralize: "npm:~7.0.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: graphql: ^15.6.0 || ^16 ra-core: ^5.0.0 @@ -19379,11 +19374,10 @@ __metadata: version: 0.0.0-use.local resolution: "ra-data-json-server@workspace:packages/ra-data-json-server" dependencies: - cross-env: "npm:^5.2.0" query-string: "npm:^7.1.3" ra-core: "npm:^5.12.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" languageName: unknown linkType: soft @@ -19391,12 +19385,11 @@ __metadata: version: 0.0.0-use.local resolution: "ra-data-local-forage@workspace:packages/ra-data-local-forage" dependencies: - cross-env: "npm:^5.2.0" localforage: "npm:^1.7.1" lodash: "npm:~4.17.5" ra-data-fakerest: "npm:^5.12.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: ra-core: "*" languageName: unknown @@ -19406,11 +19399,10 @@ __metadata: version: 0.0.0-use.local resolution: "ra-data-local-storage@workspace:packages/ra-data-local-storage" dependencies: - cross-env: "npm:^5.2.0" lodash: "npm:~4.17.5" ra-data-fakerest: "npm:^5.12.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: ra-core: "*" languageName: unknown @@ -19420,11 +19412,10 @@ __metadata: version: 0.0.0-use.local resolution: "ra-data-simple-rest@workspace:packages/ra-data-simple-rest" dependencies: - cross-env: "npm:^5.2.0" query-string: "npm:^7.1.3" ra-core: "npm:^5.12.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: ra-core: ^5.0.0 languageName: unknown @@ -19434,7 +19425,6 @@ __metadata: version: 0.0.0-use.local resolution: "ra-i18n-i18next@workspace:packages/ra-i18n-i18next" dependencies: - cross-env: "npm:^5.2.0" i18next: "npm:^23.5.1" i18next-resources-to-backend: "npm:^1.1.4" lodash: "npm:^4.17.21" @@ -19442,8 +19432,8 @@ __metadata: ra-language-english: "npm:^5.12.0" ra-language-french: "npm:^5.12.0" react-i18next: "npm:^14.1.1" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: react: ^18.0.0 || ^19.0.0 languageName: unknown @@ -19453,11 +19443,10 @@ __metadata: version: 0.0.0-use.local resolution: "ra-i18n-polyglot@workspace:packages/ra-i18n-polyglot" dependencies: - cross-env: "npm:^5.2.0" node-polyglot: "npm:^2.2.2" ra-core: "npm:^5.12.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" languageName: unknown linkType: soft @@ -19490,9 +19479,9 @@ __metadata: react: "npm:^18.3.1" react-dom: "npm:^18.3.1" react-hook-form: "npm:^7.53.0" - rimraf: "npm:^3.0.2" tippy.js: "npm:^6.3.7" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: "@mui/icons-material": ^5.16.12 || ^6.0.0 || ^7.0.0 "@mui/material": ^5.16.12 || ^6.0.0 || ^7.0.0 @@ -19508,8 +19497,8 @@ __metadata: resolution: "ra-language-english@workspace:packages/ra-language-english" dependencies: ra-core: "npm:^5.12.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" languageName: unknown linkType: soft @@ -19518,8 +19507,8 @@ __metadata: resolution: "ra-language-french@workspace:packages/ra-language-french" dependencies: ra-core: "npm:^5.12.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" languageName: unknown linkType: soft @@ -19531,7 +19520,6 @@ __metadata: "@testing-library/react": "npm:^15.0.7" "@testing-library/user-event": "npm:^14.5.2" clsx: "npm:^2.1.1" - cross-env: "npm:^5.2.0" date-fns: "npm:^3.6.0" inflection: "npm:^3.0.0" lodash: "npm:~4.17.5" @@ -19543,8 +19531,8 @@ __metadata: react-dropzone: "npm:^14.2.3" react-router: "npm:^6.22.0" react-router-dom: "npm:^6.22.0" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: "@mui/icons-material": ^5.16.12 || ^6.0.0 || ^7.0.0 "@mui/material": ^5.16.12 || ^6.0.0 || ^7.0.0 @@ -19557,6 +19545,7 @@ __metadata: version: 0.0.0-use.local resolution: "ra-ui-materialui@workspace:packages/ra-ui-materialui" dependencies: + "@faker-js/faker": "npm:^10.0.0" "@mui/icons-material": "npm:^5.16.12" "@mui/material": "npm:^5.16.12" "@mui/system": "npm:^5.16.12" @@ -19570,7 +19559,6 @@ __metadata: "@types/react-transition-group": "npm:^4.4.10" autosuggest-highlight: "npm:^3.1.1" clsx: "npm:^2.1.1" - cross-env: "npm:^5.2.0" css-mediaquery: "npm:^0.1.2" csstype: "npm:^3.1.3" diacritic: "npm:^0.0.2" @@ -19595,8 +19583,8 @@ __metadata: react-router: "npm:^6.28.1" react-router-dom: "npm:^6.28.1" react-transition-group: "npm:^4.4.5" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: "@mui/icons-material": ^5.16.12 || ^6.0.0 || ^7.0.0 "@mui/material": ^5.16.12 || ^6.0.0 || ^7.0.0 @@ -19668,6 +19656,7 @@ __metadata: version: 0.0.0-use.local resolution: "react-admin-crm@workspace:examples/crm" dependencies: + "@faker-js/faker": "npm:^10.0.0" "@hello-pangea/dnd": "npm:^16.3.0" "@mui/icons-material": "npm:^5.16.12" "@mui/material": "npm:^5.16.12" @@ -19676,7 +19665,6 @@ __metadata: "@testing-library/jest-dom": "npm:^6.4.5" "@testing-library/react": "npm:^15.0.7" "@testing-library/user-event": "npm:^14.5.2" - "@types/faker": "npm:^5.1.7" "@types/jest": "npm:^29.5.2" "@types/jsonexport": "npm:^3.0.5" "@types/lodash": "npm:~4.14.168" @@ -19686,7 +19674,6 @@ __metadata: "@vitejs/plugin-react": "npm:^4.3.4" clsx: "npm:^2.1.1" date-fns: "npm:^3.6.0" - faker: "npm:~5.4.0" fakerest: "npm:4.1.3" lodash: "npm:~4.17.5" papaparse: "npm:^5.4.1" @@ -19783,7 +19770,6 @@ __metadata: "@mui/icons-material": "npm:^5.16.12 || ^6.0.0 || ^7.0.0" "@mui/material": "npm:^5.16.12 || ^6.0.0 || ^7.0.0" "@tanstack/react-query": "npm:^5.90.2" - cross-env: "npm:^5.2.0" expect: "npm:^27.4.6" ra-core: "npm:^5.12.0" ra-i18n-polyglot: "npm:^5.12.0" @@ -19792,8 +19778,8 @@ __metadata: react-hook-form: "npm:^7.53.0" react-router: "npm:^6.28.1" react-router-dom: "npm:^6.28.1" - rimraf: "npm:^3.0.2" typescript: "npm:^5.1.3" + zshy: "npm:^0.4.4" peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 @@ -22345,6 +22331,19 @@ __metadata: languageName: node linkType: hard +"table@npm:^6.9.0": + version: 6.9.0 + resolution: "table@npm:6.9.0" + dependencies: + ajv: "npm:^8.0.1" + lodash.truncate: "npm:^4.4.2" + slice-ansi: "npm:^4.0.0" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + checksum: 35646185712bb65985fbae5975dda46696325844b78735f95faefae83e86df0a265277819a3e67d189de6e858c509b54e66ca3958ffd51bde56ef1118d455bf4 + languageName: node + linkType: hard + "tailwindcss@npm:4.1.11, tailwindcss@npm:^4.1.11": version: 4.1.11 resolution: "tailwindcss@npm:4.1.11" @@ -24517,6 +24516,21 @@ __metadata: languageName: node linkType: hard +"zshy@npm:^0.4.4": + version: 0.4.4 + resolution: "zshy@npm:0.4.4" + dependencies: + arg: "npm:^5.0.2" + fast-glob: "npm:^3.3.2" + table: "npm:^6.9.0" + peerDependencies: + typescript: ">5.5.0" + bin: + zshy: dist/index.cjs + checksum: 44965341c9c95a81da8a25f7d331669e53a041b7bdd5274111db03d39d7122cb4eb7e8a70b10832157cae6f580a32745153e7f3aadf7f7e43b3268e2950023c5 + languageName: node + linkType: hard + "zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": version: 2.0.4 resolution: "zwitch@npm:2.0.4"