@contentful/field-editor-reference 8.3.1 → 8.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/cjs/common/useEditorPermissions.spec.js +31 -30
  2. package/dist/cjs/components/CreateEntryLinkButton/CreateEntryLinkButton.spec.js +48 -48
  3. package/dist/cjs/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.js +32 -32
  4. package/dist/cjs/components/ScheduledIconWithTooltip/formatDateAndTime.spec.js +44 -43
  5. package/dist/cjs/resources/Cards/ResourceCard.spec.js +50 -50
  6. package/dist/cjs/resources/MultipleResourceReferenceEditor.spec.js +36 -36
  7. package/dist/cjs/resources/SingleResourceReferenceEditor.spec.js +26 -26
  8. package/dist/cjs/resources/testHelpers/resourceEditorHelpers.js +6 -5
  9. package/dist/cjs/utils/getProviderName.spec.js +6 -5
  10. package/dist/esm/common/useEditorPermissions.spec.js +3 -2
  11. package/dist/esm/components/CreateEntryLinkButton/CreateEntryLinkButton.spec.js +7 -7
  12. package/dist/esm/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.js +5 -5
  13. package/dist/esm/components/ScheduledIconWithTooltip/formatDateAndTime.spec.js +4 -3
  14. package/dist/esm/resources/Cards/ResourceCard.spec.js +12 -12
  15. package/dist/esm/resources/MultipleResourceReferenceEditor.spec.js +10 -10
  16. package/dist/esm/resources/SingleResourceReferenceEditor.spec.js +11 -11
  17. package/dist/esm/resources/testHelpers/resourceEditorHelpers.js +6 -5
  18. package/dist/esm/utils/getProviderName.spec.js +1 -0
  19. package/dist/types/components/CreateEntryLinkButton/CreateEntryLinkButton.spec.d.ts +1 -1
  20. package/dist/types/components/CreateEntryLinkButton/CreateEntryMenuTrigger.spec.d.ts +1 -1
  21. package/dist/types/resources/Cards/ResourceCard.spec.d.ts +1 -1
  22. package/dist/types/resources/MultipleResourceReferenceEditor.spec.d.ts +1 -1
  23. package/dist/types/resources/SingleResourceReferenceEditor.spec.d.ts +1 -1
  24. package/package.json +6 -6
@@ -1,12 +1,13 @@
1
1
  import { createFakeFieldAPI } from '@contentful/field-editor-test-utils';
2
2
  import { renderHook } from '@testing-library/react-hooks';
3
+ import { describe, expect, it, vi } from 'vitest';
3
4
  import { useEditorPermissions } from './useEditorPermissions';
4
5
  describe('useEditorPermissions', ()=>{
5
6
  const makeFieldAppSDK = (customizeMock)=>({
6
7
  field: createFakeFieldAPI(customizeMock)[0],
7
8
  access: {
8
- can: jest.fn().mockResolvedValue(true),
9
- canPerformActionOnEntryOfType: jest.fn().mockResolvedValue(true)
9
+ can: vi.fn().mockResolvedValue(true),
10
+ canPerformActionOnEntryOfType: vi.fn().mockResolvedValue(true)
10
11
  }
11
12
  });
12
13
  const makeContentType = (id)=>({
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
- import '@testing-library/jest-dom';
3
2
  import { act, configure, fireEvent, render, waitFor, waitForElementToBeRemoved } from '@testing-library/react';
4
3
  import noop from 'lodash/noop';
4
+ import { describe, expect, it, vi } from 'vitest';
5
5
  import { CreateEntryLinkButton } from './CreateEntryLinkButton';
6
6
  configure({
7
7
  testIdAttribute: 'data-test-id'
@@ -106,7 +106,7 @@ describe('CreateEntryLinkButton with multiple entries', ()=>{
106
106
  expect(getAllByTestId('contentType')).toHaveLength(props.contentTypes.length);
107
107
  });
108
108
  it('calls onSelect after click on menu item', ()=>{
109
- const selectSpy = jest.fn();
109
+ const selectSpy = vi.fn();
110
110
  const { getByTestId, getAllByTestId } = render(/*#__PURE__*/ React.createElement(CreateEntryLinkButton, {
111
111
  ...props,
112
112
  onSelect: selectSpy
@@ -126,7 +126,7 @@ describe('CreateEntryLinkButton with a single entry', ()=>{
126
126
  }
127
127
  };
128
128
  it('should fire the onSelect function when clicked', ()=>{
129
- const onSelectStub = jest.fn();
129
+ const onSelectStub = vi.fn();
130
130
  const { getByTestId } = render(/*#__PURE__*/ React.createElement(CreateEntryLinkButton, {
131
131
  ...props,
132
132
  onSelect: onSelectStub
@@ -138,7 +138,7 @@ describe('CreateEntryLinkButton with a single entry', ()=>{
138
138
  });
139
139
  describe('CreateEntryLinkButton common', ()=>{
140
140
  it('should render a spinner if onSelect returns a promise', async ()=>{
141
- const onSelect = jest.fn(()=>new Promise((resolve)=>setTimeout(resolve, 1000)));
141
+ const onSelect = vi.fn(()=>new Promise((resolve)=>setTimeout(resolve, 1000)));
142
142
  const { getByTestId, container } = render(/*#__PURE__*/ React.createElement(CreateEntryLinkButton, {
143
143
  contentTypes: [
144
144
  CONTENT_TYPE_1
@@ -154,7 +154,7 @@ describe('CreateEntryLinkButton common', ()=>{
154
154
  expect(spinner.textContent).toMatch(/Loading/g);
155
155
  });
156
156
  it('should hide a spinner after the promise from onSelect resolves', async ()=>{
157
- const onSelect = jest.fn(()=>new Promise((resolve)=>setTimeout(resolve, 500)));
157
+ const onSelect = vi.fn(()=>new Promise((resolve)=>setTimeout(resolve, 500)));
158
158
  const { getByTestId, container } = render(/*#__PURE__*/ React.createElement(CreateEntryLinkButton, {
159
159
  contentTypes: [
160
160
  CONTENT_TYPE_1
@@ -171,7 +171,7 @@ describe('CreateEntryLinkButton common', ()=>{
171
171
  expect(getSpinner).toThrow('Unable to find an element by: [data-test-id="cf-ui-spinner"]');
172
172
  });
173
173
  it('does not emit onSelect on subsequent click before the promise from onSelect resolves', async ()=>{
174
- const onSelect = jest.fn(()=>new Promise((resolve)=>setTimeout(()=>resolve(undefined), 200)));
174
+ const onSelect = vi.fn(()=>new Promise((resolve)=>setTimeout(()=>resolve(undefined), 200)));
175
175
  const { getByTestId } = render(/*#__PURE__*/ React.createElement(CreateEntryLinkButton, {
176
176
  contentTypes: [
177
177
  CONTENT_TYPE_1
@@ -187,7 +187,7 @@ describe('CreateEntryLinkButton common', ()=>{
187
187
  expect(onSelect).toHaveBeenCalledTimes(1);
188
188
  });
189
189
  it('emits onSelect on subsequent click after the promise from onSelect resolves', async ()=>{
190
- const onSelect = jest.fn(()=>Promise.resolve());
190
+ const onSelect = vi.fn(()=>Promise.resolve());
191
191
  const { getByTestId } = render(/*#__PURE__*/ React.createElement(CreateEntryLinkButton, {
192
192
  contentTypes: [
193
193
  CONTENT_TYPE_1
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { Button } from '@contentful/f36-components';
3
- import '@testing-library/jest-dom/extend-expect';
4
3
  import { act, configure, fireEvent, render } from '@testing-library/react';
5
4
  import noop from 'lodash/noop';
5
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
6
6
  import fill from 'lodash/fill';
7
7
  import { CreateEntryMenuTrigger } from './CreateEntryMenuTrigger';
8
8
  configure({
@@ -56,9 +56,9 @@ describe('CreateEntryMenuTrigger general', ()=>{
56
56
  return Promise.resolve();
57
57
  }
58
58
  };
59
- let stub = jest.fn();
59
+ let stub = vi.fn();
60
60
  beforeEach(()=>{
61
- stub = jest.fn().mockImplementation(()=>/*#__PURE__*/ React.createElement(Button, {
61
+ stub = vi.fn().mockImplementation(()=>/*#__PURE__*/ React.createElement(Button, {
62
62
  testId: "menu-trigger"
63
63
  }));
64
64
  });
@@ -71,7 +71,7 @@ describe('CreateEntryMenuTrigger general', ()=>{
71
71
  render(/*#__PURE__*/ React.createElement(CreateEntryMenuTrigger, props, stub));
72
72
  });
73
73
  it('should set isSelecting to true in case onSelect returns a promise', async ()=>{
74
- const selectStub = jest.fn(()=>new Promise((resolve)=>setTimeout(resolve, 1000)));
74
+ const selectStub = vi.fn(()=>new Promise((resolve)=>setTimeout(resolve, 1000)));
75
75
  const { getAllByTestId, getByTestId } = render(/*#__PURE__*/ React.createElement(CreateEntryMenuTrigger, {
76
76
  ...props,
77
77
  onSelect: selectStub
@@ -85,7 +85,7 @@ describe('CreateEntryMenuTrigger general', ()=>{
85
85
  expect(selectStub).toHaveBeenCalled();
86
86
  });
87
87
  it('should not set isSelecting to true in case onSelect is sync', async ()=>{
88
- const selectStub = jest.fn();
88
+ const selectStub = vi.fn();
89
89
  const { getAllByTestId, getByTestId } = render(/*#__PURE__*/ React.createElement(CreateEntryMenuTrigger, {
90
90
  ...props,
91
91
  onSelect: selectStub
@@ -1,11 +1,12 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
1
2
  import { formatDate, formatDateAndTime, formatTime } from './formatDateAndTime';
2
3
  const TODAY = new Date('2024-06-15T12:00:00.000Z');
3
4
  beforeEach(()=>{
4
- jest.useFakeTimers();
5
- jest.setSystemTime(TODAY);
5
+ vi.useFakeTimers();
6
+ vi.setSystemTime(TODAY);
6
7
  });
7
8
  afterEach(()=>{
8
- jest.useRealTimers();
9
+ vi.useRealTimers();
9
10
  });
10
11
  describe('formatDate', ()=>{
11
12
  it('returns "Today" (short) for a date on the same calendar day', ()=>{
@@ -1,9 +1,9 @@
1
1
  import * as React from 'react';
2
- import '@testing-library/jest-dom';
3
2
  import { SharedQueryClientProvider } from '@contentful/field-editor-shared/react-query';
4
3
  import { createTestQueryClient } from '@contentful/field-editor-test-utils';
5
4
  import { configure, render, waitFor } from '@testing-library/react';
6
5
  import userEvent from '@testing-library/user-event';
6
+ import { describe, expect, it, vi } from 'vitest';
7
7
  import publishedCT from '../../__fixtures__/content-type/published_content_type.json';
8
8
  import publishedEntryNonMasterEnvironment from '../../__fixtures__/entry/published_entry_non_master.json';
9
9
  import publishedEntry from '../../__fixtures__/entry/published_entry.json';
@@ -15,8 +15,8 @@ import { ResourceCard } from './ResourceCard';
15
15
  configure({
16
16
  testIdAttribute: 'data-test-id'
17
17
  });
18
- jest.mock('react-intersection-observer', ()=>({
19
- useInView: jest.fn().mockReturnValue({})
18
+ vi.mock('react-intersection-observer', ()=>({
19
+ useInView: vi.fn().mockReturnValue({})
20
20
  }));
21
21
  const resolvableEntryUrn = 'crn:contentful:::content:spaces/space-id/entries/linked-entry-urn';
22
22
  const resolvableEntryUrnWithExplicitMaster = 'crn:contentful:::content:spaces/space-id/environments/master/entries/linked-entry-urn';
@@ -31,10 +31,10 @@ const sdk = {
31
31
  },
32
32
  cma: {
33
33
  contentType: {
34
- get: jest.fn().mockReturnValue(publishedCT)
34
+ get: vi.fn().mockReturnValue(publishedCT)
35
35
  },
36
36
  entry: {
37
- get: jest.fn().mockImplementation(({ spaceId, environmentId, entryId })=>{
37
+ get: vi.fn().mockImplementation(({ spaceId, environmentId, entryId })=>{
38
38
  if (spaceId === 'space-id' && environmentId === 'master' && entryId === 'linked-entry-urn') {
39
39
  return Promise.resolve(publishedEntry);
40
40
  }
@@ -45,7 +45,7 @@ const sdk = {
45
45
  })
46
46
  },
47
47
  locale: {
48
- getMany: jest.fn().mockResolvedValue({
48
+ getMany: vi.fn().mockResolvedValue({
49
49
  items: [
50
50
  {
51
51
  default: true,
@@ -55,7 +55,7 @@ const sdk = {
55
55
  })
56
56
  },
57
57
  resource: {
58
- getMany: jest.fn().mockImplementation(({ spaceId, environmentId, resourceTypeId, query })=>{
58
+ getMany: vi.fn().mockImplementation(({ spaceId, environmentId, resourceTypeId, query })=>{
59
59
  if (spaceId === 'space-id' && environmentId === 'environment-id' && resourceTypeId === resolvableExternalResourceType && query['sys.urn[in]'] === resolvableExternalEntityUrn) {
60
60
  return Promise.resolve({
61
61
  items: [
@@ -75,7 +75,7 @@ const sdk = {
75
75
  })
76
76
  },
77
77
  resourceType: {
78
- getForEnvironment: jest.fn().mockImplementation(({ spaceId, environmentId })=>{
78
+ getForEnvironment: vi.fn().mockImplementation(({ spaceId, environmentId })=>{
79
79
  console.log('>> getForEnvironment', {
80
80
  spaceId,
81
81
  environmentId
@@ -94,16 +94,16 @@ const sdk = {
94
94
  })
95
95
  },
96
96
  scheduledActions: {
97
- getMany: jest.fn().mockResolvedValue({
97
+ getMany: vi.fn().mockResolvedValue({
98
98
  items: [],
99
99
  total: 0
100
100
  })
101
101
  },
102
102
  space: {
103
- get: jest.fn().mockResolvedValue(space)
103
+ get: vi.fn().mockResolvedValue(space)
104
104
  },
105
105
  resourceProvider: {
106
- get: jest.fn().mockImplementation(()=>{
106
+ get: vi.fn().mockImplementation(()=>{
107
107
  return Promise.resolve({
108
108
  function: {
109
109
  sys: {
@@ -115,7 +115,7 @@ const sdk = {
115
115
  }
116
116
  },
117
117
  space: {
118
- onEntityChanged: jest.fn()
118
+ onEntityChanged: vi.fn()
119
119
  },
120
120
  navigator: {},
121
121
  ids: {
@@ -1,32 +1,32 @@
1
1
  import * as React from 'react';
2
- import '@testing-library/jest-dom/extend-expect';
3
2
  import { render, screen } from '@testing-library/react';
4
3
  import userEvent from '@testing-library/user-event';
4
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
5
5
  import { useResource } from '../common/EntityStore';
6
6
  import { useEditorPermissions } from '../common/useEditorPermissions';
7
7
  import { MultipleResourceReferenceEditor } from './MultipleResourceReferenceEditor';
8
8
  import { createFakeEntryResource, mockSdkForField } from './testHelpers/resourceEditorHelpers';
9
9
  let mockedResources = {};
10
- jest.mock('../common/EntityStore', ()=>{
11
- const module = jest.requireActual('../common/EntityStore');
10
+ vi.mock('../common/EntityStore', async ()=>{
11
+ const actual = await vi.importActual('../common/EntityStore');
12
12
  return {
13
- ...module,
14
- useResource: jest.fn((linkType, urn, apiUrl)=>({
13
+ ...actual,
14
+ useResource: vi.fn((linkType, urn, apiUrl)=>({
15
15
  data: mockedResources[`${linkType}.${urn}`],
16
16
  status: 'success',
17
17
  apiUrl
18
18
  }))
19
19
  };
20
20
  });
21
- jest.mock('../common/useEditorPermissions', ()=>{
21
+ vi.mock('../common/useEditorPermissions', ()=>{
22
22
  return {
23
- useEditorPermissions: jest.fn()
23
+ useEditorPermissions: vi.fn()
24
24
  };
25
25
  });
26
- jest.mock('react-intersection-observer', ()=>{
27
- const module = jest.requireActual('react-intersection-observer');
26
+ vi.mock('react-intersection-observer', async ()=>{
27
+ const actual = await vi.importActual('react-intersection-observer');
28
28
  return {
29
- ...module,
29
+ ...actual,
30
30
  useInView: ()=>({
31
31
  inView: true
32
32
  })
@@ -1,33 +1,33 @@
1
1
  import * as React from 'react';
2
- import '@testing-library/jest-dom/extend-expect';
3
2
  import { fireEvent, render, screen } from '@testing-library/react';
3
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
4
4
  import { useResource } from '../common/EntityStore';
5
5
  import { useEditorPermissions } from '../common/useEditorPermissions';
6
6
  import { SingleResourceReferenceEditor } from './SingleResourceReferenceEditor';
7
7
  import { createFakeEntryResource, mockSdkForField } from './testHelpers/resourceEditorHelpers';
8
8
  const mockedResources = {};
9
- jest.mock('../common/EntityStore', ()=>{
10
- const module = jest.requireActual('../common/EntityStore');
9
+ vi.mock('../common/EntityStore', async ()=>{
10
+ const actual = await vi.importActual('../common/EntityStore');
11
11
  return {
12
- ...module,
13
- useResource: jest.fn((linkType, urn)=>({
12
+ ...actual,
13
+ useResource: vi.fn((linkType, urn)=>({
14
14
  data: mockedResources[`${linkType}.${urn}`],
15
15
  status: 'success'
16
16
  }))
17
17
  };
18
18
  });
19
- jest.mock('react-intersection-observer', ()=>{
20
- const module = jest.requireActual('react-intersection-observer');
19
+ vi.mock('react-intersection-observer', async ()=>{
20
+ const actual = await vi.importActual('react-intersection-observer');
21
21
  return {
22
- ...module,
22
+ ...actual,
23
23
  useInView: ()=>({
24
24
  inView: true
25
25
  })
26
26
  };
27
27
  });
28
- jest.mock('../common/useEditorPermissions', ()=>{
28
+ vi.mock('../common/useEditorPermissions', ()=>{
29
29
  return {
30
- useEditorPermissions: jest.fn()
30
+ useEditorPermissions: vi.fn()
31
31
  };
32
32
  });
33
33
  const fieldDefinition = {
@@ -126,7 +126,7 @@ describe('Single resource editor', ()=>{
126
126
  hasCardEditActions: true,
127
127
  viewType: "card",
128
128
  apiUrl: "test-contentful",
129
- getEntryRouteHref: jest.fn(),
129
+ getEntryRouteHref: vi.fn(),
130
130
  parameters: {}
131
131
  }));
132
132
  expect(useResource).toHaveBeenCalled();
@@ -1,9 +1,10 @@
1
+ import { vi } from 'vitest';
1
2
  export function mockSdkForField(fieldDefinition, fieldValue) {
2
3
  return {
3
4
  field: {
4
- getValue: jest.fn(()=>fieldValue),
5
- setValue: jest.fn(()=>Promise.resolve(undefined)),
6
- removeValue: jest.fn(),
5
+ getValue: vi.fn(()=>fieldValue),
6
+ setValue: vi.fn(()=>Promise.resolve(undefined)),
7
+ removeValue: vi.fn(),
7
8
  onSchemaErrorsChanged: ()=>{},
8
9
  onIsDisabledChanged: ()=>{},
9
10
  getIsDisabled: ()=>false,
@@ -12,14 +13,14 @@ export function mockSdkForField(fieldDefinition, fieldValue) {
12
13
  locale: 'en'
13
14
  },
14
15
  dialogs: {
15
- selectSingleResourceEntity: jest.fn().mockResolvedValue({
16
+ selectSingleResourceEntity: vi.fn().mockResolvedValue({
16
17
  sys: {
17
18
  type: 'ResourceLink',
18
19
  linkType: 'Contentful:Entry',
19
20
  urn: 'crn:contentful:::content:spaces/space-id/entries/example-entity-urn'
20
21
  }
21
22
  }),
22
- selectMultipleResourceEntities: jest.fn().mockResolvedValue([
23
+ selectMultipleResourceEntities: vi.fn().mockResolvedValue([
23
24
  {
24
25
  sys: {
25
26
  type: 'ResourceLink',
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { getProviderName } from './getProviderName';
2
3
  describe('getProviderName', ()=>{
3
4
  it('should return undefined if Resource Link is not in format "Provider:ResourceType"', ()=>{
@@ -1 +1 @@
1
- import '@testing-library/jest-dom';
1
+ export {};
@@ -1 +1 @@
1
- import '@testing-library/jest-dom/extend-expect';
1
+ export {};
@@ -1 +1 @@
1
- import '@testing-library/jest-dom';
1
+ export {};
@@ -1 +1 @@
1
- import '@testing-library/jest-dom/extend-expect';
1
+ export {};
@@ -1 +1 @@
1
- import '@testing-library/jest-dom/extend-expect';
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contentful/field-editor-reference",
3
- "version": "8.3.1",
3
+ "version": "8.3.2",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/esm/index.js",
6
6
  "types": "dist/types/index.d.ts",
@@ -31,15 +31,15 @@
31
31
  "build:types": "tsc --outDir dist/types --emitDeclarationOnly",
32
32
  "build:cjs": "swc src --config-file ../../.swcrc -d dist/cjs -C module.type=commonjs",
33
33
  "build:esm": "swc src --config-file ../../.swcrc -d dist/esm",
34
- "test": "jest --watch",
35
- "test:ci": "jest --ci",
34
+ "test": "vitest",
35
+ "test:ci": "vitest run",
36
36
  "tsc": "tsc -p ./ --noEmit"
37
37
  },
38
38
  "dependencies": {
39
39
  "@contentful/f36-components": "^6.7.1",
40
40
  "@contentful/f36-icons": "^6.7.1",
41
41
  "@contentful/f36-tokens": "^6.1.2",
42
- "@contentful/field-editor-shared": "^4.4.0",
42
+ "@contentful/field-editor-shared": "^4.4.1",
43
43
  "@contentful/mimetype": "^2.2.29",
44
44
  "@dnd-kit/core": "^6.0.8",
45
45
  "@dnd-kit/sortable": "^8.0.0",
@@ -56,7 +56,7 @@
56
56
  },
57
57
  "devDependencies": {
58
58
  "@contentful/app-sdk": "^4.42.0",
59
- "@contentful/field-editor-test-utils": "^3.1.0",
59
+ "@contentful/field-editor-test-utils": "^3.1.1",
60
60
  "@lingui/core": "5.3.0",
61
61
  "@testing-library/react-hooks": "^8.0.1",
62
62
  "@testing-library/user-event": "^13.1.9"
@@ -70,5 +70,5 @@
70
70
  "publishConfig": {
71
71
  "registry": "https://npm.pkg.github.com/"
72
72
  },
73
- "gitHead": "7e70d445ddd02c7f445baacf138fad822d7ab09f"
73
+ "gitHead": "5fb6c32d2590e72e56a53cb180a155f84d6505d9"
74
74
  }