From a546a9072cc778b2a96962d43175d375d346b06f Mon Sep 17 00:00:00 2001 From: Bassel Kanso Date: Wed, 5 Jun 2024 12:39:12 +0300 Subject: [PATCH 01/78] feat: expand nested components to 6 levels of depth --- .../DataManagerProvider.tsx | 3 +- .../utils/retrieveNestedComponents.ts | 49 +++++++++--- .../tests/retrieveNestedComponents.test.ts | 78 ++++++++++++++++++- .../FormModal/utils/getAttributesToDisplay.ts | 54 +++++++++++-- .../admin/src/constants.ts | 2 + 5 files changed, 168 insertions(+), 18 deletions(-) diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/DataManagerProvider.tsx b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/DataManagerProvider.tsx index 59585a0196..6c3cd65f87 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/DataManagerProvider.tsx +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/DataManagerProvider.tsx @@ -425,9 +425,8 @@ const DataManagerProvider = ({ children }: DataManagerProviderProps) => { const getAllNestedComponents = () => { const appNestedCompo = retrieveNestedComponents(components); - const editingDataNestedCompos = retrieveNestedComponents(modifiedData.components || {}); - return makeUnique([...editingDataNestedCompos, ...appNestedCompo]); + return appNestedCompo; }; const removeComponentFromDynamicZone = (dzName: string, componentToRemoveIndex: number) => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts index d7b7c086f1..bc441a8124 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts @@ -1,24 +1,55 @@ -import { makeUnique } from '../../../utils/makeUnique'; +import type { Internal } from '@strapi/types'; -export const retrieveNestedComponents = (appComponents: any) => { - const nestedComponents = Object.keys(appComponents).reduce((acc: any, current) => { +export type NestedComponent = { + component: Internal.UID.Component; + parentCompoUid?: Internal.UID.Component[]; +}; + +export const retrieveNestedComponents = (appComponents: any): NestedComponent[] => { + const nestedComponents = Object.keys(appComponents).reduce((acc: any, current: any) => { const componentAttributes = appComponents?.[current]?.schema?.attributes ?? []; - const currentComponentNestedCompos = getComponentsFromComponent(componentAttributes); - + const currentComponentNestedCompos = getComponentsFromComponent(componentAttributes, current); return [...acc, ...currentComponentNestedCompos]; }, []); - return makeUnique(nestedComponents); + return mergeComponents(nestedComponents); }; -const getComponentsFromComponent = (componentAttributes: any) => { +const getComponentsFromComponent = ( + componentAttributes: any, + parentCompoUid: Internal.UID.Component +) => { return componentAttributes.reduce((acc: any, current: any) => { const { type, component } = current; - if (type === 'component') { - acc.push(component); + acc.push({ + component, + parentCompoUid, + }); } return acc; }, []); }; + +// merge components different parents if they exist +const mergeComponents = (originalComponents: NestedComponent[]): NestedComponent[] => { + const componentMap = new Map(); + // Populate the map with component and its parents + originalComponents.forEach(({ component, parentCompoUid }) => { + if (!componentMap.has(component)) { + componentMap.set(component, new Set()); + } + componentMap.get(component).add(parentCompoUid); + }); + + // Convert the map to the desired array format + const transformedComponents: NestedComponent[] = Array.from(componentMap.entries()).map( + ([component, parentCompoUidSet]) => ({ + component, + parentCompoUid: Array.from(parentCompoUidSet), + }) + ); + + return transformedComponents; +}; diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveNestedComponents.test.ts b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveNestedComponents.test.ts index 43c85a6698..5aba7dc1c4 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveNestedComponents.test.ts +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveNestedComponents.test.ts @@ -49,7 +49,83 @@ describe('CONTENT TYPE BUILDER | COMPONENTS | DataManagerProvider | utils | retr }, }; - const expected = ['default.dish']; + const expected = [ + { + component: 'default.dish', + parentCompoUid: ['default.closingperiod'], + }, + ]; + + expect(retrieveNestedComponents(components)).toEqual(expected); + }); + + it('should return both parents', () => { + const components = { + 'default.closingperiod': { + uid: 'default.closingperiod', + category: 'default', + apiId: 'closingperiod', + schema: { + icon: 'angry', + name: 'closingperiod', + description: '', + collectionName: 'components_closingperiods', + attributes: [ + { type: 'string', name: 'label' }, + { type: 'date', required: true, name: 'start_date' }, + { type: 'date', required: true, name: 'end_date' }, + { type: 'media', multiple: false, required: false, name: 'media' }, + { component: 'default.dish', type: 'component', name: 'dish' }, + ], + }, + }, + 'default.dish': { + uid: 'default.dish', + category: 'default', + apiId: 'dish', + schema: { + icon: 'address-book', + name: 'dish', + description: '', + collectionName: 'components_dishes', + attributes: [ + { type: 'string', required: false, default: 'My super dish', name: 'name' }, + { type: 'text', name: 'description' }, + { type: 'float', name: 'price' }, + { type: 'media', multiple: false, required: false, name: 'picture' }, + { type: 'richtext', name: 'very_long_description' }, + { + type: 'relation', + relation: 'oneToOne', + target: 'api::category.category', + targetAttribute: null, + private: false, + name: 'categories', + }, + ], + }, + }, + + 'default.openingperiod': { + uid: 'default.openingperiod', + category: 'default', + apiId: 'openingperiod', + schema: { + icon: 'angry', + name: 'openingperiod', + description: '', + collectionName: 'components_openingperiods', + attributes: [{ component: 'default.dish', type: 'component', name: 'dish' }], + }, + }, + }; + + const expected = [ + { + component: 'default.dish', + parentCompoUid: ['default.closingperiod', 'default.openingperiod'], + }, + ]; expect(retrieveNestedComponents(components)).toEqual(expected); }); diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/utils/getAttributesToDisplay.ts b/packages/core/content-type-builder/admin/src/components/FormModal/utils/getAttributesToDisplay.ts index 478a800b89..cae7449dc5 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/utils/getAttributesToDisplay.ts +++ b/packages/core/content-type-builder/admin/src/components/FormModal/utils/getAttributesToDisplay.ts @@ -1,10 +1,13 @@ +import { MAX_COMPONENT_DEPTH } from '../../../constants'; + import type { IconByType } from '../../AttributeIcon'; +import type { NestedComponent } from '../../DataManagerProvider/utils/retrieveNestedComponents'; import type { Internal } from '@strapi/types'; export const getAttributesToDisplay = ( dataTarget = '', targetUid: Internal.UID.Schema, - nestedComponents: Array + nestedComponents: Array ): IconByType[][] => { const defaultAttributes: IconByType[] = [ 'text', @@ -22,9 +25,6 @@ export const getAttributesToDisplay = ( ]; const isPickingAttributeForAContentType = dataTarget === 'contentType'; - const isNestedInAnotherComponent = nestedComponents.includes(targetUid); - const canAddComponentInAnotherComponent = - !isPickingAttributeForAContentType && !isNestedInAnotherComponent; if (isPickingAttributeForAContentType) { return [ @@ -34,9 +34,51 @@ export const getAttributesToDisplay = ( ]; } - if (canAddComponentInAnotherComponent) { - return [defaultAttributes, ['component']]; + // this will only run when adding attributes to components + if (dataTarget) { + const componentDepth = getComponentMaxDepth(targetUid, nestedComponents); + const isNestedInAnotherComponent = componentDepth >= MAX_COMPONENT_DEPTH; + const canAddComponentInAnotherComponent = + !isPickingAttributeForAContentType && !isNestedInAnotherComponent; + if (canAddComponentInAnotherComponent) { + return [defaultAttributes, ['component']]; + } } return [defaultAttributes]; }; + +const findComponent = (component: Internal.UID.Schema, components: Array) => { + return components.find((c) => c.component === component); +}; + +const getComponentMaxDepth = ( + component: Internal.UID.Schema, + components: Array +) => { + const dfs = (currentComponent: NestedComponent, currentLevel: number): Array => { + const levels = []; + levels.push(currentLevel); + + if (!currentComponent.parentCompoUid) { + return levels; + } + + for (const parentUid of currentComponent.parentCompoUid) { + const parentComponent = findComponent(parentUid, components); + if (parentComponent) { + levels.push(...dfs(parentComponent, currentLevel + 1)); + } + } + + return levels; + }; + + const nestedCompo = findComponent(component, components); + // return depth 0 if component is not nested + if (!nestedCompo) { + return 0; + } + const compoDepth = Math.max(...dfs(nestedCompo, 1)); + return compoDepth; +}; diff --git a/packages/core/content-type-builder/admin/src/constants.ts b/packages/core/content-type-builder/admin/src/constants.ts index 85e1759a16..fa983278e7 100644 --- a/packages/core/content-type-builder/admin/src/constants.ts +++ b/packages/core/content-type-builder/admin/src/constants.ts @@ -5,3 +5,5 @@ export const PERMISSIONS = { // plugin directly in the browser main: [{ action: 'plugin::content-type-builder.read', subject: null }], }; + +export const MAX_COMPONENT_DEPTH = 6; From 394cd1906ccd6e81b4c18a0494849582712547b4 Mon Sep 17 00:00:00 2001 From: Bassel Kanso Date: Thu, 6 Jun 2024 15:31:31 +0300 Subject: [PATCH 02/78] feat: only allow nesting components that don't exceed the total limit of nesting --- .../retrieveComponentsThatHaveComponents.ts | 25 ++-- ...trieveComponentsThatHaveComponents.test.ts | 41 ++++++- .../FormModal/utils/getAttributesToDisplay.ts | 38 +----- .../admin/src/components/SelectComponent.tsx | 19 ++- .../admin/src/utils/getMaxDepth.ts | 79 ++++++++++++ .../admin/src/utils/tests/getMaxDepth.test.ts | 115 ++++++++++++++++++ 6 files changed, 258 insertions(+), 59 deletions(-) create mode 100644 packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts create mode 100644 packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.ts b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.ts index 94be06afed..ce1337adc0 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.ts +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.ts @@ -3,16 +3,15 @@ import get from 'lodash/get'; import { makeUnique } from '../../../utils/makeUnique'; import type { Component, AttributeType, Components } from '../../../types'; -import type { Internal } from '@strapi/types'; const retrieveComponentsThatHaveComponents = (allComponents: Components) => { const componentsThatHaveNestedComponents = Object.keys(allComponents).reduce( - (acc: Internal.UID.Component[], current) => { + (acc: any, current) => { const currentComponent = get(allComponents, [current]); - const uid = currentComponent.uid; - if (doesComponentHaveAComponentField(currentComponent)) { - acc.push(uid); + const compoWithChildren = getComponentWithChildComponents(currentComponent); + if (compoWithChildren.childComponents.length > 0) { + acc.push(compoWithChildren); } return acc; @@ -23,14 +22,16 @@ const retrieveComponentsThatHaveComponents = (allComponents: Components) => { return makeUnique(componentsThatHaveNestedComponents); }; -const doesComponentHaveAComponentField = (component: Component) => { +const getComponentWithChildComponents = (component: Component) => { const attributes = get(component, ['schema', 'attributes'], []) as AttributeType[]; + return { + component: component.uid, + childComponents: attributes.filter((attribute) => { + const { type } = attribute; - return attributes.some((attribute) => { - const { type } = attribute; - - return type === 'component'; - }); + return type === 'component'; + }), + }; }; -export { doesComponentHaveAComponentField, retrieveComponentsThatHaveComponents }; +export { getComponentWithChildComponents, retrieveComponentsThatHaveComponents }; diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveComponentsThatHaveComponents.test.ts b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveComponentsThatHaveComponents.test.ts index 1d1d5dbe8c..005be3bdee 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveComponentsThatHaveComponents.test.ts +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveComponentsThatHaveComponents.test.ts @@ -1,5 +1,5 @@ import { - doesComponentHaveAComponentField, + getComponentWithChildComponents, retrieveComponentsThatHaveComponents, } from '../retrieveComponentsThatHaveComponents'; @@ -80,18 +80,47 @@ const data: any = { describe('retrieveComponentsThatHaveComponents', () => { describe('doesComponentHaveAComponentField', () => { - it('Should return true if one of its attributes is a component', () => { - expect(doesComponentHaveAComponentField(data['blog.slider'])).toBe(true); + it('Should return correct child component if component has a component', () => { + expect(getComponentWithChildComponents(data['blog.slider'])).toEqual({ + component: 'blog.slider', + childComponents: [ + { + name: 'slide', + component: 'default.slide', + type: 'component', + repeatable: true, + min: 1, + max: 5, + }, + ], + }); }); - it('Should return false if none of its attributes is a component', () => { - expect(doesComponentHaveAComponentField(data['default.dish'])).toBe(false); + it('Should return no child components if component has no child components', () => { + expect(getComponentWithChildComponents(data['default.dish'])).toEqual({ + component: 'default.dish', + childComponents: [], + }); }); }); describe('retrievComponentsThatHaveComponents', () => { it('should return an array with all the components that have nested components', () => { - expect(retrieveComponentsThatHaveComponents(data)).toEqual(['blog.slider']); + expect(retrieveComponentsThatHaveComponents(data)).toEqual([ + { + component: 'blog.slider', + childComponents: [ + { + name: 'slide', + component: 'default.slide', + type: 'component', + repeatable: true, + min: 1, + max: 5, + }, + ], + }, + ]); }); }); }); diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/utils/getAttributesToDisplay.ts b/packages/core/content-type-builder/admin/src/components/FormModal/utils/getAttributesToDisplay.ts index cae7449dc5..61b89f4344 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/utils/getAttributesToDisplay.ts +++ b/packages/core/content-type-builder/admin/src/components/FormModal/utils/getAttributesToDisplay.ts @@ -1,4 +1,5 @@ import { MAX_COMPONENT_DEPTH } from '../../../constants'; +import { getComponentDepth } from '../../../utils/getMaxDepth'; import type { IconByType } from '../../AttributeIcon'; import type { NestedComponent } from '../../DataManagerProvider/utils/retrieveNestedComponents'; @@ -36,7 +37,7 @@ export const getAttributesToDisplay = ( // this will only run when adding attributes to components if (dataTarget) { - const componentDepth = getComponentMaxDepth(targetUid, nestedComponents); + const componentDepth = getComponentDepth(targetUid, nestedComponents); const isNestedInAnotherComponent = componentDepth >= MAX_COMPONENT_DEPTH; const canAddComponentInAnotherComponent = !isPickingAttributeForAContentType && !isNestedInAnotherComponent; @@ -47,38 +48,3 @@ export const getAttributesToDisplay = ( return [defaultAttributes]; }; - -const findComponent = (component: Internal.UID.Schema, components: Array) => { - return components.find((c) => c.component === component); -}; - -const getComponentMaxDepth = ( - component: Internal.UID.Schema, - components: Array -) => { - const dfs = (currentComponent: NestedComponent, currentLevel: number): Array => { - const levels = []; - levels.push(currentLevel); - - if (!currentComponent.parentCompoUid) { - return levels; - } - - for (const parentUid of currentComponent.parentCompoUid) { - const parentComponent = findComponent(parentUid, components); - if (parentComponent) { - levels.push(...dfs(parentComponent, currentLevel + 1)); - } - } - - return levels; - }; - - const nestedCompo = findComponent(component, components); - // return depth 0 if component is not nested - if (!nestedCompo) { - return 0; - } - const compoDepth = Math.max(...dfs(nestedCompo, 1)); - return compoDepth; -}; diff --git a/packages/core/content-type-builder/admin/src/components/SelectComponent.tsx b/packages/core/content-type-builder/admin/src/components/SelectComponent.tsx index 1a63b7995b..2b9b9e8a68 100644 --- a/packages/core/content-type-builder/admin/src/components/SelectComponent.tsx +++ b/packages/core/content-type-builder/admin/src/components/SelectComponent.tsx @@ -1,8 +1,11 @@ import { SingleSelectOption, SingleSelect, Field } from '@strapi/design-system'; import { useIntl } from 'react-intl'; +import { MAX_COMPONENT_DEPTH } from '../constants'; import { useDataManager } from '../hooks/useDataManager'; +import { getChildrenMaxDepth, getComponentDepth } from '../utils/getMaxDepth'; +import type { Internal } from '@strapi/types'; interface Option { uid: string; label: string; @@ -22,7 +25,7 @@ interface SelectComponentProps { isCreatingComponentWhileAddingAField: boolean; name: string; onChange: (value: any) => void; - targetUid: string; + targetUid: Internal.UID.Schema; value: string; forTarget: string; } @@ -44,8 +47,11 @@ export const SelectComponent = ({ const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : ''; const label = formatMessage(intlLabel); - const { componentsGroupedByCategory, componentsThatHaveOtherComponentInTheirAttributes } = - useDataManager(); + const { + componentsGroupedByCategory, + componentsThatHaveOtherComponentInTheirAttributes, + nestedComponents, + } = useDataManager(); const isTargetAComponent = ['component', 'components'].includes(forTarget); @@ -66,8 +72,11 @@ export const SelectComponent = ({ ); if (isAddingAComponentToAnotherComponent) { - options = options.filter((option) => { - return !componentsThatHaveOtherComponentInTheirAttributes.includes(option.uid); + options = options.filter(({ uid }: any) => { + const maxDepth = getChildrenMaxDepth(uid, componentsThatHaveOtherComponentInTheirAttributes); + const componentDepth = getComponentDepth(targetUid, nestedComponents); + const totalDepth = maxDepth + componentDepth; + return totalDepth <= MAX_COMPONENT_DEPTH; }); } diff --git a/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts b/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts new file mode 100644 index 0000000000..5f6449d64a --- /dev/null +++ b/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts @@ -0,0 +1,79 @@ +import type { NestedComponent } from '../components/DataManagerProvider/utils/retrieveNestedComponents'; +import type { Internal } from '@strapi/types'; + +type ChildComponent = { + repeatable: boolean; + component: Internal.UID.Component; + name?: string; + required?: boolean; + min?: number; +}; + +type Component = { + component: Internal.UID.Component; + childComponents: ChildComponent[]; +}; + +const findComponent = ( + componentName: Internal.UID.Schema, + components: Array +) => { + return components.find((c) => c.component === componentName); +}; + +/** + * gets the maximum depth child component + * for a specific component + */ +export const getChildrenMaxDepth = ( + componentUid: Internal.UID.Component, + components: Array, + currentDepth = 0 +) => { + const component = findComponent(componentUid, components); + if (!component || !component.childComponents || component.childComponents.length === 0) { + return currentDepth; + } + + let maxDepth = currentDepth; + component.childComponents.forEach((child) => { + const depth = getChildrenMaxDepth(child.component, components, currentDepth + 1); + if (depth > maxDepth) { + maxDepth = depth; + } + }); + + return maxDepth; +}; + +// get the current component depth +export const getComponentDepth = ( + component: Internal.UID.Schema, + components: Array +) => { + const getDepth = (currentComponent: NestedComponent, currentLevel: number): Array => { + const levels = []; + levels.push(currentLevel); + + if (!currentComponent.parentCompoUid) { + return levels; + } + + for (const parentUid of currentComponent.parentCompoUid) { + const parentComponent = findComponent(parentUid, components); + if (parentComponent) { + levels.push(...getDepth(parentComponent, currentLevel + 1)); + } + } + + return levels; + }; + + const nestedCompo = findComponent(component, components); + // return depth 0 if component is not nested + if (!nestedCompo) { + return 0; + } + const compoDepth = Math.max(...getDepth(nestedCompo, 1)); + return compoDepth; +}; diff --git a/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts b/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts new file mode 100644 index 0000000000..e1c63c6a79 --- /dev/null +++ b/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts @@ -0,0 +1,115 @@ +import { getChildrenMaxDepth } from '../getMaxDepth'; + +const components = [ + { + component: 'basic.parent-compo', + childComponents: [ + { + repeatable: false, + component: 'basic.nested-compo1', + name: 'compofield', + }, + ], + }, + { + component: 'basic.nested-compo5', + childComponents: [ + { + repeatable: false, + component: 'basic.nested-compo6', + name: 'again', + }, + ], + }, + { + component: 'basic.nested-compo4', + childComponents: [ + { + repeatable: false, + component: 'basic.nested-compo5', + name: 'againsomecompo', + }, + ], + }, + { + component: 'basic.nested-compo3', + childComponents: [ + { + repeatable: false, + component: 'basic.nested-compo4', + name: 'somecompo', + }, + ], + }, + { + component: 'basic.nested-compo2', + childComponents: [ + { + repeatable: true, + component: 'basic.nested-compo3', + name: 'somecompo', + }, + ], + }, + { + component: 'basic.nested-compo1', + childComponents: [ + { + repeatable: false, + component: 'basic.nested-compo2', + name: 'compofield', + }, + ], + }, + { + component: 'basic.another-parent-compo', + childComponents: [ + { + repeatable: false, + component: 'basic.nested-compo6', + name: 'somecompo', + }, + ], + }, + { + component: 'default.openingtimes', + childComponents: [ + { + repeatable: true, + component: 'default.dish', + name: 'dishrep', + }, + { + repeatable: true, + component: 'basic.nested-compo3', + name: 'somecompo', + }, + ], + }, + { + component: 'default.closingperiod', + childComponents: [ + { + component: 'default.dish', + repeatable: true, + required: true, + min: 2, + name: 'dish', + }, + ], + }, +]; + +describe('getMaxDepth', () => { + test('A component with no child component should have 0 max depth', () => { + const componentsMaxDepth = getChildrenMaxDepth('basic.nested-compo6', components); + + expect(componentsMaxDepth).toEqual(0); + }); + + test('should accurately give the max depth of components children', () => { + const componentsMaxDepth = getChildrenMaxDepth('default.openingtimes', components); + + expect(componentsMaxDepth).toEqual(4); + }); +}); From 4fcf1cc8d1b474b751f1ff8966d2420a7676f621 Mon Sep 17 00:00:00 2001 From: Bassel Kanso Date: Thu, 6 Jun 2024 16:10:23 +0300 Subject: [PATCH 03/78] fix: ts issue --- .../core/content-type-builder/admin/src/utils/getMaxDepth.ts | 4 ++-- .../admin/src/utils/tests/getMaxDepth.test.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts b/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts index 5f6449d64a..f679e0cca2 100644 --- a/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts +++ b/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts @@ -9,7 +9,7 @@ type ChildComponent = { min?: number; }; -type Component = { +export type ComponentWithChildren = { component: Internal.UID.Component; childComponents: ChildComponent[]; }; @@ -27,7 +27,7 @@ const findComponent = ( */ export const getChildrenMaxDepth = ( componentUid: Internal.UID.Component, - components: Array, + components: Array, currentDepth = 0 ) => { const component = findComponent(componentUid, components); diff --git a/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts b/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts index e1c63c6a79..f7f475573c 100644 --- a/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts +++ b/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts @@ -1,6 +1,6 @@ -import { getChildrenMaxDepth } from '../getMaxDepth'; +import { getChildrenMaxDepth, type ComponentWithChildren } from '../getMaxDepth'; -const components = [ +const components: Array = [ { component: 'basic.parent-compo', childComponents: [ From e06b160f0857bbdb9f2d09c38f475da62d9ca86f Mon Sep 17 00:00:00 2001 From: Bassel Kanso Date: Mon, 10 Jun 2024 22:11:33 +0300 Subject: [PATCH 04/78] chore: adding some comments and types --- .../DataManagerProvider.tsx | 3 +- .../retrieveComponentsThatHaveComponents.ts | 32 +++++++++++----- .../utils/retrieveNestedComponents.ts | 21 ++++++---- ...trieveComponentsThatHaveComponents.test.ts | 10 ----- .../tests/retrieveNestedComponents.test.ts | 10 +++-- .../admin/src/utils/getMaxDepth.ts | 38 ++++++++++++++++--- 6 files changed, 76 insertions(+), 38 deletions(-) diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/DataManagerProvider.tsx b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/DataManagerProvider.tsx index 6c3cd65f87..9efaca1762 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/DataManagerProvider.tsx +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/DataManagerProvider.tsx @@ -22,7 +22,6 @@ import { DataManagerContext } from '../../contexts/DataManagerContext'; import { useFormModalNavigation } from '../../hooks/useFormModalNavigation'; import { pluginId } from '../../pluginId'; import { getTrad } from '../../utils/getTrad'; -import { makeUnique } from '../../utils/makeUnique'; import { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker'; import { FormModal } from '../FormModal/FormModal'; @@ -420,7 +419,7 @@ const DataManagerProvider = ({ children }: DataManagerProviderProps) => { const composWithCompos = retrieveComponentsThatHaveComponents(allCompos); - return makeUnique(composWithCompos); + return composWithCompos; }; const getAllNestedComponents = () => { diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.ts b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.ts index ce1337adc0..aa55f9af30 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.ts +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents.ts @@ -1,12 +1,20 @@ import get from 'lodash/get'; -import { makeUnique } from '../../../utils/makeUnique'; - import type { Component, AttributeType, Components } from '../../../types'; +import type { Internal } from '@strapi/types'; + +type ChildComponent = { + component: Internal.UID.Component; +}; + +export type ComponentWithChildren = { + component: Internal.UID.Component; + childComponents: ChildComponent[]; +}; const retrieveComponentsThatHaveComponents = (allComponents: Components) => { const componentsThatHaveNestedComponents = Object.keys(allComponents).reduce( - (acc: any, current) => { + (acc: ComponentWithChildren[], current) => { const currentComponent = get(allComponents, [current]); const compoWithChildren = getComponentWithChildComponents(currentComponent); @@ -19,18 +27,24 @@ const retrieveComponentsThatHaveComponents = (allComponents: Components) => { [] ); - return makeUnique(componentsThatHaveNestedComponents); + return componentsThatHaveNestedComponents; }; -const getComponentWithChildComponents = (component: Component) => { +const getComponentWithChildComponents = (component: Component): ComponentWithChildren => { const attributes = get(component, ['schema', 'attributes'], []) as AttributeType[]; return { component: component.uid, - childComponents: attributes.filter((attribute) => { - const { type } = attribute; + childComponents: attributes + .filter((attribute) => { + const { type } = attribute; - return type === 'component'; - }), + return type === 'component'; + }) + .map((attribute) => { + return { + component: attribute.component, + } as ChildComponent; + }), }; }; diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts index bc441a8124..0a4ea85947 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts @@ -1,14 +1,19 @@ +import type { Components, AttributeType } from '../../../types'; import type { Internal } from '@strapi/types'; export type NestedComponent = { component: Internal.UID.Component; - parentCompoUid?: Internal.UID.Component[]; + uidsOfAllParents?: Internal.UID.Component[]; + parentCompoUid?: Internal.UID.Component; }; -export const retrieveNestedComponents = (appComponents: any): NestedComponent[] => { - const nestedComponents = Object.keys(appComponents).reduce((acc: any, current: any) => { +export const retrieveNestedComponents = (appComponents: Components): NestedComponent[] => { + const nestedComponents = Object.keys(appComponents).reduce((acc: NestedComponent[], current) => { const componentAttributes = appComponents?.[current]?.schema?.attributes ?? []; - const currentComponentNestedCompos = getComponentsFromComponent(componentAttributes, current); + const currentComponentNestedCompos = getComponentsFromComponent( + componentAttributes, + current as Internal.UID.Component + ); return [...acc, ...currentComponentNestedCompos]; }, []); @@ -16,10 +21,10 @@ export const retrieveNestedComponents = (appComponents: any): NestedComponent[] }; const getComponentsFromComponent = ( - componentAttributes: any, + componentAttributes: AttributeType[], parentCompoUid: Internal.UID.Component ) => { - return componentAttributes.reduce((acc: any, current: any) => { + return componentAttributes.reduce((acc: NestedComponent[], current) => { const { type, component } = current; if (type === 'component') { acc.push({ @@ -32,7 +37,7 @@ const getComponentsFromComponent = ( }, []); }; -// merge components different parents if they exist +// merge duplicate components const mergeComponents = (originalComponents: NestedComponent[]): NestedComponent[] => { const componentMap = new Map(); // Populate the map with component and its parents @@ -47,7 +52,7 @@ const mergeComponents = (originalComponents: NestedComponent[]): NestedComponent const transformedComponents: NestedComponent[] = Array.from(componentMap.entries()).map( ([component, parentCompoUidSet]) => ({ component, - parentCompoUid: Array.from(parentCompoUidSet), + uidsOfAllParents: Array.from(parentCompoUidSet), }) ); diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveComponentsThatHaveComponents.test.ts b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveComponentsThatHaveComponents.test.ts index 005be3bdee..6d979d23be 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveComponentsThatHaveComponents.test.ts +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveComponentsThatHaveComponents.test.ts @@ -85,12 +85,7 @@ describe('retrieveComponentsThatHaveComponents', () => { component: 'blog.slider', childComponents: [ { - name: 'slide', component: 'default.slide', - type: 'component', - repeatable: true, - min: 1, - max: 5, }, ], }); @@ -111,12 +106,7 @@ describe('retrieveComponentsThatHaveComponents', () => { component: 'blog.slider', childComponents: [ { - name: 'slide', component: 'default.slide', - type: 'component', - repeatable: true, - min: 1, - max: 5, }, ], }, diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveNestedComponents.test.ts b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveNestedComponents.test.ts index 5aba7dc1c4..45a7d04df8 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveNestedComponents.test.ts +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/tests/retrieveNestedComponents.test.ts @@ -1,8 +1,10 @@ import { retrieveNestedComponents } from '../retrieveNestedComponents'; +import type { Components } from '../../../../types'; + describe('CONTENT TYPE BUILDER | COMPONENTS | DataManagerProvider | utils | retrieveNestedComponents', () => { it('should return an array of nested components', () => { - const components = { + const components: Components = { 'default.closingperiod': { uid: 'default.closingperiod', category: 'default', @@ -52,7 +54,7 @@ describe('CONTENT TYPE BUILDER | COMPONENTS | DataManagerProvider | utils | retr const expected = [ { component: 'default.dish', - parentCompoUid: ['default.closingperiod'], + uidsOfAllParents: ['default.closingperiod'], }, ]; @@ -60,7 +62,7 @@ describe('CONTENT TYPE BUILDER | COMPONENTS | DataManagerProvider | utils | retr }); it('should return both parents', () => { - const components = { + const components: Components = { 'default.closingperiod': { uid: 'default.closingperiod', category: 'default', @@ -123,7 +125,7 @@ describe('CONTENT TYPE BUILDER | COMPONENTS | DataManagerProvider | utils | retr const expected = [ { component: 'default.dish', - parentCompoUid: ['default.closingperiod', 'default.openingperiod'], + uidsOfAllParents: ['default.closingperiod', 'default.openingperiod'], }, ]; diff --git a/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts b/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts index f679e0cca2..72651735bb 100644 --- a/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts +++ b/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts @@ -22,8 +22,13 @@ const findComponent = ( }; /** - * gets the maximum depth child component - * for a specific component + * Recursively calculates the maximum depth of nested child components + * for a given component UID. + * + * @param componentUid - The UID of the component to start from. + * @param components - The array of all components with their child components. + * @param currentDepth - The current depth of the recursion. Defaults to 0. + * @returns The maximum depth of the nested child components. */ export const getChildrenMaxDepth = ( componentUid: Internal.UID.Component, @@ -31,13 +36,19 @@ export const getChildrenMaxDepth = ( currentDepth = 0 ) => { const component = findComponent(componentUid, components); + + // If the component doesn't exist or has no child components, return the current depth. if (!component || !component.childComponents || component.childComponents.length === 0) { return currentDepth; } let maxDepth = currentDepth; + + // Iterate through each child component to calculate their respective depths. component.childComponents.forEach((child) => { + // Recursively calculate the depth of the child component. const depth = getChildrenMaxDepth(child.component, components, currentDepth + 1); + // Update the maximum depth if the child's depth is greater. if (depth > maxDepth) { maxDepth = depth; } @@ -46,20 +57,37 @@ export const getChildrenMaxDepth = ( return maxDepth; }; -// get the current component depth +/** + * Calculates the depth of a component within a nested component tree. + * Depth is defined as the level at which the component is nested. + * For example, a component at Depth 3 is the third nested component. + * + * @param component - The UID of the component to find the depth for. + * @param components - The array of all nested components. + * @returns The depth level of the component within the nested tree. + */ export const getComponentDepth = ( component: Internal.UID.Schema, components: Array ) => { + /** + * Helper function to recursively calculate the depth of a component. + * + * @param currentComponent - The current component being inspected. + * @param currentLevel - The current level of depth in the tree. + * @returns An array of depth levels found for the component. + */ const getDepth = (currentComponent: NestedComponent, currentLevel: number): Array => { const levels = []; levels.push(currentLevel); - if (!currentComponent.parentCompoUid) { + // If the component has no parent UIDs, return the current levels + if (!currentComponent.uidsOfAllParents) { return levels; } - for (const parentUid of currentComponent.parentCompoUid) { + // Iterate over each parent UID to calculate their respective depths + for (const parentUid of currentComponent.uidsOfAllParents) { const parentComponent = findComponent(parentUid, components); if (parentComponent) { levels.push(...getDepth(parentComponent, currentLevel + 1)); From 0fc2163f33e0f0ecc5deb3b12681999f37e91795 Mon Sep 17 00:00:00 2001 From: Bassel Kanso Date: Tue, 11 Jun 2024 11:05:47 +0300 Subject: [PATCH 05/78] chore: fixing some types --- .../admin/src/utils/getMaxDepth.ts | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts b/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts index 72651735bb..5f8a1d7fcb 100644 --- a/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts +++ b/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts @@ -1,19 +1,7 @@ +import type { ComponentWithChildren } from '../components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents'; import type { NestedComponent } from '../components/DataManagerProvider/utils/retrieveNestedComponents'; import type { Internal } from '@strapi/types'; -type ChildComponent = { - repeatable: boolean; - component: Internal.UID.Component; - name?: string; - required?: boolean; - min?: number; -}; - -export type ComponentWithChildren = { - component: Internal.UID.Component; - childComponents: ChildComponent[]; -}; - const findComponent = ( componentName: Internal.UID.Schema, components: Array From 4f56dbb82dac9d9f09d303e5a1db3f0b2ab56f96 Mon Sep 17 00:00:00 2001 From: Bassel Kanso Date: Tue, 11 Jun 2024 11:33:58 +0300 Subject: [PATCH 06/78] chore: fixing type import --- .../admin/src/utils/tests/getMaxDepth.test.ts | 26 +++---------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts b/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts index f7f475573c..eaa36a5895 100644 --- a/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts +++ b/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts @@ -1,13 +1,13 @@ -import { getChildrenMaxDepth, type ComponentWithChildren } from '../getMaxDepth'; +import { getChildrenMaxDepth } from '../getMaxDepth'; + +import type { ComponentWithChildren } from '../../components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents'; const components: Array = [ { component: 'basic.parent-compo', childComponents: [ { - repeatable: false, component: 'basic.nested-compo1', - name: 'compofield', }, ], }, @@ -15,9 +15,7 @@ const components: Array = [ component: 'basic.nested-compo5', childComponents: [ { - repeatable: false, component: 'basic.nested-compo6', - name: 'again', }, ], }, @@ -25,9 +23,7 @@ const components: Array = [ component: 'basic.nested-compo4', childComponents: [ { - repeatable: false, component: 'basic.nested-compo5', - name: 'againsomecompo', }, ], }, @@ -35,9 +31,7 @@ const components: Array = [ component: 'basic.nested-compo3', childComponents: [ { - repeatable: false, component: 'basic.nested-compo4', - name: 'somecompo', }, ], }, @@ -45,9 +39,7 @@ const components: Array = [ component: 'basic.nested-compo2', childComponents: [ { - repeatable: true, component: 'basic.nested-compo3', - name: 'somecompo', }, ], }, @@ -55,9 +47,7 @@ const components: Array = [ component: 'basic.nested-compo1', childComponents: [ { - repeatable: false, component: 'basic.nested-compo2', - name: 'compofield', }, ], }, @@ -65,9 +55,7 @@ const components: Array = [ component: 'basic.another-parent-compo', childComponents: [ { - repeatable: false, component: 'basic.nested-compo6', - name: 'somecompo', }, ], }, @@ -75,14 +63,10 @@ const components: Array = [ component: 'default.openingtimes', childComponents: [ { - repeatable: true, component: 'default.dish', - name: 'dishrep', }, { - repeatable: true, component: 'basic.nested-compo3', - name: 'somecompo', }, ], }, @@ -91,10 +75,6 @@ const components: Array = [ childComponents: [ { component: 'default.dish', - repeatable: true, - required: true, - min: 2, - name: 'dish', }, ], }, From cc05b7b4cbd02cd910f69ea3c5d4038753b84a8d Mon Sep 17 00:00:00 2001 From: Bassel Kanso Date: Thu, 13 Jun 2024 16:42:38 +0300 Subject: [PATCH 07/78] chore: adding extra unit tests --- .../utils/retrieveNestedComponents.ts | 6 +- .../admin/src/utils/getMaxDepth.ts | 4 +- .../admin/src/utils/tests/getMaxDepth.test.ts | 68 ++++++++++++++++--- 3 files changed, 63 insertions(+), 15 deletions(-) diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts index 0a4ea85947..0ca490c0d4 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/utils/retrieveNestedComponents.ts @@ -10,7 +10,7 @@ export type NestedComponent = { export const retrieveNestedComponents = (appComponents: Components): NestedComponent[] => { const nestedComponents = Object.keys(appComponents).reduce((acc: NestedComponent[], current) => { const componentAttributes = appComponents?.[current]?.schema?.attributes ?? []; - const currentComponentNestedCompos = getComponentsFromComponent( + const currentComponentNestedCompos = getComponentsNestedWithinComponent( componentAttributes, current as Internal.UID.Component ); @@ -20,7 +20,7 @@ export const retrieveNestedComponents = (appComponents: Components): NestedCompo return mergeComponents(nestedComponents); }; -const getComponentsFromComponent = ( +const getComponentsNestedWithinComponent = ( componentAttributes: AttributeType[], parentCompoUid: Internal.UID.Component ) => { @@ -37,7 +37,7 @@ const getComponentsFromComponent = ( }, []); }; -// merge duplicate components +// Merge duplicate components const mergeComponents = (originalComponents: NestedComponent[]): NestedComponent[] => { const componentMap = new Map(); // Populate the map with component and its parents diff --git a/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts b/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts index 5f8a1d7fcb..dcda1d0945 100644 --- a/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts +++ b/packages/core/content-type-builder/admin/src/utils/getMaxDepth.ts @@ -3,10 +3,10 @@ import type { NestedComponent } from '../components/DataManagerProvider/utils/re import type { Internal } from '@strapi/types'; const findComponent = ( - componentName: Internal.UID.Schema, + componentUid: Internal.UID.Schema, components: Array ) => { - return components.find((c) => c.component === componentName); + return components.find((c) => c.component === componentUid); }; /** diff --git a/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts b/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts index eaa36a5895..0981bf8326 100644 --- a/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts +++ b/packages/core/content-type-builder/admin/src/utils/tests/getMaxDepth.test.ts @@ -1,8 +1,9 @@ -import { getChildrenMaxDepth } from '../getMaxDepth'; +import { getChildrenMaxDepth, getComponentDepth } from '../getMaxDepth'; import type { ComponentWithChildren } from '../../components/DataManagerProvider/utils/retrieveComponentsThatHaveComponents'; +import type { NestedComponent } from '../../components/DataManagerProvider/utils/retrieveNestedComponents'; -const components: Array = [ +const componentsWithChildComponents: Array = [ { component: 'basic.parent-compo', childComponents: [ @@ -80,16 +81,63 @@ const components: Array = [ }, ]; -describe('getMaxDepth', () => { - test('A component with no child component should have 0 max depth', () => { - const componentsMaxDepth = getChildrenMaxDepth('basic.nested-compo6', components); +const nestedComponents: Array = [ + { + component: 'default.dish', + uidsOfAllParents: ['default.openingtimes', 'default.closingperiod'], + }, + { + component: 'basic.nested-compo1', + uidsOfAllParents: ['basic.parent-compo'], + }, + { + component: 'basic.nested-compo6', + uidsOfAllParents: ['basic.nested-compo5', 'basic.another-parent-compo'], + }, + { + component: 'basic.nested-compo5', + uidsOfAllParents: ['basic.nested-compo4'], + }, + { + component: 'basic.nested-compo4', + uidsOfAllParents: ['basic.nested-compo3'], + }, + { + component: 'basic.nested-compo3', + uidsOfAllParents: ['basic.nested-compo2'], + }, + { + component: 'basic.nested-compo2', + uidsOfAllParents: ['basic.nested-compo1'], + }, +]; - expect(componentsMaxDepth).toEqual(0); +describe('Component Depth Calculations', () => { + describe('getMaxDepth', () => { + it('A component with no child component should have 0 max depth', () => { + const componentsMaxDepth = getChildrenMaxDepth( + 'basic.nested-compo6', + componentsWithChildComponents + ); + + expect(componentsMaxDepth).toEqual(0); + }); + + it('should accurately give the max depth of components children', () => { + const componentsMaxDepth = getChildrenMaxDepth( + 'default.openingtimes', + componentsWithChildComponents + ); + + expect(componentsMaxDepth).toEqual(4); + }); }); - test('should accurately give the max depth of components children', () => { - const componentsMaxDepth = getChildrenMaxDepth('default.openingtimes', components); - - expect(componentsMaxDepth).toEqual(4); + describe('getComponentDepth', () => { + it('A component depth should reflect its position in the component tree', () => { + expect(getComponentDepth('basic.nested-compo1', nestedComponents)).toEqual(1); + expect(getComponentDepth('basic.nested-compo4', nestedComponents)).toEqual(4); + expect(getComponentDepth('basic.nested-compo6', nestedComponents)).toEqual(6); + }); }); }); From 0568e78862e54058620f0bc63000ad844207bd36 Mon Sep 17 00:00:00 2001 From: Bassel Kanso Date: Fri, 14 Jun 2024 15:40:17 +0300 Subject: [PATCH 08/78] fix: remove incorrect server validation --- .../src/controllers/validation/types.ts | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/packages/core/content-type-builder/server/src/controllers/validation/types.ts b/packages/core/content-type-builder/server/src/controllers/validation/types.ts index 7ebb5a1961..f341b651d6 100644 --- a/packages/core/content-type-builder/server/src/controllers/validation/types.ts +++ b/packages/core/content-type-builder/server/src/controllers/validation/types.ts @@ -219,24 +219,8 @@ const getTypeShape = ( return { required: validators.required, repeatable: yup.boolean(), - component: yup - .string() - .test({ - name: 'Check max component nesting is 1 lvl', - test(compoUID: unknown) { - const targetCompo = strapi.components[compoUID as UID.Component]; - if (!targetCompo) return true; // ignore this error as it will fail beforehand - - if (modelType === modelTypes.COMPONENT && hasComponent(targetCompo)) { - return this.createError({ - path: this.path, - message: `${targetCompo.modelName} already is a nested component. You cannot have more than one level of nesting inside your components.`, - }); - } - return true; - }, - }) - .required(), + // TODO: Add correct server validation for nested components + component: yup.string().required(), min: yup.number(), max: yup.number(), }; From 90aea0d45bc726f96bcc63e935276264a0ae7bc3 Mon Sep 17 00:00:00 2001 From: Bassel Kanso Date: Fri, 14 Jun 2024 15:59:29 +0300 Subject: [PATCH 09/78] chore: removed unused code --- .../server/src/controllers/validation/types.ts | 8 ++------ .../server/src/utils/attributes.ts | 10 +--------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/packages/core/content-type-builder/server/src/controllers/validation/types.ts b/packages/core/content-type-builder/server/src/controllers/validation/types.ts index f341b651d6..0b03fef29e 100644 --- a/packages/core/content-type-builder/server/src/controllers/validation/types.ts +++ b/packages/core/content-type-builder/server/src/controllers/validation/types.ts @@ -2,9 +2,8 @@ import _ from 'lodash'; import { yup } from '@strapi/utils'; import type { TestContext } from 'yup'; -import type { Schema, UID, Struct } from '@strapi/types'; +import type { Schema, Struct } from '@strapi/types'; -import { hasComponent } from '../../utils/attributes'; import { modelTypes, VALID_UID_TARGETS } from '../../services/constants'; import { validators, @@ -47,10 +46,7 @@ export const getTypeValidator = ( } as any); }; -const getTypeShape = ( - attribute: Schema.Attribute.AnyAttribute, - { modelType, attributes }: any = {} -) => { +const getTypeShape = (attribute: Schema.Attribute.AnyAttribute, { attributes }: any = {}) => { switch (attribute.type) { /** * complex types diff --git a/packages/core/content-type-builder/server/src/utils/attributes.ts b/packages/core/content-type-builder/server/src/utils/attributes.ts index 952a126820..e1113893ef 100644 --- a/packages/core/content-type-builder/server/src/utils/attributes.ts +++ b/packages/core/content-type-builder/server/src/utils/attributes.ts @@ -1,17 +1,9 @@ import _ from 'lodash'; import utils, { errors } from '@strapi/utils'; -import type { Schema, Struct } from '@strapi/types'; +import type { Schema } from '@strapi/types'; const { ApplicationError } = errors; -export const hasComponent = (model: Struct.Schema) => { - const compoKeys = Object.keys(model.attributes || {}).filter((key) => { - return model.attributes[key].type === 'component'; - }); - - return compoKeys.length > 0; -}; - export const isConfigurable = (attribute: Schema.Attribute.AnyAttribute) => _.get(attribute, 'configurable', true); From cdb95f31eee297bb0cef54d57bd3d0772b5650b2 Mon Sep 17 00:00:00 2001 From: Fernando Chavez Date: Tue, 18 Jun 2024 15:21:45 +0200 Subject: [PATCH 10/78] fix(content-manager): fix filters bugs with relations, enums and uids --- .../admin/admin/src/components/Filters.tsx | 24 ++++++++++++------- .../src/components/FormInputs/Renderer.tsx | 1 + .../admin/src/components/FormInputs/types.ts | 1 - .../core/admin/admin/src/constants/filters.ts | 3 +++ .../src/pages/ListView/components/Filters.tsx | 10 ++++++++ 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/packages/core/admin/admin/src/components/Filters.tsx b/packages/core/admin/admin/src/components/Filters.tsx index 7d5c67b3ee..6e8fc9e1d0 100644 --- a/packages/core/admin/admin/src/components/Filters.tsx +++ b/packages/core/admin/admin/src/components/Filters.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; -import { Box, Button, Flex, Popover, Tag, useComposedRefs } from '@strapi/design-system'; +import { Box, Button, Flex, Popover, Tag } from '@strapi/design-system'; import { Plus, Filter as FilterIcon, Cross } from '@strapi/icons'; import { Schema } from '@strapi/types'; import { useIntl } from 'react-intl'; @@ -12,6 +12,7 @@ import { IS_SENSITIVE_FILTERS, NUMERIC_FILTERS, STRING_PARSE_FILTERS, + FILTERS_WITH_NO_VALUE, } from '../constants/filters'; import { useControllableState } from '../hooks/useControllableState'; import { useQueryParams } from '../hooks/useQueryParams'; @@ -119,7 +120,9 @@ const PopoverImpl = () => { } const handleSubmit = (data: FilterFormData) => { - if (!data.value) { + const value = FILTERS_WITH_NO_VALUE.includes(data.filter) ? 'true' : data.value; + + if (!value) { return; } @@ -130,12 +133,12 @@ const PopoverImpl = () => { /** * There will ALWAYS be an option because we use the options to create the form data. */ - const filterType = options.find((filter) => filter.name === data.name)!.type; + const fieldOptions = options.find((filter) => filter.name === data.name)!; /** * If the filter is a relation, we need to nest the filter object, - * we always use ids to filter relations. But the nested object is - * the operator & value pair. This value _could_ look like: + * we filter based on the mainField of the relation, if there is no mainField, we use the id. + * At the end, we pass the operator & value. This value _could_ look like: * ```json * { * "$eq": "1", @@ -143,7 +146,7 @@ const PopoverImpl = () => { * ``` */ const operatorValuePairing = { - [data.filter]: data.value, + [data.filter]: value, }; const newFilterQuery = { @@ -152,9 +155,9 @@ const PopoverImpl = () => { ...(query.filters?.$and ?? []), { [data.name]: - filterType === 'relation' + fieldOptions.type === 'relation' ? { - id: operatorValuePairing, + [fieldOptions.mainField?.name ?? 'id']: operatorValuePairing, } : operatorValuePairing, }, @@ -266,7 +269,6 @@ const getFilterList = (filter?: Filters.Filter): FilterOption[] => { switch (type) { case 'email': case 'text': - case 'enumeration': case 'string': { return [ ...BASE_FILTERS, @@ -291,6 +293,10 @@ const getFilterList = (filter?: Filters.Filter): FilterOption[] => { return [...BASE_FILTERS, ...NUMERIC_FILTERS]; } + case 'enumeration': { + return BASE_FILTERS; + } + default: return [...BASE_FILTERS, ...IS_SENSITIVE_FILTERS]; } diff --git a/packages/core/admin/admin/src/components/FormInputs/Renderer.tsx b/packages/core/admin/admin/src/components/FormInputs/Renderer.tsx index 0992432d38..16ef890d55 100644 --- a/packages/core/admin/admin/src/components/FormInputs/Renderer.tsx +++ b/packages/core/admin/admin/src/components/FormInputs/Renderer.tsx @@ -36,6 +36,7 @@ const InputRenderer = memo( case 'biginteger': case 'timestamp': case 'string': + case 'uid': return ; case 'boolean': return ; diff --git a/packages/core/admin/admin/src/components/FormInputs/types.ts b/packages/core/admin/admin/src/components/FormInputs/types.ts index dcf847eec0..e8da4b7c37 100644 --- a/packages/core/admin/admin/src/components/FormInputs/types.ts +++ b/packages/core/admin/admin/src/components/FormInputs/types.ts @@ -36,7 +36,6 @@ interface InputProps { | 'media' | 'blocks' | 'richtext' - | 'uid' | 'dynamiczone' | 'component' | 'relation' diff --git a/packages/core/admin/admin/src/constants/filters.ts b/packages/core/admin/admin/src/constants/filters.ts index d0ab823a15..576364fb11 100644 --- a/packages/core/admin/admin/src/constants/filters.ts +++ b/packages/core/admin/admin/src/constants/filters.ts @@ -158,11 +158,14 @@ const STRING_PARSE_FILTERS = [ }, ] satisfies FilterOption[]; +const FILTERS_WITH_NO_VALUE = ['$null', '$notNull']; + export { BASE_FILTERS, NUMERIC_FILTERS, IS_SENSITIVE_FILTERS, CONTAINS_FILTERS, STRING_PARSE_FILTERS, + FILTERS_WITH_NO_VALUE, }; export type { FilterOption }; diff --git a/packages/core/content-manager/admin/src/pages/ListView/components/Filters.tsx b/packages/core/content-manager/admin/src/pages/ListView/components/Filters.tsx index 428d681a25..23eafb0bb2 100644 --- a/packages/core/content-manager/admin/src/pages/ListView/components/Filters.tsx +++ b/packages/core/content-manager/admin/src/pages/ListView/components/Filters.tsx @@ -163,6 +163,16 @@ const FiltersImpl = ({ disabled, schema }: FiltersProps) => { }; } + if (attribute.type === 'enumeration') { + filter = { + ...filter, + options: attribute.enum.map((value) => ({ + label: value, + value, + })), + }; + } + return filter; }) .filter(Boolean) as Filters.Filter[] From 7b4ac52a4983b03554d50c36e598f9e6b889a0b1 Mon Sep 17 00:00:00 2001 From: Fernando Chavez Date: Wed, 19 Jun 2024 11:32:59 +0200 Subject: [PATCH 11/78] fix(core): disallow required on relation fields on schemas --- packages/core/core/src/services/entity-validator/index.ts | 5 ----- .../core/src/utils/transform-content-types-to-models.ts | 7 +++++++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/core/core/src/services/entity-validator/index.ts b/packages/core/core/src/services/entity-validator/index.ts index c356851874..7228fade6e 100644 --- a/packages/core/core/src/services/entity-validator/index.ts +++ b/packages/core/core/src/services/entity-validator/index.ts @@ -216,11 +216,6 @@ const createRelationValidator = validator = yup.mixed(); } - validator = addRequiredValidation(createOrUpdate)(validator, { - attr: { required: !isDraft && attr.required }, - updatedAttribute, - }); - return validator; }; diff --git a/packages/core/core/src/utils/transform-content-types-to-models.ts b/packages/core/core/src/utils/transform-content-types-to-models.ts index 7ad5b4184c..7127ab9d37 100644 --- a/packages/core/core/src/utils/transform-content-types-to-models.ts +++ b/packages/core/core/src/utils/transform-content-types-to-models.ts @@ -158,6 +158,13 @@ export const transformAttribute = ( }, }; } + case 'relation': { + if (attribute.required) { + throw new Error( + `Required relations are not supported, please remove it from ${contentType.collectionName} schema on the attribute ${name}` + ); + } + } default: { return attribute; } From c5b607c37e502e29dd00c882175151bbc7867bbb Mon Sep 17 00:00:00 2001 From: Bassel Kanso Date: Wed, 19 Jun 2024 15:32:37 +0300 Subject: [PATCH 12/78] fix: check contentype attributes against itself --- .../admin/src/components/DataManagerProvider/reducer.ts | 5 ----- .../src/components/FormModal/attributes/validation/common.ts | 1 - 2 files changed, 6 deletions(-) diff --git a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/reducer.ts b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/reducer.ts index 6ee2b6dc95..1c3496876d 100644 --- a/packages/core/content-type-builder/admin/src/components/DataManagerProvider/reducer.ts +++ b/packages/core/content-type-builder/admin/src/components/DataManagerProvider/reducer.ts @@ -549,11 +549,6 @@ const reducer = (state = initialState, action: Action) => break; } - case actions.UPDATE_INITIAL_STATE: { - draftState.initialData = draftState.modifiedData; - - break; - } case actions.DELETE_NOT_SAVED_TYPE: { // Doing so will also reset the modified and the initial data draftState.contentTypes = state.initialContentTypes; diff --git a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/validation/common.ts b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/validation/common.ts index f190a4a2aa..4742ad80f0 100644 --- a/packages/core/content-type-builder/admin/src/components/FormModal/attributes/validation/common.ts +++ b/packages/core/content-type-builder/admin/src/components/FormModal/attributes/validation/common.ts @@ -20,7 +20,6 @@ const alreadyUsedAttributeNames = ( const snakeCaseKey = snakeCase(value); return !usedNames.some((existingKey) => { - if (existingKey === value) return false; // don't compare against itself return snakeCase(existingKey) === snakeCaseKey; }); }, From 06f526742aade79887b932ca68c27cda8ec0ec03 Mon Sep 17 00:00:00 2001 From: Fernando Chavez Date: Wed, 19 Jun 2024 18:30:38 +0200 Subject: [PATCH 13/78] fix(content-manager): allow required on relations on schema but ignore it --- .../core/content-manager/admin/src/utils/validation.ts | 2 +- .../core/src/utils/transform-content-types-to-models.ts | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/core/content-manager/admin/src/utils/validation.ts b/packages/core/content-manager/admin/src/utils/validation.ts index ecf4e94b66..dd7c2254de 100644 --- a/packages/core/content-manager/admin/src/utils/validation.ts +++ b/packages/core/content-manager/admin/src/utils/validation.ts @@ -216,7 +216,7 @@ type ValidationFn = ( ) => (schema: TSchema) => TSchema; const addRequiredValidation: ValidationFn = (attribute) => (schema) => { - if (attribute.required) { + if (attribute.required && attribute.type !== 'relation') { return schema.required({ id: translatedErrors.required.id, defaultMessage: 'This field is required.', diff --git a/packages/core/core/src/utils/transform-content-types-to-models.ts b/packages/core/core/src/utils/transform-content-types-to-models.ts index 7127ab9d37..7ad5b4184c 100644 --- a/packages/core/core/src/utils/transform-content-types-to-models.ts +++ b/packages/core/core/src/utils/transform-content-types-to-models.ts @@ -158,13 +158,6 @@ export const transformAttribute = ( }, }; } - case 'relation': { - if (attribute.required) { - throw new Error( - `Required relations are not supported, please remove it from ${contentType.collectionName} schema on the attribute ${name}` - ); - } - } default: { return attribute; } From 346110fac182d06b40f9089ee3e224352835b710 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Thu, 20 Jun 2024 09:27:20 +0200 Subject: [PATCH 14/78] v5.0.0-beta.13 --- .github/actions/check-pr-status/package.json | 2 +- lerna.json | 2 +- packages/admin-test-utils/package.json | 6 +- packages/cli/create-strapi-app/package.json | 8 +- packages/cli/create-strapi/package.json | 4 +- packages/core/admin/package.json | 14 +- packages/core/content-manager/package.json | 8 +- packages/core/content-releases/package.json | 12 +- .../core/content-type-builder/package.json | 10 +- packages/core/core/package.json | 24 +- packages/core/data-transfer/package.json | 8 +- packages/core/database/package.json | 8 +- packages/core/email/package.json | 10 +- packages/core/permissions/package.json | 8 +- packages/core/review-workflows/package.json | 8 +- packages/core/strapi/package.json | 42 +- packages/core/types/package.json | 14 +- packages/core/upload/package.json | 10 +- packages/core/utils/package.json | 6 +- packages/generators/app/package.json | 2 +- packages/generators/generators/package.json | 10 +- packages/plugins/cloud/package.json | 8 +- packages/plugins/color-picker/package.json | 4 +- packages/plugins/documentation/package.json | 12 +- packages/plugins/graphql/package.json | 12 +- packages/plugins/i18n/package.json | 12 +- packages/plugins/sentry/package.json | 4 +- .../plugins/users-permissions/package.json | 6 +- .../providers/email-amazon-ses/package.json | 8 +- packages/providers/email-mailgun/package.json | 8 +- .../providers/email-nodemailer/package.json | 6 +- .../providers/email-sendgrid/package.json | 8 +- .../providers/email-sendmail/package.json | 8 +- packages/providers/upload-aws-s3/package.json | 6 +- .../providers/upload-cloudinary/package.json | 8 +- packages/providers/upload-local/package.json | 10 +- packages/utils/api-tests/package.json | 2 +- .../utils/eslint-config-custom/package.json | 2 +- packages/utils/logger/package.json | 6 +- packages/utils/tsconfig/package.json | 2 +- packages/utils/typescript/package.json | 2 +- packages/utils/upgrade/package.json | 6 +- scripts/front/package.json | 2 +- yarn.lock | 1111 ++++++++++++++--- 44 files changed, 1129 insertions(+), 340 deletions(-) diff --git a/.github/actions/check-pr-status/package.json b/.github/actions/check-pr-status/package.json index 78e5f5723f..d42bef8a8a 100644 --- a/.github/actions/check-pr-status/package.json +++ b/.github/actions/check-pr-status/package.json @@ -1,6 +1,6 @@ { "name": "check-pr-status", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "license": "MIT", "main": "dist/index.js", diff --git a/lerna.json b/lerna.json index 4a4bef8264..64119649ec 100644 --- a/lerna.json +++ b/lerna.json @@ -1,4 +1,4 @@ { - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "npmClient": "yarn" } diff --git a/packages/admin-test-utils/package.json b/packages/admin-test-utils/package.json index eabb60d8a5..098ca7f75e 100644 --- a/packages/admin-test-utils/package.json +++ b/packages/admin-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/admin-test-utils", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "description": "Test utilities for the Strapi administration panel", "license": "MIT", @@ -81,9 +81,9 @@ "@reduxjs/toolkit": "1.9.7", "@strapi/pack-up": "5.0.0", "@testing-library/jest-dom": "6.4.5", - "eslint-config-custom": "5.0.0-beta.12", + "eslint-config-custom": "5.0.0-beta.13", "jest-environment-jsdom": "29.6.1", - "tsconfig": "5.0.0-beta.12" + "tsconfig": "5.0.0-beta.13" }, "peerDependencies": { "@reduxjs/toolkit": "^1.9.7", diff --git a/packages/cli/create-strapi-app/package.json b/packages/cli/create-strapi-app/package.json index c462530bfb..3586f934fa 100644 --- a/packages/cli/create-strapi-app/package.json +++ b/packages/cli/create-strapi-app/package.json @@ -1,6 +1,6 @@ { "name": "create-strapi-app", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Generate a new Strapi application.", "keywords": [ "create-strapi-app", @@ -43,15 +43,15 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/generate-new": "5.0.0-beta.12", + "@strapi/generate-new": "5.0.0-beta.13", "commander": "8.3.0", "inquirer": "8.2.5" }, "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/inquirer": "8.2.5", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/cli/create-strapi/package.json b/packages/cli/create-strapi/package.json index 30c0afd693..c53dc3794b 100644 --- a/packages/cli/create-strapi/package.json +++ b/packages/cli/create-strapi/package.json @@ -1,6 +1,6 @@ { "name": "create-strapi", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Generate a new Strapi application.", "keywords": [ "create-strapi", @@ -36,7 +36,7 @@ "bin/" ], "dependencies": { - "create-strapi-app": "5.0.0-beta.12" + "create-strapi-app": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/admin/package.json b/packages/core/admin/package.json index 5a115a530b..f6738fdb83 100644 --- a/packages/core/admin/package.json +++ b/packages/core/admin/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/admin", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Strapi Admin", "repository": { "type": "git", @@ -81,10 +81,10 @@ "@reduxjs/toolkit": "1.9.7", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/permissions": "5.0.0-beta.12", - "@strapi/types": "5.0.0-beta.12", - "@strapi/typescript-utils": "5.0.0-beta.12", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/permissions": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.13", + "@strapi/typescript-utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.13", "@testing-library/dom": "10.1.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", @@ -137,8 +137,8 @@ "zod": "^3.22.4" }, "devDependencies": { - "@strapi/admin-test-utils": "5.0.0-beta.12", - "@strapi/data-transfer": "5.0.0-beta.12", + "@strapi/admin-test-utils": "5.0.0-beta.13", + "@strapi/data-transfer": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", "@types/codemirror5": "npm:@types/codemirror@^5.60.15", "@types/fs-extra": "11.0.4", diff --git a/packages/core/content-manager/package.json b/packages/core/content-manager/package.json index 4d0a6e2c5e..e7d6b849af 100644 --- a/packages/core/content-manager/package.json +++ b/packages/core/content-manager/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/content-manager", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "A powerful UI to easily manage your data.", "repository": { "type": "git", @@ -62,8 +62,8 @@ "@sindresorhus/slugify": "1.1.0", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/types": "5.0.0-beta.12", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/types": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.13", "codemirror5": "npm:codemirror@^5.65.11", "date-fns": "2.30.0", "fractional-indexing": "3.2.0", @@ -97,7 +97,7 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.12", + "@strapi/admin": "5.0.0-beta.13", "@strapi/database": "workspace:*", "@strapi/pack-up": "5.0.0", "@testing-library/react": "15.0.7", diff --git a/packages/core/content-releases/package.json b/packages/core/content-releases/package.json index 50fcfaf779..ce7fabb147 100644 --- a/packages/core/content-releases/package.json +++ b/packages/core/content-releases/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/content-releases", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Strapi plugin for organizing and releasing content", "repository": { "type": "git", @@ -55,11 +55,11 @@ }, "dependencies": { "@reduxjs/toolkit": "1.9.7", - "@strapi/database": "5.0.0-beta.12", + "@strapi/database": "5.0.0-beta.13", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", "@strapi/types": "workspace:*", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "date-fns": "2.30.0", "date-fns-tz": "2.0.1", "formik": "2.4.5", @@ -70,9 +70,9 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.12", - "@strapi/admin-test-utils": "5.0.0-beta.12", - "@strapi/content-manager": "5.0.0-beta.12", + "@strapi/admin": "5.0.0-beta.13", + "@strapi/admin-test-utils": "5.0.0-beta.13", + "@strapi/content-manager": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", diff --git a/packages/core/content-type-builder/package.json b/packages/core/content-type-builder/package.json index 560046f33d..52d7e7643c 100644 --- a/packages/core/content-type-builder/package.json +++ b/packages/core/content-type-builder/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/content-type-builder", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Create and manage content types", "repository": { "type": "git", @@ -59,9 +59,9 @@ "@reduxjs/toolkit": "1.9.7", "@sindresorhus/slugify": "1.1.0", "@strapi/design-system": "2.0.0-beta.6", - "@strapi/generators": "5.0.0-beta.12", + "@strapi/generators": "5.0.0-beta.13", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "date-fns": "2.30.0", "fs-extra": "11.2.0", "immer": "9.0.21", @@ -73,9 +73,9 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.12", + "@strapi/admin": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.12", + "@strapi/types": "5.0.0-beta.13", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "@types/fs-extra": "11.0.4", diff --git a/packages/core/core/package.json b/packages/core/core/package.json index e103a03c0b..02a1f6e225 100644 --- a/packages/core/core/package.json +++ b/packages/core/core/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/core", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Core of Strapi", "homepage": "https://strapi.io", "bugs": { @@ -55,16 +55,16 @@ "@koa/cors": "5.0.0", "@koa/router": "12.0.1", "@paralleldrive/cuid2": "2.2.2", - "@strapi/admin": "5.0.0-beta.12", - "@strapi/database": "5.0.0-beta.12", - "@strapi/generate-new": "5.0.0-beta.12", - "@strapi/generators": "5.0.0-beta.12", - "@strapi/logger": "5.0.0-beta.12", + "@strapi/admin": "5.0.0-beta.13", + "@strapi/database": "5.0.0-beta.13", + "@strapi/generate-new": "5.0.0-beta.13", + "@strapi/generators": "5.0.0-beta.13", + "@strapi/logger": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", - "@strapi/permissions": "5.0.0-beta.12", - "@strapi/types": "5.0.0-beta.12", - "@strapi/typescript-utils": "5.0.0-beta.12", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/permissions": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.13", + "@strapi/typescript-utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.13", "bcryptjs": "2.4.3", "boxen": "5.1.2", "chalk": "4.1.2", @@ -126,9 +126,9 @@ "@types/node": "18.19.24", "@types/node-schedule": "2.1.0", "@types/statuses": "2.0.1", - "eslint-config-custom": "5.0.0-beta.12", + "eslint-config-custom": "5.0.0-beta.13", "supertest": "6.3.3", - "tsconfig": "5.0.0-beta.12" + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/data-transfer/package.json b/packages/core/data-transfer/package.json index 0be3f89461..852b9fc0e7 100644 --- a/packages/core/data-transfer/package.json +++ b/packages/core/data-transfer/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/data-transfer", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Data transfer capabilities for Strapi", "keywords": [ "strapi", @@ -40,9 +40,9 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/logger": "5.0.0-beta.12", - "@strapi/types": "5.0.0-beta.12", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/logger": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.13", "chalk": "4.1.2", "cli-table3": "0.6.2", "commander": "8.3.0", diff --git a/packages/core/database/package.json b/packages/core/database/package.json index f270604c05..52ea448dd2 100644 --- a/packages/core/database/package.json +++ b/packages/core/database/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/database", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Strapi's database layer", "homepage": "https://strapi.io", "bugs": { @@ -40,7 +40,7 @@ }, "dependencies": { "@paralleldrive/cuid2": "2.2.2", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "ajv": "8.16.0", "date-fns": "2.30.0", "debug": "4.3.4", @@ -53,8 +53,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/fs-extra": "11.0.4", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/email/package.json b/packages/core/email/package.json index 3101db2dc9..293ed70b1c 100644 --- a/packages/core/email/package.json +++ b/packages/core/email/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/email", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Easily configure your Strapi application to send emails.", "repository": { "type": "git", @@ -54,17 +54,17 @@ "dependencies": { "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/provider-email-sendmail": "5.0.0-beta.12", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/provider-email-sendmail": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.13", "lodash": "4.17.21", "react-intl": "6.6.2", "react-query": "3.39.3", "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.12", + "@strapi/admin": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.12", + "@strapi/types": "5.0.0-beta.13", "@testing-library/react": "15.0.7", "@types/koa": "2.13.4", "@types/lodash": "^4.14.191", diff --git a/packages/core/permissions/package.json b/packages/core/permissions/package.json index 2846ad1623..063179abed 100644 --- a/packages/core/permissions/package.json +++ b/packages/core/permissions/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/permissions", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Strapi's permission layer.", "repository": { "type": "git", @@ -37,15 +37,15 @@ }, "dependencies": { "@casl/ability": "6.5.0", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "lodash": "4.17.21", "qs": "6.11.1", "sift": "16.0.1" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/review-workflows/package.json b/packages/core/review-workflows/package.json index 7d4485dc1e..cb83e0db10 100644 --- a/packages/core/review-workflows/package.json +++ b/packages/core/review-workflows/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/review-workflows", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Review workflows for your content", "repository": { "type": "git", @@ -65,10 +65,10 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.12", - "@strapi/content-manager": "5.0.0-beta.12", + "@strapi/admin": "5.0.0-beta.13", + "@strapi/content-manager": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.12", + "@strapi/types": "5.0.0-beta.13", "@strapi/utils": "5.0.0-beta.12", "@testing-library/react": "15.0.7", "msw": "1.3.0", diff --git a/packages/core/strapi/package.json b/packages/core/strapi/package.json index 6727393bd8..b0bd972018 100644 --- a/packages/core/strapi/package.json +++ b/packages/core/strapi/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/strapi", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite", "keywords": [ "strapi", @@ -109,25 +109,25 @@ }, "dependencies": { "@pmmmwh/react-refresh-webpack-plugin": "0.5.11", - "@strapi/admin": "5.0.0-beta.12", - "@strapi/content-manager": "5.0.0-beta.12", - "@strapi/content-releases": "5.0.0-beta.12", - "@strapi/content-type-builder": "5.0.0-beta.12", - "@strapi/core": "5.0.0-beta.12", - "@strapi/data-transfer": "5.0.0-beta.12", - "@strapi/database": "5.0.0-beta.12", - "@strapi/email": "5.0.0-beta.12", - "@strapi/generate-new": "5.0.0-beta.12", - "@strapi/generators": "5.0.0-beta.12", - "@strapi/i18n": "5.0.0-beta.12", - "@strapi/logger": "5.0.0-beta.12", + "@strapi/admin": "5.0.0-beta.13", + "@strapi/content-manager": "5.0.0-beta.13", + "@strapi/content-releases": "5.0.0-beta.13", + "@strapi/content-type-builder": "5.0.0-beta.13", + "@strapi/core": "5.0.0-beta.13", + "@strapi/data-transfer": "5.0.0-beta.13", + "@strapi/database": "5.0.0-beta.13", + "@strapi/email": "5.0.0-beta.13", + "@strapi/generate-new": "5.0.0-beta.13", + "@strapi/generators": "5.0.0-beta.13", + "@strapi/i18n": "5.0.0-beta.13", + "@strapi/logger": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", - "@strapi/permissions": "5.0.0-beta.12", - "@strapi/review-workflows": "5.0.0-beta.12", - "@strapi/types": "5.0.0-beta.12", - "@strapi/typescript-utils": "5.0.0-beta.12", - "@strapi/upload": "5.0.0-beta.12", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/permissions": "5.0.0-beta.13", + "@strapi/review-workflows": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.13", + "@strapi/typescript-utils": "5.0.0-beta.13", + "@strapi/upload": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.13", "@types/nodemon": "1.19.6", "@vitejs/plugin-react-swc": "3.6.0", "boxen": "5.1.2", @@ -180,10 +180,10 @@ "@types/node": "18.19.24", "@types/webpack-bundle-analyzer": "4.7.0", "@types/webpack-hot-middleware": "2.25.9", - "eslint-config-custom": "5.0.0-beta.12", + "eslint-config-custom": "5.0.0-beta.13", "react": "18.3.1", "react-dom": "18.3.1", - "tsconfig": "5.0.0-beta.12" + "tsconfig": "5.0.0-beta.13" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0", diff --git a/packages/core/types/package.json b/packages/core/types/package.json index 8e23ba3397..a98d6ddda4 100644 --- a/packages/core/types/package.json +++ b/packages/core/types/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/types", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Shared typescript types for Strapi internal use", "keywords": [ "strapi" @@ -46,10 +46,10 @@ "@casl/ability": "6.5.0", "@koa/cors": "5.0.0", "@koa/router": "12.0.1", - "@strapi/database": "5.0.0-beta.12", - "@strapi/logger": "5.0.0-beta.12", - "@strapi/permissions": "5.0.0-beta.12", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/database": "5.0.0-beta.13", + "@strapi/logger": "5.0.0-beta.13", + "@strapi/permissions": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.13", "commander": "8.3.0", "koa": "2.15.2", "node-schedule": "2.1.0", @@ -64,9 +64,9 @@ "@types/koa": "2.13.4", "@types/koa__router": "12.0.0", "@types/node-schedule": "2.1.0", - "eslint-config-custom": "5.0.0-beta.12", + "eslint-config-custom": "5.0.0-beta.13", "lodash": "4.17.21", - "tsconfig": "5.0.0-beta.12", + "tsconfig": "5.0.0-beta.13", "typescript": "5.3.2", "undici": "6.18.2" }, diff --git a/packages/core/upload/package.json b/packages/core/upload/package.json index 8ebb3b539b..faaf7b4f3b 100644 --- a/packages/core/upload/package.json +++ b/packages/core/upload/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/upload", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Makes it easy to upload images and files to your Strapi Application.", "license": "SEE LICENSE IN LICENSE", "author": { @@ -47,8 +47,8 @@ "dependencies": { "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/provider-upload-local": "5.0.0-beta.12", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/provider-upload-local": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.13", "byte-size": "8.1.1", "cropperjs": "1.6.1", "date-fns": "2.30.0", @@ -70,9 +70,9 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.12", + "@strapi/admin": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.12", + "@strapi/types": "5.0.0-beta.13", "@testing-library/dom": "10.1.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", diff --git a/packages/core/utils/package.json b/packages/core/utils/package.json index 6dd7315243..049a4a3131 100644 --- a/packages/core/utils/package.json +++ b/packages/core/utils/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/utils", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Shared utilities for the Strapi packages", "keywords": [ "strapi", @@ -60,10 +60,10 @@ "@types/http-errors": "2.0.4", "@types/koa": "2.13.4", "@types/node": "18.19.24", - "eslint-config-custom": "5.0.0-beta.12", + "eslint-config-custom": "5.0.0-beta.13", "koa": "2.15.2", "koa-body": "6.0.1", - "tsconfig": "5.0.0-beta.12" + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/generators/app/package.json b/packages/generators/app/package.json index 5cc26a49f0..880d5722e7 100644 --- a/packages/generators/app/package.json +++ b/packages/generators/app/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/generate-new", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Generate a new Strapi application.", "keywords": [ "generate", diff --git a/packages/generators/generators/package.json b/packages/generators/generators/package.json index 11786154b2..9dc614eef1 100644 --- a/packages/generators/generators/package.json +++ b/packages/generators/generators/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/generators", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Interactive API generator.", "keywords": [ "strapi", @@ -46,8 +46,8 @@ }, "dependencies": { "@sindresorhus/slugify": "1.1.0", - "@strapi/typescript-utils": "5.0.0-beta.12", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/typescript-utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.13", "chalk": "4.1.2", "copyfiles": "2.4.1", "fs-extra": "11.2.0", @@ -58,8 +58,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/fs-extra": "11.0.4", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/plugins/cloud/package.json b/packages/plugins/cloud/package.json index 9d8c18fd91..51911e89aa 100644 --- a/packages/plugins/cloud/package.json +++ b/packages/plugins/cloud/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-cloud", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Instructions to deploy your local project to Strapi Cloud", "license": "MIT", "author": { @@ -42,13 +42,13 @@ }, "devDependencies": { "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.12", - "eslint-config-custom": "5.0.0-beta.12", + "@strapi/strapi": "5.0.0-beta.13", + "eslint-config-custom": "5.0.0-beta.13", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.22.3", "styled-components": "6.1.8", - "tsconfig": "5.0.0-beta.12", + "tsconfig": "5.0.0-beta.13", "typescript": "5.2.2" }, "peerDependencies": { diff --git a/packages/plugins/color-picker/package.json b/packages/plugins/color-picker/package.json index c09fa53803..917cac25e9 100644 --- a/packages/plugins/color-picker/package.json +++ b/packages/plugins/color-picker/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-color-picker", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Strapi maintained Custom Fields", "repository": { "type": "git", @@ -60,7 +60,7 @@ }, "devDependencies": { "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.12", + "@strapi/strapi": "5.0.0-beta.13", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "react": "18.3.1", diff --git a/packages/plugins/documentation/package.json b/packages/plugins/documentation/package.json index 5f85b76fc1..8321610041 100644 --- a/packages/plugins/documentation/package.json +++ b/packages/plugins/documentation/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-documentation", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Create an OpenAPI Document and visualize your API with SWAGGER UI.", "repository": { "type": "git", @@ -55,10 +55,10 @@ }, "dependencies": { "@reduxjs/toolkit": "1.9.7", - "@strapi/admin": "5.0.0-beta.12", + "@strapi/admin": "5.0.0-beta.13", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "bcryptjs": "2.4.3", "cheerio": "^1.0.0-rc.12", "formik": "2.4.5", @@ -74,11 +74,11 @@ }, "devDependencies": { "@apidevtools/swagger-parser": "^10.1.0", - "@strapi/admin-test-utils": "5.0.0-beta.12", + "@strapi/admin-test-utils": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.12", - "@strapi/types": "5.0.0-beta.12", + "@strapi/strapi": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.13", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "@types/fs-extra": "11.0.4", diff --git a/packages/plugins/graphql/package.json b/packages/plugins/graphql/package.json index 6cf87e482c..ea58784076 100644 --- a/packages/plugins/graphql/package.json +++ b/packages/plugins/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-graphql", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Adds GraphQL endpoint with default API methods.", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@koa/cors": "5.0.0", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "graphql": "^16.8.1", "graphql-depth-limit": "^1.1.0", "graphql-playground-middleware-koa": "^1.6.21", @@ -68,19 +68,19 @@ }, "devDependencies": { "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.12", - "@strapi/types": "5.0.0-beta.12", + "@strapi/strapi": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.13", "@types/graphql-depth-limit": "1.1.5", "@types/koa-bodyparser": "4.3.12", "@types/koa__cors": "5.0.0", "cross-env": "^7.0.3", - "eslint-config-custom": "5.0.0-beta.12", + "eslint-config-custom": "5.0.0-beta.13", "koa": "2.15.2", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.22.3", "styled-components": "6.1.8", - "tsconfig": "5.0.0-beta.12", + "tsconfig": "5.0.0-beta.13", "typescript": "5.3.2" }, "peerDependencies": { diff --git a/packages/plugins/i18n/package.json b/packages/plugins/i18n/package.json index 26c9921910..92d69cad3d 100644 --- a/packages/plugins/i18n/package.json +++ b/packages/plugins/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/i18n", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Create read and update content in different languages, both from the Admin Panel and from the API", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "1.9.7", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "lodash": "4.17.21", "qs": "6.11.1", "react-intl": "6.6.2", @@ -63,11 +63,11 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.12", - "@strapi/admin-test-utils": "5.0.0-beta.12", - "@strapi/content-manager": "5.0.0-beta.12", + "@strapi/admin": "5.0.0-beta.13", + "@strapi/admin-test-utils": "5.0.0-beta.13", + "@strapi/content-manager": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.12", + "@strapi/types": "5.0.0-beta.13", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "msw": "1.3.0", diff --git a/packages/plugins/sentry/package.json b/packages/plugins/sentry/package.json index f64b120f29..335ece8a1e 100644 --- a/packages/plugins/sentry/package.json +++ b/packages/plugins/sentry/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-sentry", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Send Strapi error events to Sentry", "repository": { "type": "git", @@ -57,7 +57,7 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.12", + "@strapi/strapi": "5.0.0-beta.13", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.22.3", diff --git a/packages/plugins/users-permissions/package.json b/packages/plugins/users-permissions/package.json index 832ee8a1a4..597180a543 100644 --- a/packages/plugins/users-permissions/package.json +++ b/packages/plugins/users-permissions/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-users-permissions", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Protect your API with a full-authentication process based on JWT", "repository": { "type": "git", @@ -48,7 +48,7 @@ "dependencies": { "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "bcryptjs": "2.4.3", "formik": "2.4.5", "grant-koa": "5.4.8", @@ -68,7 +68,7 @@ }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "@strapi/strapi": "5.0.0-beta.12", + "@strapi/strapi": "5.0.0-beta.13", "@testing-library/dom": "10.1.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", diff --git a/packages/providers/email-amazon-ses/package.json b/packages/providers/email-amazon-ses/package.json index 609f3ec898..71d40a9f98 100644 --- a/packages/providers/email-amazon-ses/package.json +++ b/packages/providers/email-amazon-ses/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-amazon-ses", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Amazon SES provider for strapi email", "keywords": [ "email", @@ -42,13 +42,13 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "node-ses": "^3.0.3" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-mailgun/package.json b/packages/providers/email-mailgun/package.json index c63ed1a5d0..27f79a23f4 100644 --- a/packages/providers/email-mailgun/package.json +++ b/packages/providers/email-mailgun/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-mailgun", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Mailgun provider for strapi email plugin", "keywords": [ "email", @@ -44,14 +44,14 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "form-data": "^4.0.0", "mailgun.js": "10.2.1" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-nodemailer/package.json b/packages/providers/email-nodemailer/package.json index bed0f339da..3263bc7162 100644 --- a/packages/providers/email-nodemailer/package.json +++ b/packages/providers/email-nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-nodemailer", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Nodemailer provider for Strapi 3", "keywords": [ "strapi", @@ -61,8 +61,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/nodemailer": "6.4.7", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-sendgrid/package.json b/packages/providers/email-sendgrid/package.json index 8488283d42..0c6cb7d3ad 100644 --- a/packages/providers/email-sendgrid/package.json +++ b/packages/providers/email-sendgrid/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-sendgrid", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Sendgrid provider for strapi email", "keywords": [ "email", @@ -43,12 +43,12 @@ }, "dependencies": { "@sendgrid/mail": "7.7.0", - "@strapi/utils": "5.0.0-beta.12" + "@strapi/utils": "5.0.0-beta.13" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-sendmail/package.json b/packages/providers/email-sendmail/package.json index 3b83fa8785..f9f7755930 100644 --- a/packages/providers/email-sendmail/package.json +++ b/packages/providers/email-sendmail/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-sendmail", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Sendmail provider for strapi email", "keywords": [ "email", @@ -41,14 +41,14 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "sendmail": "^1.6.1" }, "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/sendmail": "1.4.4", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/upload-aws-s3/package.json b/packages/providers/upload-aws-s3/package.json index 9896e808a5..13dd7328d0 100644 --- a/packages/providers/upload-aws-s3/package.json +++ b/packages/providers/upload-aws-s3/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-aws-s3", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "AWS S3 provider for strapi upload", "keywords": [ "upload", @@ -54,8 +54,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/jest": "29.5.2", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/upload-cloudinary/package.json b/packages/providers/upload-cloudinary/package.json index aff06008eb..032925fb33 100644 --- a/packages/providers/upload-cloudinary/package.json +++ b/packages/providers/upload-cloudinary/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-cloudinary", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Cloudinary provider for strapi upload", "keywords": [ "upload", @@ -42,14 +42,14 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "cloudinary": "^1.41.0", "into-stream": "^5.1.0" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/upload-local/package.json b/packages/providers/upload-local/package.json index d2bd3151a0..b7aaf30106 100644 --- a/packages/providers/upload-local/package.json +++ b/packages/providers/upload-local/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-local", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Local provider for strapi upload", "keywords": [ "upload", @@ -43,17 +43,17 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "fs-extra": "11.2.0" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.12", + "@strapi/types": "5.0.0-beta.13", "@types/fs-extra": "11.0.4", "@types/jest": "29.5.2", - "eslint-config-custom": "5.0.0-beta.12", + "eslint-config-custom": "5.0.0-beta.13", "memfs": "4.6.0", - "tsconfig": "5.0.0-beta.12" + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/utils/api-tests/package.json b/packages/utils/api-tests/package.json index c48e58ce42..fab20e28a9 100644 --- a/packages/utils/api-tests/package.json +++ b/packages/utils/api-tests/package.json @@ -1,6 +1,6 @@ { "name": "api-tests", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "dependencies": { "dotenv": "16.4.5", diff --git a/packages/utils/eslint-config-custom/package.json b/packages/utils/eslint-config-custom/package.json index ba506f3c67..5a8bfea3ee 100644 --- a/packages/utils/eslint-config-custom/package.json +++ b/packages/utils/eslint-config-custom/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-custom", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "main": "index.js" } diff --git a/packages/utils/logger/package.json b/packages/utils/logger/package.json index 6bbf0a220c..5c3ec84958 100644 --- a/packages/utils/logger/package.json +++ b/packages/utils/logger/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/logger", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Strapi's logger", "homepage": "https://strapi.io", "bugs": { @@ -43,8 +43,8 @@ }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.12", - "tsconfig": "5.0.0-beta.12" + "eslint-config-custom": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.13" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/utils/tsconfig/package.json b/packages/utils/tsconfig/package.json index b65dc71455..6359a4aa39 100644 --- a/packages/utils/tsconfig/package.json +++ b/packages/utils/tsconfig/package.json @@ -1,6 +1,6 @@ { "name": "tsconfig", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "devDependencies": { "@tsconfig/node18": "18.2.2" diff --git a/packages/utils/typescript/package.json b/packages/utils/typescript/package.json index c851e3b024..e89670b10c 100644 --- a/packages/utils/typescript/package.json +++ b/packages/utils/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/typescript-utils", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "Typescript support for Strapi", "keywords": [ "strapi", diff --git a/packages/utils/upgrade/package.json b/packages/utils/upgrade/package.json index b9d99980e0..e077be3dc8 100644 --- a/packages/utils/upgrade/package.json +++ b/packages/utils/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/upgrade", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "description": "CLI to upgrade Strapi applications effortless", "keywords": [ "strapi", @@ -59,7 +59,7 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "chalk": "4.1.2", "cli-table3": "0.6.2", "commander": "8.3.0", @@ -76,7 +76,7 @@ }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.12", + "@strapi/types": "5.0.0-beta.13", "@types/fs-extra": "11.0.4", "@types/jscodeshift": "0.11.10", "eslint-config-custom": "workspace:*", diff --git a/scripts/front/package.json b/scripts/front/package.json index a78ead9da3..ce7747a9eb 100644 --- a/scripts/front/package.json +++ b/scripts/front/package.json @@ -1,6 +1,6 @@ { "name": "scripts-front", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "scripts": { "test:front": "jest --config jest.config.front.js" diff --git a/yarn.lock b/yarn.lock index 02103d3c54..70d3b0dbeb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7644,7 +7644,7 @@ __metadata: languageName: node linkType: hard -"@strapi/admin-test-utils@npm:5.0.0-beta.12, @strapi/admin-test-utils@workspace:*, @strapi/admin-test-utils@workspace:packages/admin-test-utils": +"@strapi/admin-test-utils@npm:5.0.0-beta.13, @strapi/admin-test-utils@workspace:*, @strapi/admin-test-utils@workspace:packages/admin-test-utils": version: 0.0.0-use.local resolution: "@strapi/admin-test-utils@workspace:packages/admin-test-utils" dependencies: @@ -7652,10 +7652,10 @@ __metadata: "@reduxjs/toolkit": "npm:1.9.7" "@strapi/pack-up": "npm:5.0.0" "@testing-library/jest-dom": "npm:6.4.5" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" jest-environment-jsdom: "npm:29.6.1" jest-styled-components: "npm:7.1.1" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" whatwg-fetch: "npm:3.6.2" peerDependencies: "@reduxjs/toolkit": ^1.9.7 @@ -7664,7 +7664,82 @@ __metadata: languageName: unknown linkType: soft -"@strapi/admin@npm:5.0.0-beta.12, @strapi/admin@workspace:packages/core/admin": +"@strapi/admin@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/admin@npm:5.0.0-beta.12" + dependencies: + "@casl/ability": "npm:6.5.0" + "@internationalized/date": "npm:3.5.4" + "@radix-ui/react-context": "npm:1.0.1" + "@radix-ui/react-toolbar": "npm:1.0.4" + "@reduxjs/toolkit": "npm:1.9.7" + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/permissions": "npm:5.0.0-beta.12" + "@strapi/types": "npm:5.0.0-beta.12" + "@strapi/typescript-utils": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.12" + "@testing-library/dom": "npm:10.1.0" + "@testing-library/react": "npm:15.0.7" + "@testing-library/user-event": "npm:14.5.2" + axios: "npm:1.6.8" + bcryptjs: "npm:2.4.3" + boxen: "npm:5.1.2" + chalk: "npm:^4.1.2" + codemirror5: "npm:codemirror@^5.65.11" + cross-env: "npm:^7.0.3" + date-fns: "npm:2.30.0" + execa: "npm:5.1.1" + fast-deep-equal: "npm:3.1.3" + formik: "npm:2.4.5" + fractional-indexing: "npm:3.2.0" + fs-extra: "npm:11.2.0" + highlight.js: "npm:^10.4.1" + immer: "npm:9.0.21" + inquirer: "npm:8.2.5" + invariant: "npm:^2.2.4" + jsonwebtoken: "npm:9.0.0" + koa: "npm:2.15.2" + koa-compose: "npm:4.1.0" + koa-passport: "npm:6.0.0" + koa-static: "npm:5.0.0" + koa2-ratelimit: "npm:^1.1.3" + lodash: "npm:4.17.21" + msw: "npm:1.3.0" + node-schedule: "npm:2.1.0" + ora: "npm:5.4.1" + p-map: "npm:4.0.0" + passport-local: "npm:1.0.0" + pluralize: "npm:8.0.0" + qs: "npm:6.11.1" + react-dnd: "npm:16.0.1" + react-dnd-html5-backend: "npm:16.0.1" + react-intl: "npm:6.6.2" + react-is: "npm:^18.2.0" + react-query: "npm:3.39.3" + react-redux: "npm:8.1.3" + react-select: "npm:5.8.0" + react-window: "npm:1.8.10" + rimraf: "npm:5.0.5" + sanitize-html: "npm:2.11.0" + scheduler: "npm:0.23.0" + semver: "npm:7.5.4" + sift: "npm:16.0.1" + typescript: "npm:5.3.2" + use-context-selector: "npm:1.4.1" + yup: "npm:0.32.9" + zod: "npm:^3.22.4" + peerDependencies: + "@strapi/data-transfer": ^5.0.0 ||  ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 6b53a7ce55950b87a794b72f53a817c96f9a90eeff25c9a14956b1fb81b08d022d876c4dc217574aff6845def36872fc64daab05ed0d42a46df480f306b3c872 + languageName: node + linkType: hard + +"@strapi/admin@npm:5.0.0-beta.13, @strapi/admin@workspace:packages/core/admin": version: 0.0.0-use.local resolution: "@strapi/admin@workspace:packages/core/admin" dependencies: @@ -7673,15 +7748,15 @@ __metadata: "@radix-ui/react-context": "npm:1.0.1" "@radix-ui/react-toolbar": "npm:1.0.4" "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin-test-utils": "npm:5.0.0-beta.12" - "@strapi/data-transfer": "npm:5.0.0-beta.12" + "@strapi/admin-test-utils": "npm:5.0.0-beta.13" + "@strapi/data-transfer": "npm:5.0.0-beta.13" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.12" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/typescript-utils": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/permissions": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/typescript-utils": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@testing-library/dom": "npm:10.1.0" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" @@ -7763,20 +7838,72 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-manager@npm:5.0.0-beta.12, @strapi/content-manager@workspace:packages/core/content-manager": +"@strapi/content-manager@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/content-manager@npm:5.0.0-beta.12" + dependencies: + "@radix-ui/react-toolbar": "npm:1.0.4" + "@reduxjs/toolkit": "npm:1.9.7" + "@sindresorhus/slugify": "npm:1.1.0" + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/types": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.12" + codemirror5: "npm:codemirror@^5.65.11" + date-fns: "npm:2.30.0" + fractional-indexing: "npm:3.2.0" + highlight.js: "npm:^10.4.1" + immer: "npm:9.0.21" + koa: "npm:2.15.2" + lodash: "npm:4.17.21" + markdown-it: "npm:^12.3.2" + markdown-it-abbr: "npm:^1.0.4" + markdown-it-container: "npm:^3.0.0" + markdown-it-deflist: "npm:^2.1.0" + markdown-it-emoji: "npm:^2.0.0" + markdown-it-footnote: "npm:^3.0.3" + markdown-it-ins: "npm:^3.0.1" + markdown-it-mark: "npm:^3.0.1" + markdown-it-sub: "npm:^1.0.0" + markdown-it-sup: "npm:1.0.0" + node-schedule: "npm:2.1.0" + qs: "npm:6.11.1" + react-dnd: "npm:16.0.1" + react-dnd-html5-backend: "npm:16.0.1" + react-helmet: "npm:^6.1.0" + react-intl: "npm:6.6.2" + react-query: "npm:3.39.3" + react-redux: "npm:8.1.3" + react-window: "npm:1.8.10" + sanitize-html: "npm:2.11.0" + slate: "npm:0.94.1" + slate-history: "npm:0.93.0" + slate-react: "npm:0.98.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: d77dc01b9fa57b79effd0f3b74c052d66a5d5ee6eb137e82e09741b74dff230dbce397fde9a9bcde1b101214250290a670640cf5b9e06c294a604c68e04f2603 + languageName: node + linkType: hard + +"@strapi/content-manager@npm:5.0.0-beta.13, @strapi/content-manager@workspace:packages/core/content-manager": version: 0.0.0-use.local resolution: "@strapi/content-manager@workspace:packages/core/content-manager" dependencies: "@radix-ui/react-toolbar": "npm:1.0.4" "@reduxjs/toolkit": "npm:1.9.7" "@sindresorhus/slugify": "npm:1.1.0" - "@strapi/admin": "npm:5.0.0-beta.12" + "@strapi/admin": "npm:5.0.0-beta.13" "@strapi/database": "workspace:*" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@testing-library/react": "npm:15.0.7" "@types/jest": "npm:29.5.2" "@types/lodash": "npm:^4.14.191" @@ -7826,20 +7953,49 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-releases@npm:5.0.0-beta.12, @strapi/content-releases@workspace:packages/core/content-releases": +"@strapi/content-releases@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/content-releases@npm:5.0.0-beta.12" + dependencies: + "@reduxjs/toolkit": "npm:1.9.7" + "@strapi/database": "npm:5.0.0-beta.12" + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/types": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.12" + date-fns: "npm:2.30.0" + date-fns-tz: "npm:2.0.1" + formik: "npm:2.4.5" + lodash: "npm:4.17.21" + node-schedule: "npm:2.1.0" + react-intl: "npm:6.6.2" + react-redux: "npm:8.1.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + "@strapi/content-manager": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: b303b4d3abd6d397cf98fa2f03324f9f15411ab5faef59371fde6a8b3cb000be1bdeea4145f3eafd528c9da1a23b2024b754180fb9d36a877db7ba0101279b14 + languageName: node + linkType: hard + +"@strapi/content-releases@npm:5.0.0-beta.13, @strapi/content-releases@workspace:packages/core/content-releases": version: 0.0.0-use.local resolution: "@strapi/content-releases@workspace:packages/core/content-releases" dependencies: "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.12" - "@strapi/admin-test-utils": "npm:5.0.0-beta.12" - "@strapi/content-manager": "npm:5.0.0-beta.12" - "@strapi/database": "npm:5.0.0-beta.12" + "@strapi/admin": "npm:5.0.0-beta.13" + "@strapi/admin-test-utils": "npm:5.0.0-beta.13" + "@strapi/content-manager": "npm:5.0.0-beta.13" + "@strapi/database": "npm:5.0.0-beta.13" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" "@strapi/types": "workspace:*" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.13" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" "@types/koa": "npm:2.13.4" @@ -7869,19 +8025,48 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-type-builder@npm:5.0.0-beta.12, @strapi/content-type-builder@workspace:packages/core/content-type-builder": +"@strapi/content-type-builder@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/content-type-builder@npm:5.0.0-beta.12" + dependencies: + "@reduxjs/toolkit": "npm:1.9.7" + "@sindresorhus/slugify": "npm:1.1.0" + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/generators": "npm:5.0.0-beta.12" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/utils": "npm:5.0.0-beta.12" + date-fns: "npm:2.30.0" + fs-extra: "npm:11.2.0" + immer: "npm:9.0.21" + lodash: "npm:4.17.21" + pluralize: "npm:8.0.0" + qs: "npm:6.11.1" + react-intl: "npm:6.6.2" + react-redux: "npm:8.1.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: aa953911519f136f82597acd5a2ea9fb3109d18fb7f8485150a03a2ae246132deaca5c3ec53c83d8d02f16d3c935480dfa0e96d85ca5def1cca0c729ab82bef1 + languageName: node + linkType: hard + +"@strapi/content-type-builder@npm:5.0.0-beta.13, @strapi/content-type-builder@workspace:packages/core/content-type-builder": version: 0.0.0-use.local resolution: "@strapi/content-type-builder@workspace:packages/core/content-type-builder" dependencies: "@reduxjs/toolkit": "npm:1.9.7" "@sindresorhus/slugify": "npm:1.1.0" - "@strapi/admin": "npm:5.0.0-beta.12" + "@strapi/admin": "npm:5.0.0-beta.13" "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/generators": "npm:5.0.0-beta.12" + "@strapi/generators": "npm:5.0.0-beta.13" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" "@types/fs-extra": "npm:11.0.4" @@ -7911,9 +8096,9 @@ __metadata: languageName: unknown linkType: soft -"@strapi/core@npm:5.0.0-beta.12, @strapi/core@workspace:packages/core/core": - version: 0.0.0-use.local - resolution: "@strapi/core@workspace:packages/core/core" +"@strapi/core@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/core@npm:5.0.0-beta.12" dependencies: "@koa/cors": "npm:5.0.0" "@koa/router": "npm:12.0.1" @@ -7925,10 +8110,71 @@ __metadata: "@strapi/logger": "npm:5.0.0-beta.12" "@strapi/pack-up": "npm:5.0.0" "@strapi/permissions": "npm:5.0.0-beta.12" - "@strapi/ts-zen": "npm:^0.2.0" "@strapi/types": "npm:5.0.0-beta.12" "@strapi/typescript-utils": "npm:5.0.0-beta.12" "@strapi/utils": "npm:5.0.0-beta.12" + bcryptjs: "npm:2.4.3" + boxen: "npm:5.1.2" + chalk: "npm:4.1.2" + ci-info: "npm:4.0.0" + cli-table3: "npm:0.6.2" + commander: "npm:8.3.0" + configstore: "npm:5.0.1" + copyfiles: "npm:2.4.1" + debug: "npm:4.3.4" + delegates: "npm:1.0.0" + dotenv: "npm:16.4.5" + execa: "npm:5.1.1" + fs-extra: "npm:11.2.0" + glob: "npm:10.3.10" + global-agent: "npm:3.0.0" + http-errors: "npm:2.0.0" + inquirer: "npm:8.2.5" + is-docker: "npm:2.2.1" + koa: "npm:2.15.2" + koa-body: "npm:6.0.1" + koa-compose: "npm:4.1.0" + koa-compress: "npm:5.1.1" + koa-favicon: "npm:2.1.0" + koa-helmet: "npm:7.0.2" + koa-ip: "npm:^2.1.3" + koa-session: "npm:6.4.0" + koa-static: "npm:5.0.0" + lodash: "npm:4.17.21" + mime-types: "npm:2.1.35" + node-schedule: "npm:2.1.0" + open: "npm:8.4.0" + ora: "npm:5.4.1" + package-json: "npm:7.0.0" + pkg-up: "npm:3.1.0" + qs: "npm:6.11.1" + semver: "npm:7.5.4" + statuses: "npm:2.0.1" + typescript: "npm:5.2.2" + undici: "npm:6.18.2" + yup: "npm:0.32.9" + checksum: f7133fcce80fa006e81987f3d17287908a5bafbb1fe4546b3998a4a9715bb51560b215b50258b0fc4466579a96622f6eb8f8a7f5793bde297c8d60b97dd6791c + languageName: node + linkType: hard + +"@strapi/core@npm:5.0.0-beta.13, @strapi/core@workspace:packages/core/core": + version: 0.0.0-use.local + resolution: "@strapi/core@workspace:packages/core/core" + dependencies: + "@koa/cors": "npm:5.0.0" + "@koa/router": "npm:12.0.1" + "@paralleldrive/cuid2": "npm:2.2.2" + "@strapi/admin": "npm:5.0.0-beta.13" + "@strapi/database": "npm:5.0.0-beta.13" + "@strapi/generate-new": "npm:5.0.0-beta.13" + "@strapi/generators": "npm:5.0.0-beta.13" + "@strapi/logger": "npm:5.0.0-beta.13" + "@strapi/pack-up": "npm:5.0.0" + "@strapi/permissions": "npm:5.0.0-beta.13" + "@strapi/ts-zen": "npm:^0.2.0" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/typescript-utils": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@types/bcryptjs": "npm:2.4.3" "@types/configstore": "npm:5.0.1" "@types/delegates": "npm:1.0.0" @@ -7957,7 +8203,7 @@ __metadata: debug: "npm:4.3.4" delegates: "npm:1.0.0" dotenv: "npm:16.4.5" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" execa: "npm:5.1.1" fs-extra: "npm:11.2.0" glob: "npm:10.3.10" @@ -7985,22 +8231,47 @@ __metadata: semver: "npm:7.5.4" statuses: "npm:2.0.1" supertest: "npm:6.3.3" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" typescript: "npm:5.2.2" undici: "npm:6.18.2" yup: "npm:0.32.9" languageName: unknown linkType: soft -"@strapi/data-transfer@npm:5.0.0-beta.12, @strapi/data-transfer@workspace:packages/core/data-transfer": +"@strapi/data-transfer@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/data-transfer@npm:5.0.0-beta.12" + dependencies: + "@strapi/logger": "npm:5.0.0-beta.12" + "@strapi/types": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.12" + chalk: "npm:4.1.2" + cli-table3: "npm:0.6.2" + commander: "npm:8.3.0" + fs-extra: "npm:11.2.0" + inquirer: "npm:8.2.5" + lodash: "npm:4.17.21" + ora: "npm:5.4.1" + resolve-cwd: "npm:3.0.0" + semver: "npm:7.5.4" + stream-chain: "npm:2.2.5" + stream-json: "npm:1.8.0" + tar: "npm:6.1.13" + tar-stream: "npm:2.2.0" + ws: "npm:8.13.0" + checksum: 5e1b279dd2523fcac28e3a6a228efd519bb3cd0429346e7aabf85e7c0da13eaeae0d839cea292a86a543f6a5a9cde6a51d8b1c8eef71b12af52232870c48b270 + languageName: node + linkType: hard + +"@strapi/data-transfer@npm:5.0.0-beta.13, @strapi/data-transfer@workspace:packages/core/data-transfer": version: 0.0.0-use.local resolution: "@strapi/data-transfer@workspace:packages/core/data-transfer" dependencies: "@strapi/database": "workspace:*" - "@strapi/logger": "npm:5.0.0-beta.12" + "@strapi/logger": "npm:5.0.0-beta.13" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@types/fs-extra": "npm:11.0.4" "@types/jest": "npm:29.5.2" "@types/koa": "npm:2.13.4" @@ -8033,23 +8304,41 @@ __metadata: languageName: unknown linkType: soft -"@strapi/database@npm:5.0.0-beta.12, @strapi/database@workspace:*, @strapi/database@workspace:packages/core/database": +"@strapi/database@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/database@npm:5.0.0-beta.12" + dependencies: + "@paralleldrive/cuid2": "npm:2.2.2" + "@strapi/utils": "npm:5.0.0-beta.12" + ajv: "npm:8.16.0" + date-fns: "npm:2.30.0" + debug: "npm:4.3.4" + fs-extra: "npm:11.2.0" + knex: "npm:3.0.1" + lodash: "npm:4.17.21" + semver: "npm:7.5.4" + umzug: "npm:3.8.1" + checksum: 79c6149afdb928436a9aee0e51f828a106d3436dcfc5dc35b0626ae48914b42670109323f54f7aa6bbecfa5e8c04dbd2698e4609501603247c740bb5162cdc78 + languageName: node + linkType: hard + +"@strapi/database@npm:5.0.0-beta.13, @strapi/database@workspace:*, @strapi/database@workspace:packages/core/database": version: 0.0.0-use.local resolution: "@strapi/database@workspace:packages/core/database" dependencies: "@paralleldrive/cuid2": "npm:2.2.2" "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.13" "@types/fs-extra": "npm:11.0.4" ajv: "npm:8.16.0" date-fns: "npm:2.30.0" debug: "npm:4.3.4" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" fs-extra: "npm:11.2.0" knex: "npm:3.0.1" lodash: "npm:4.17.21" semver: "npm:7.5.4" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" umzug: "npm:3.8.1" languageName: unknown linkType: soft @@ -8089,17 +8378,40 @@ __metadata: languageName: node linkType: hard -"@strapi/email@npm:5.0.0-beta.12, @strapi/email@workspace:packages/core/email": +"@strapi/email@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/email@npm:5.0.0-beta.12" + dependencies: + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/provider-email-sendmail": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.12" + lodash: "npm:4.17.21" + react-intl: "npm:6.6.2" + react-query: "npm:3.39.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + koa: 2.13.4 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 152c56b0f82ece193dbd84489768969bb606c06eb0f1637be353906adb11aeff20bd8e333ce5cfceb0d7e770f13d9e0057e68e81a5ac537643c89acbcffbe258 + languageName: node + linkType: hard + +"@strapi/email@npm:5.0.0-beta.13, @strapi/email@workspace:packages/core/email": version: 0.0.0-use.local resolution: "@strapi/email@workspace:packages/core/email" dependencies: - "@strapi/admin": "npm:5.0.0-beta.12" + "@strapi/admin": "npm:5.0.0-beta.13" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/provider-email-sendmail": "npm:5.0.0-beta.12" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/provider-email-sendmail": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@testing-library/react": "npm:15.0.7" "@types/koa": "npm:2.13.4" "@types/lodash": "npm:^4.14.191" @@ -8155,7 +8467,24 @@ __metadata: languageName: node linkType: hard -"@strapi/generate-new@npm:5.0.0-beta.12, @strapi/generate-new@workspace:packages/generators/app": +"@strapi/generate-new@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/generate-new@npm:5.0.0-beta.12" + dependencies: + chalk: "npm:^4.1.2" + execa: "npm:5.1.1" + fs-extra: "npm:11.2.0" + inquirer: "npm:8.2.5" + lodash: "npm:4.17.21" + node-machine-id: "npm:^1.1.10" + ora: "npm:^5.4.1" + semver: "npm:7.5.4" + tar: "npm:6.1.13" + checksum: e5ad599e294251547bb36d0b6e4df7490b6968f4fd66a9991522ca53132fb6a6fd736d144a20569ed29637e076589ac40eb3dc7d1b73d4947961fe487b7008d0 + languageName: node + linkType: hard + +"@strapi/generate-new@npm:5.0.0-beta.13, @strapi/generate-new@workspace:packages/generators/app": version: 0.0.0-use.local resolution: "@strapi/generate-new@workspace:packages/generators/app" dependencies: @@ -8175,39 +8504,80 @@ __metadata: languageName: unknown linkType: soft -"@strapi/generators@npm:5.0.0-beta.12, @strapi/generators@workspace:packages/generators/generators": +"@strapi/generators@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/generators@npm:5.0.0-beta.12" + dependencies: + "@sindresorhus/slugify": "npm:1.1.0" + "@strapi/typescript-utils": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.12" + chalk: "npm:4.1.2" + copyfiles: "npm:2.4.1" + fs-extra: "npm:11.2.0" + node-plop: "npm:0.26.3" + plop: "npm:2.7.6" + pluralize: "npm:8.0.0" + checksum: 7b475ca91b6502b0bff00c4053b93e815e91b9b34b1ba7640809fab8aec121dcca8b93d5ef7d0c823d9506eff7d37a602b246ff2122e38535587ab3b5e918b2c + languageName: node + linkType: hard + +"@strapi/generators@npm:5.0.0-beta.13, @strapi/generators@workspace:packages/generators/generators": version: 0.0.0-use.local resolution: "@strapi/generators@workspace:packages/generators/generators" dependencies: "@sindresorhus/slugify": "npm:1.1.0" "@strapi/pack-up": "npm:5.0.0" - "@strapi/typescript-utils": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/typescript-utils": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@types/fs-extra": "npm:11.0.4" chalk: "npm:4.1.2" copyfiles: "npm:2.4.1" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" fs-extra: "npm:11.2.0" node-plop: "npm:0.26.3" plop: "npm:2.7.6" pluralize: "npm:8.0.0" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" languageName: unknown linkType: soft -"@strapi/i18n@npm:5.0.0-beta.12, @strapi/i18n@workspace:packages/plugins/i18n": +"@strapi/i18n@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/i18n@npm:5.0.0-beta.12" + dependencies: + "@reduxjs/toolkit": "npm:1.9.7" + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/utils": "npm:5.0.0-beta.12" + lodash: "npm:4.17.21" + qs: "npm:6.11.1" + react-intl: "npm:6.6.2" + react-redux: "npm:8.1.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + "@strapi/content-manager": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: b3e3878a8715979bcc47959790fef364c69353b3bb82cbefac40c9791956560169161377b3c41ca7ebbf2fd22058a7e3fee74f2eb326dc3d62cc8e0bf4f15eb9 + languageName: node + linkType: hard + +"@strapi/i18n@npm:5.0.0-beta.13, @strapi/i18n@workspace:packages/plugins/i18n": version: 0.0.0-use.local resolution: "@strapi/i18n@workspace:packages/plugins/i18n" dependencies: "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.12" - "@strapi/admin-test-utils": "npm:5.0.0-beta.12" - "@strapi/content-manager": "npm:5.0.0-beta.12" + "@strapi/admin": "npm:5.0.0-beta.13" + "@strapi/admin-test-utils": "npm:5.0.0-beta.13" + "@strapi/content-manager": "npm:5.0.0-beta.13" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" lodash: "npm:4.17.21" @@ -8242,14 +8612,24 @@ __metadata: languageName: node linkType: hard -"@strapi/logger@npm:5.0.0-beta.12, @strapi/logger@workspace:packages/utils/logger": +"@strapi/logger@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/logger@npm:5.0.0-beta.12" + dependencies: + lodash: "npm:4.17.21" + winston: "npm:3.10.0" + checksum: 8b59d82af267f6cee6b7e239f14da4b8a97c26acd8f33883a948cb18af220b63a9e71feb7dffc5310cca48c8258431a991706c340d495a06eb23408941a6cbc8 + languageName: node + linkType: hard + +"@strapi/logger@npm:5.0.0-beta.13, @strapi/logger@workspace:packages/utils/logger": version: 0.0.0-use.local resolution: "@strapi/logger@workspace:packages/utils/logger" dependencies: "@strapi/pack-up": "npm:5.0.0" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" lodash: "npm:4.17.21" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" winston: "npm:3.10.0" languageName: unknown linkType: soft @@ -8316,18 +8696,31 @@ __metadata: languageName: node linkType: hard -"@strapi/permissions@npm:5.0.0-beta.12, @strapi/permissions@workspace:packages/core/permissions": +"@strapi/permissions@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/permissions@npm:5.0.0-beta.12" + dependencies: + "@casl/ability": "npm:6.5.0" + "@strapi/utils": "npm:5.0.0-beta.12" + lodash: "npm:4.17.21" + qs: "npm:6.11.1" + sift: "npm:16.0.1" + checksum: e17e68406d8082eed1c97c81707efbc908f9472c772b30acd9999dfbf507dbce3b409df26328ef8cff58e8515b3da8616636607dea58ac0c1203d16cc402c6b2 + languageName: node + linkType: hard + +"@strapi/permissions@npm:5.0.0-beta.13, @strapi/permissions@workspace:packages/core/permissions": version: 0.0.0-use.local resolution: "@strapi/permissions@workspace:packages/core/permissions" dependencies: "@casl/ability": "npm:6.5.0" "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.12" - eslint-config-custom: "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.13" lodash: "npm:4.17.21" qs: "npm:6.11.1" sift: "npm:16.0.1" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" languageName: unknown linkType: soft @@ -8338,14 +8731,14 @@ __metadata: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.12" - eslint-config-custom: "npm:5.0.0-beta.12" + "@strapi/strapi": "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.13" react: "npm:18.3.1" react-dom: "npm:18.3.1" react-intl: "npm:6.6.2" react-router-dom: "npm:6.22.3" styled-components: "npm:6.1.8" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" typescript: "npm:5.2.2" peerDependencies: "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc @@ -8356,14 +8749,32 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-color-picker@npm:5.0.0-beta.12, @strapi/plugin-color-picker@workspace:packages/plugins/color-picker": +"@strapi/plugin-color-picker@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/plugin-color-picker@npm:5.0.0-beta.12" + dependencies: + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + react-colorful: "npm:5.6.1" + react-intl: "npm:6.6.2" + peerDependencies: + "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 20a652cd0f5f1489336ca6294820f2a2a02f26cbb01a20aca03eb6401c8fa31ad2e43de9d696a6b77658b4b7b80c3fce1a750ca9242828fa7851fdacb97b8ec2 + languageName: node + linkType: hard + +"@strapi/plugin-color-picker@workspace:packages/plugins/color-picker": version: 0.0.0-use.local resolution: "@strapi/plugin-color-picker@workspace:packages/plugins/color-picker" dependencies: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.12" + "@strapi/strapi": "npm:5.0.0-beta.13" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" react: "npm:18.3.1" @@ -8382,21 +8793,52 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-documentation@npm:5.0.0-beta.12, @strapi/plugin-documentation@workspace:packages/plugins/documentation": +"@strapi/plugin-documentation@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/plugin-documentation@npm:5.0.0-beta.12" + dependencies: + "@reduxjs/toolkit": "npm:1.9.7" + "@strapi/admin": "npm:5.0.0-beta.12" + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/utils": "npm:5.0.0-beta.12" + bcryptjs: "npm:2.4.3" + cheerio: "npm:^1.0.0-rc.12" + formik: "npm:2.4.5" + fs-extra: "npm:11.2.0" + immer: "npm:9.0.21" + koa-static: "npm:^5.0.0" + lodash: "npm:4.17.21" + path-to-regexp: "npm:6.2.1" + react-intl: "npm:6.6.2" + swagger-ui-dist: "npm:4.19.0" + yaml: "npm:1.10.2" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: afe380a5a7101cd1831ce859fe1463a87d9445e7f05284f22ec13a59128555fcdaeaa2b5af87dfd375fd63360faef6ed0d95f3b30bec76d44bb92f8e0bc03a7a + languageName: node + linkType: hard + +"@strapi/plugin-documentation@workspace:packages/plugins/documentation": version: 0.0.0-use.local resolution: "@strapi/plugin-documentation@workspace:packages/plugins/documentation" dependencies: "@apidevtools/swagger-parser": "npm:^10.1.0" "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.12" - "@strapi/admin-test-utils": "npm:5.0.0-beta.12" + "@strapi/admin": "npm:5.0.0-beta.13" + "@strapi/admin-test-utils": "npm:5.0.0-beta.13" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.12" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/strapi": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" "@types/fs-extra": "npm:11.0.4" @@ -8433,7 +8875,38 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-graphql@npm:5.0.0-beta.12, @strapi/plugin-graphql@workspace:packages/plugins/graphql": +"@strapi/plugin-graphql@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/plugin-graphql@npm:5.0.0-beta.12" + dependencies: + "@apollo/server": "npm:4.10.0" + "@as-integrations/koa": "npm:1.1.1" + "@graphql-tools/schema": "npm:10.0.3" + "@graphql-tools/utils": "npm:^10.1.3" + "@koa/cors": "npm:5.0.0" + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/utils": "npm:5.0.0-beta.12" + graphql: "npm:^16.8.1" + graphql-depth-limit: "npm:^1.1.0" + graphql-playground-middleware-koa: "npm:^1.6.21" + graphql-scalars: "npm:1.22.2" + koa-bodyparser: "npm:4.4.1" + koa-compose: "npm:^4.1.0" + lodash: "npm:4.17.21" + nexus: "npm:1.3.0" + pluralize: "npm:8.0.0" + peerDependencies: + "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 83016010ceb486532fc1dbd28035157baaa9cb35c97ac136175add06d073db10f65f2882cb664c313cad39e5fe9fe312a01f8595af9e8a6a9686a8ae0fe99469 + languageName: node + linkType: hard + +"@strapi/plugin-graphql@workspace:packages/plugins/graphql": version: 0.0.0-use.local resolution: "@strapi/plugin-graphql@workspace:packages/plugins/graphql" dependencies: @@ -8445,14 +8918,14 @@ __metadata: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.12" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/strapi": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@types/graphql-depth-limit": "npm:1.1.5" "@types/koa-bodyparser": "npm:4.3.12" "@types/koa__cors": "npm:5.0.0" cross-env: "npm:^7.0.3" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" graphql: "npm:^16.8.1" graphql-depth-limit: "npm:^1.1.0" graphql-playground-middleware-koa: "npm:^1.6.21" @@ -8467,7 +8940,7 @@ __metadata: react-dom: "npm:18.3.1" react-router-dom: "npm:6.22.3" styled-components: "npm:6.1.8" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" typescript: "npm:5.3.2" peerDependencies: "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc @@ -8478,7 +8951,24 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-sentry@npm:5.0.0-beta.12, @strapi/plugin-sentry@workspace:packages/plugins/sentry": +"@strapi/plugin-sentry@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/plugin-sentry@npm:5.0.0-beta.12" + dependencies: + "@sentry/node": "npm:7.112.2" + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + peerDependencies: + "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: df213385cd177e35c4e8d955b256e93bd5b22a2ee1d6c0e97cc322b2c968aeea3b58278a459318b39b2c7489875e40cad40c2a44beedaa585eb3dd9876362275 + languageName: node + linkType: hard + +"@strapi/plugin-sentry@workspace:packages/plugins/sentry": version: 0.0.0-use.local resolution: "@strapi/plugin-sentry@workspace:packages/plugins/sentry" dependencies: @@ -8487,7 +8977,7 @@ __metadata: "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.12" + "@strapi/strapi": "npm:5.0.0-beta.13" react: "npm:18.3.1" react-dom: "npm:18.3.1" react-router-dom: "npm:6.22.3" @@ -8501,15 +8991,48 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-users-permissions@npm:5.0.0-beta.12, @strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions": +"@strapi/plugin-users-permissions@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/plugin-users-permissions@npm:5.0.0-beta.12" + dependencies: + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/utils": "npm:5.0.0-beta.12" + bcryptjs: "npm:2.4.3" + formik: "npm:2.4.5" + grant-koa: "npm:5.4.8" + immer: "npm:9.0.21" + jsonwebtoken: "npm:9.0.0" + jwk-to-pem: "npm:2.0.5" + koa: "npm:2.15.2" + koa2-ratelimit: "npm:^1.1.3" + lodash: "npm:4.17.21" + prop-types: "npm:^15.8.1" + purest: "npm:4.0.2" + react-intl: "npm:6.6.2" + react-query: "npm:3.39.3" + react-redux: "npm:8.1.3" + url-join: "npm:4.0.1" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: bf64462a17c18b0a2f14346d495ee8539e8ae96e8afff7ea816e9a27741cf5fd8628552b92fd059b335b98760aa21a0c190e7063ddceaa9d039ee6403ddc9952 + languageName: node + linkType: hard + +"@strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions": version: 0.0.0-use.local resolution: "@strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions" dependencies: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/strapi": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@testing-library/dom": "npm:10.1.0" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" @@ -8548,23 +9071,34 @@ __metadata: resolution: "@strapi/provider-email-amazon-ses@workspace:packages/providers/email-amazon-ses" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.12" - eslint-config-custom: "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.13" node-ses: "npm:^3.0.3" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" languageName: unknown linkType: soft -"@strapi/provider-email-mailgun@npm:5.0.0-beta.12, @strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun": +"@strapi/provider-email-mailgun@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/provider-email-mailgun@npm:5.0.0-beta.12" + dependencies: + "@strapi/utils": "npm:5.0.0-beta.12" + form-data: "npm:^4.0.0" + mailgun.js: "npm:10.2.1" + checksum: dc7b36a2676e2655dc2af55c476b0463dc32bc6a1b63dd6454c8fc5b4dacf7b2606f0100c2695ec1e86be9fc67c10becfeb279e65a5d974cbd5578d07d72a55f + languageName: node + linkType: hard + +"@strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun": version: 0.0.0-use.local resolution: "@strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.12" - eslint-config-custom: "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.13" form-data: "npm:^4.0.0" mailgun.js: "npm:10.2.1" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" languageName: unknown linkType: soft @@ -8574,10 +9108,10 @@ __metadata: dependencies: "@strapi/pack-up": "npm:5.0.0" "@types/nodemailer": "npm:6.4.7" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" lodash: "npm:4.17.21" nodemailer: "npm:6.9.1" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" languageName: unknown linkType: soft @@ -8587,26 +9121,49 @@ __metadata: dependencies: "@sendgrid/mail": "npm:7.7.0" "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.12" - eslint-config-custom: "npm:5.0.0-beta.12" - tsconfig: "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.13" languageName: unknown linkType: soft -"@strapi/provider-email-sendmail@npm:5.0.0-beta.12, @strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail": +"@strapi/provider-email-sendmail@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/provider-email-sendmail@npm:5.0.0-beta.12" + dependencies: + "@strapi/utils": "npm:5.0.0-beta.12" + sendmail: "npm:^1.6.1" + checksum: 3ff5498c7c013bf5eb0620eb3ed295532eff29e1c6ee85b3cbbf6d7bbdee9f3d0fa3a9d459a9ce327800b35c6fbdcb6c417dfef7017c7b2e5078b42d60ef163f + languageName: node + linkType: hard + +"@strapi/provider-email-sendmail@npm:5.0.0-beta.13, @strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail": version: 0.0.0-use.local resolution: "@strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.13" "@types/sendmail": "npm:1.4.4" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" sendmail: "npm:^1.6.1" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" languageName: unknown linkType: soft -"@strapi/provider-upload-aws-s3@npm:5.0.0-beta.12, @strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3": +"@strapi/provider-upload-aws-s3@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/provider-upload-aws-s3@npm:5.0.0-beta.12" + dependencies: + "@aws-sdk/client-s3": "npm:3.433.0" + "@aws-sdk/lib-storage": "npm:3.433.0" + "@aws-sdk/s3-request-presigner": "npm:3.433.0" + "@aws-sdk/types": "npm:3.433.0" + lodash: "npm:4.17.21" + checksum: 4ee42bf6e0861830f2ea5ee9262c5a078da1d272ffe56d310e1cd443ea775619530b9462fb809b64ba12c848e52aec44ea3ca0aa785f88ce754d0a87ed5b91b3 + languageName: node + linkType: hard + +"@strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3": version: 0.0.0-use.local resolution: "@strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3" dependencies: @@ -8616,52 +9173,99 @@ __metadata: "@aws-sdk/types": "npm:3.433.0" "@strapi/pack-up": "npm:5.0.0" "@types/jest": "npm:29.5.2" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" lodash: "npm:4.17.21" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" languageName: unknown linkType: soft -"@strapi/provider-upload-cloudinary@npm:5.0.0-beta.12, @strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary": +"@strapi/provider-upload-cloudinary@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/provider-upload-cloudinary@npm:5.0.0-beta.12" + dependencies: + "@strapi/utils": "npm:5.0.0-beta.12" + cloudinary: "npm:^1.41.0" + into-stream: "npm:^5.1.0" + checksum: e4f2c2f66ba17600a84fefb440b40815d61232c9c5b796aeb5abc351aa5d23cdc38a0c42d6c4563198f4fdba96fc946bad26146f437f37de990a6b817a27f901 + languageName: node + linkType: hard + +"@strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary": version: 0.0.0-use.local resolution: "@strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.13" cloudinary: "npm:^1.41.0" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" into-stream: "npm:^5.1.0" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" languageName: unknown linkType: soft -"@strapi/provider-upload-local@npm:5.0.0-beta.12, @strapi/provider-upload-local@workspace:packages/providers/upload-local": +"@strapi/provider-upload-local@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/provider-upload-local@npm:5.0.0-beta.12" + dependencies: + "@strapi/utils": "npm:5.0.0-beta.12" + fs-extra: "npm:11.2.0" + checksum: 1dd45df244de00e015afe8499b2b96668506119148ed36260701adf53e134da2a904ddc349284db085dd6c19525aad83a2b7f05925e74c7fb607addb5857fe89 + languageName: node + linkType: hard + +"@strapi/provider-upload-local@npm:5.0.0-beta.13, @strapi/provider-upload-local@workspace:packages/providers/upload-local": version: 0.0.0-use.local resolution: "@strapi/provider-upload-local@workspace:packages/providers/upload-local" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@types/fs-extra": "npm:11.0.4" "@types/jest": "npm:29.5.2" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" fs-extra: "npm:11.2.0" memfs: "npm:4.6.0" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" languageName: unknown linkType: soft -"@strapi/review-workflows@npm:5.0.0-beta.12, @strapi/review-workflows@workspace:packages/core/review-workflows": +"@strapi/review-workflows@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/review-workflows@npm:5.0.0-beta.12" + dependencies: + "@reduxjs/toolkit": "npm:1.9.7" + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/utils": "npm:5.0.0-beta.1" + fractional-indexing: "npm:3.2.0" + react-dnd: "npm:16.0.1" + react-dnd-html5-backend: "npm:16.0.1" + react-helmet: "npm:^6.1.0" + react-intl: "npm:6.6.2" + react-redux: "npm:8.1.3" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + "@strapi/content-manager": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: 94ee895f9d8934a38fc887289aa86733acfa2deddead3248d4d14e7b846c7511014800dbbdd68238ee90ae49a7ba4e2d547b328ebef0d25a75d2c24254626c0a + languageName: node + linkType: hard + +"@strapi/review-workflows@npm:5.0.0-beta.13, @strapi/review-workflows@workspace:packages/core/review-workflows": version: 0.0.0-use.local resolution: "@strapi/review-workflows@workspace:packages/core/review-workflows" dependencies: "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.12" - "@strapi/content-manager": "npm:5.0.0-beta.12" + "@strapi/admin": "npm:5.0.0-beta.13" + "@strapi/content-manager": "npm:5.0.0-beta.13" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.12" + "@strapi/types": "npm:5.0.0-beta.13" "@strapi/utils": "npm:5.0.0-beta.12" "@testing-library/react": "npm:15.0.7" fractional-indexing: "npm:3.2.0" @@ -8711,9 +9315,9 @@ __metadata: languageName: node linkType: hard -"@strapi/strapi@npm:5.0.0-beta.12, @strapi/strapi@workspace:packages/core/strapi": - version: 0.0.0-use.local - resolution: "@strapi/strapi@workspace:packages/core/strapi" +"@strapi/strapi@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/strapi@npm:5.0.0-beta.12" dependencies: "@pmmmwh/react-refresh-webpack-plugin": "npm:0.5.11" "@strapi/admin": "npm:5.0.0-beta.12" @@ -8731,11 +9335,89 @@ __metadata: "@strapi/pack-up": "npm:5.0.0" "@strapi/permissions": "npm:5.0.0-beta.12" "@strapi/review-workflows": "npm:5.0.0-beta.12" - "@strapi/ts-zen": "npm:^0.2.0" "@strapi/types": "npm:5.0.0-beta.12" "@strapi/typescript-utils": "npm:5.0.0-beta.12" "@strapi/upload": "npm:5.0.0-beta.12" "@strapi/utils": "npm:5.0.0-beta.12" + "@types/nodemon": "npm:1.19.6" + "@vitejs/plugin-react-swc": "npm:3.6.0" + boxen: "npm:5.1.2" + browserslist: "npm:^4.23.0" + browserslist-to-esbuild: "npm:1.2.0" + chalk: "npm:4.1.2" + chokidar: "npm:3.5.3" + cli-table3: "npm:0.6.2" + commander: "npm:8.3.0" + concurrently: "npm:8.2.2" + copyfiles: "npm:2.4.1" + css-loader: "npm:^6.10.0" + dotenv: "npm:16.4.5" + esbuild: "npm:0.21.3" + esbuild-loader: "npm:^2.21.0" + esbuild-register: "npm:3.5.0" + execa: "npm:5.1.1" + fork-ts-checker-webpack-plugin: "npm:8.0.0" + fs-extra: "npm:11.2.0" + get-latest-version: "npm:5.1.0" + git-url-parse: "npm:14.0.0" + html-webpack-plugin: "npm:5.6.0" + inquirer: "npm:8.2.5" + lodash: "npm:4.17.21" + mini-css-extract-plugin: "npm:2.7.7" + nodemon: "npm:3.0.2" + ora: "npm:5.4.1" + outdent: "npm:0.8.0" + pkg-up: "npm:3.1.0" + prettier: "npm:3.2.5" + react-refresh: "npm:0.14.0" + read-pkg-up: "npm:7.0.1" + resolve-from: "npm:5.0.0" + semver: "npm:7.5.4" + style-loader: "npm:3.3.4" + typescript: "npm:5.3.2" + vite: "npm:5.1.6" + webpack: "npm:^5.90.3" + webpack-bundle-analyzer: "npm:^4.10.1" + webpack-dev-middleware: "npm:6.1.1" + webpack-hot-middleware: "npm:2.26.1" + yalc: "npm:1.0.0-pre.53" + yup: "npm:0.32.9" + peerDependencies: + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + bin: + strapi: bin/strapi.js + checksum: bbcd79c31e0c3c69490f63fac89cc8b4b40287b07169c3383cd0ad079ac1de1d0c87af696c04a6afb9de203055e89286a3ac575165bfab361229e73234a0b004 + languageName: node + linkType: hard + +"@strapi/strapi@npm:5.0.0-beta.13, @strapi/strapi@workspace:packages/core/strapi": + version: 0.0.0-use.local + resolution: "@strapi/strapi@workspace:packages/core/strapi" + dependencies: + "@pmmmwh/react-refresh-webpack-plugin": "npm:0.5.11" + "@strapi/admin": "npm:5.0.0-beta.13" + "@strapi/content-manager": "npm:5.0.0-beta.13" + "@strapi/content-releases": "npm:5.0.0-beta.13" + "@strapi/content-type-builder": "npm:5.0.0-beta.13" + "@strapi/core": "npm:5.0.0-beta.13" + "@strapi/data-transfer": "npm:5.0.0-beta.13" + "@strapi/database": "npm:5.0.0-beta.13" + "@strapi/email": "npm:5.0.0-beta.13" + "@strapi/generate-new": "npm:5.0.0-beta.13" + "@strapi/generators": "npm:5.0.0-beta.13" + "@strapi/i18n": "npm:5.0.0-beta.13" + "@strapi/logger": "npm:5.0.0-beta.13" + "@strapi/pack-up": "npm:5.0.0" + "@strapi/permissions": "npm:5.0.0-beta.13" + "@strapi/review-workflows": "npm:5.0.0-beta.13" + "@strapi/ts-zen": "npm:^0.2.0" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/typescript-utils": "npm:5.0.0-beta.13" + "@strapi/upload": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@types/fs-extra": "npm:11.0.4" "@types/jest": "npm:29.5.2" "@types/lodash": "npm:^4.14.191" @@ -8758,7 +9440,7 @@ __metadata: esbuild: "npm:0.21.3" esbuild-loader: "npm:^2.21.0" esbuild-register: "npm:3.5.0" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" execa: "npm:5.1.1" fork-ts-checker-webpack-plugin: "npm:8.0.0" fs-extra: "npm:11.2.0" @@ -8780,7 +9462,7 @@ __metadata: resolve-from: "npm:5.0.0" semver: "npm:7.5.4" style-loader: "npm:3.3.4" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" typescript: "npm:5.3.2" vite: "npm:5.1.6" webpack: "npm:^5.90.3" @@ -8809,29 +9491,50 @@ __metadata: languageName: node linkType: hard -"@strapi/types@npm:5.0.0-beta.12, @strapi/types@workspace:*, @strapi/types@workspace:packages/core/types": - version: 0.0.0-use.local - resolution: "@strapi/types@workspace:packages/core/types" +"@strapi/types@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/types@npm:5.0.0-beta.12" dependencies: "@casl/ability": "npm:6.5.0" "@koa/cors": "npm:5.0.0" "@koa/router": "npm:12.0.1" "@strapi/database": "npm:5.0.0-beta.12" "@strapi/logger": "npm:5.0.0-beta.12" - "@strapi/pack-up": "npm:5.0.0" "@strapi/permissions": "npm:5.0.0-beta.12" - "@strapi/ts-zen": "npm:^0.2.0" "@strapi/utils": "npm:5.0.0-beta.12" + commander: "npm:8.3.0" + koa: "npm:2.15.2" + node-schedule: "npm:2.1.0" + typedoc: "npm:0.25.10" + typedoc-github-wiki-theme: "npm:1.1.0" + typedoc-plugin-markdown: "npm:3.17.1" + checksum: 7c897e190bf6265b18f47006bc76377ede81c80f664636036993579cd6590aaedaac8231d0dc24e92efee334b90be59e46239cae3283cd320f8dcf14b3e06454 + languageName: node + linkType: hard + +"@strapi/types@npm:5.0.0-beta.13, @strapi/types@workspace:*, @strapi/types@workspace:packages/core/types": + version: 0.0.0-use.local + resolution: "@strapi/types@workspace:packages/core/types" + dependencies: + "@casl/ability": "npm:6.5.0" + "@koa/cors": "npm:5.0.0" + "@koa/router": "npm:12.0.1" + "@strapi/database": "npm:5.0.0-beta.13" + "@strapi/logger": "npm:5.0.0-beta.13" + "@strapi/pack-up": "npm:5.0.0" + "@strapi/permissions": "npm:5.0.0-beta.13" + "@strapi/ts-zen": "npm:^0.2.0" + "@strapi/utils": "npm:5.0.0-beta.13" "@types/jest": "npm:29.5.2" "@types/koa": "npm:2.13.4" "@types/koa__router": "npm:12.0.0" "@types/node-schedule": "npm:2.1.0" commander: "npm:8.3.0" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" koa: "npm:2.15.2" lodash: "npm:4.17.21" node-schedule: "npm:2.1.0" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" typedoc: "npm:0.25.10" typedoc-github-wiki-theme: "npm:1.1.0" typedoc-plugin-markdown: "npm:3.17.1" @@ -8840,7 +9543,21 @@ __metadata: languageName: unknown linkType: soft -"@strapi/typescript-utils@npm:5.0.0-beta.12, @strapi/typescript-utils@workspace:packages/utils/typescript": +"@strapi/typescript-utils@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/typescript-utils@npm:5.0.0-beta.12" + dependencies: + chalk: "npm:4.1.2" + cli-table3: "npm:0.6.2" + fs-extra: "npm:11.2.0" + lodash: "npm:4.17.21" + prettier: "npm:3.2.5" + typescript: "npm:5.3.2" + checksum: b4e01a90330184d10716595e5e46f6894ca8b83f5828626f56273fb8f077830b966c2f8ba465a70f5054292de77d4e5372d6fa79615dc539104d9a6cdcb60c22 + languageName: node + linkType: hard + +"@strapi/typescript-utils@npm:5.0.0-beta.13, @strapi/typescript-utils@workspace:packages/utils/typescript": version: 0.0.0-use.local resolution: "@strapi/typescript-utils@workspace:packages/utils/typescript" dependencies: @@ -8891,8 +9608,8 @@ __metadata: resolution: "@strapi/upgrade@workspace:packages/utils/upgrade" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@types/fs-extra": "npm:11.0.4" "@types/jscodeshift": "npm:0.11.10" chalk: "npm:4.1.2" @@ -8915,17 +9632,54 @@ __metadata: languageName: unknown linkType: soft -"@strapi/upload@npm:5.0.0-beta.12, @strapi/upload@workspace:packages/core/upload": +"@strapi/upload@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/upload@npm:5.0.0-beta.12" + dependencies: + "@strapi/design-system": "npm:2.0.0-beta.6" + "@strapi/icons": "npm:2.0.0-beta.6" + "@strapi/provider-upload-local": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.12" + byte-size: "npm:8.1.1" + cropperjs: "npm:1.6.1" + date-fns: "npm:2.30.0" + formik: "npm:2.4.5" + fs-extra: "npm:11.2.0" + immer: "npm:9.0.21" + koa-range: "npm:0.3.0" + koa-static: "npm:5.0.0" + lodash: "npm:4.17.21" + mime-types: "npm:2.1.35" + prop-types: "npm:^15.8.1" + qs: "npm:6.11.1" + react-dnd: "npm:16.0.1" + react-intl: "npm:6.6.2" + react-query: "npm:3.39.3" + react-redux: "npm:8.1.3" + react-select: "npm:5.8.0" + sharp: "npm:0.32.6" + yup: "npm:0.32.9" + peerDependencies: + "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + react-router-dom: ^6.0.0 + styled-components: ^6.0.0 + checksum: e711016c7ba3514ce522b8719d14bae535ea83db665663172ff8f36151ef4d7a9eb205a62aad68f72a673d5b02f1a8c2e4e292e8b866d697b33ccc49bdbc84b3 + languageName: node + linkType: hard + +"@strapi/upload@npm:5.0.0-beta.13, @strapi/upload@workspace:packages/core/upload": version: 0.0.0-use.local resolution: "@strapi/upload@workspace:packages/core/upload" dependencies: - "@strapi/admin": "npm:5.0.0-beta.12" + "@strapi/admin": "npm:5.0.0-beta.13" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/provider-upload-local": "npm:5.0.0-beta.12" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/provider-upload-local": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.13" "@testing-library/dom": "npm:10.1.0" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" @@ -8969,7 +9723,42 @@ __metadata: languageName: unknown linkType: soft -"@strapi/utils@npm:5.0.0-beta.12, @strapi/utils@workspace:packages/core/utils": +"@strapi/utils@npm:5.0.0-beta.1": + version: 5.0.0-beta.1 + resolution: "@strapi/utils@npm:5.0.0-beta.1" + dependencies: + "@sindresorhus/slugify": "npm:1.1.0" + date-fns: "npm:2.30.0" + execa: "npm:5.1.1" + http-errors: "npm:1.8.1" + lodash: "npm:4.17.21" + node-machine-id: "npm:1.1.12" + p-map: "npm:4.0.0" + preferred-pm: "npm:3.1.2" + yup: "npm:0.32.9" + checksum: 906877a7557e4e88b68cee0cb449457707ac892044864e7b1fb7c75a7b2e1c6c97a6f7840334ac5ecd3fed3388398da0b423329505c1365f09e8593342713f23 + languageName: node + linkType: hard + +"@strapi/utils@npm:5.0.0-beta.12": + version: 5.0.0-beta.12 + resolution: "@strapi/utils@npm:5.0.0-beta.12" + dependencies: + "@sindresorhus/slugify": "npm:1.1.0" + date-fns: "npm:2.30.0" + execa: "npm:5.1.1" + http-errors: "npm:2.0.0" + lodash: "npm:4.17.21" + node-machine-id: "npm:1.1.12" + p-map: "npm:4.0.0" + preferred-pm: "npm:3.1.2" + yup: "npm:0.32.9" + zod: "npm:^3.22.4" + checksum: 76fb1a2a8d34eafc655e355ed62171cac513b1272ba9ec025a1e6d89dc93036c6a23feec3fd65e60caa20a012a3cae014f6de4fbbefb9d013bb2b06497ea7d38 + languageName: node + linkType: hard + +"@strapi/utils@npm:5.0.0-beta.13, @strapi/utils@workspace:packages/core/utils": version: 0.0.0-use.local resolution: "@strapi/utils@workspace:packages/core/utils" dependencies: @@ -8979,7 +9768,7 @@ __metadata: "@types/koa": "npm:2.13.4" "@types/node": "npm:18.19.24" date-fns: "npm:2.30.0" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" execa: "npm:5.1.1" http-errors: "npm:2.0.0" koa: "npm:2.15.2" @@ -8988,7 +9777,7 @@ __metadata: node-machine-id: "npm:1.1.12" p-map: "npm:4.0.0" preferred-pm: "npm:3.1.2" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" yup: "npm:0.32.9" zod: "npm:^3.22.4" languageName: unknown @@ -14135,17 +14924,17 @@ __metadata: languageName: node linkType: hard -"create-strapi-app@npm:5.0.0-beta.12, create-strapi-app@workspace:packages/cli/create-strapi-app": +"create-strapi-app@npm:5.0.0-beta.13, create-strapi-app@workspace:packages/cli/create-strapi-app": version: 0.0.0-use.local resolution: "create-strapi-app@workspace:packages/cli/create-strapi-app" dependencies: - "@strapi/generate-new": "npm:5.0.0-beta.12" + "@strapi/generate-new": "npm:5.0.0-beta.13" "@strapi/pack-up": "npm:5.0.0" "@types/inquirer": "npm:8.2.5" commander: "npm:8.3.0" - eslint-config-custom: "npm:5.0.0-beta.12" + eslint-config-custom: "npm:5.0.0-beta.13" inquirer: "npm:8.2.5" - tsconfig: "npm:5.0.0-beta.12" + tsconfig: "npm:5.0.0-beta.13" bin: create-strapi-app: ./bin/index.js languageName: unknown @@ -14155,7 +14944,7 @@ __metadata: version: 0.0.0-use.local resolution: "create-strapi@workspace:packages/cli/create-strapi" dependencies: - create-strapi-app: "npm:5.0.0-beta.12" + create-strapi-app: "npm:5.0.0-beta.13" bin: create-strapi: ./bin/index.js languageName: unknown @@ -16030,7 +16819,7 @@ __metadata: languageName: node linkType: hard -"eslint-config-custom@npm:5.0.0-beta.12, eslint-config-custom@workspace:*, eslint-config-custom@workspace:packages/utils/eslint-config-custom": +"eslint-config-custom@npm:5.0.0-beta.13, eslint-config-custom@workspace:*, eslint-config-custom@workspace:packages/utils/eslint-config-custom": version: 0.0.0-use.local resolution: "eslint-config-custom@workspace:packages/utils/eslint-config-custom" languageName: unknown @@ -18772,6 +19561,19 @@ __metadata: languageName: node linkType: hard +"http-errors@npm:1.8.1, http-errors@npm:^1.6.3, http-errors@npm:^1.7.3, http-errors@npm:^1.8.1, http-errors@npm:~1.8.0": + version: 1.8.1 + resolution: "http-errors@npm:1.8.1" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:>= 1.5.0 < 2" + toidentifier: "npm:1.0.1" + checksum: 76fc491bd8df2251e21978e080d5dae20d9736cfb29bb72b5b76ec1bcebb1c14f0f58a3a128dd89288934379d2173cfb0421c571d54103e93dd65ef6243d64d8 + languageName: node + linkType: hard + "http-errors@npm:2.0.0, http-errors@npm:^2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" @@ -18785,19 +19587,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:^1.6.3, http-errors@npm:^1.7.3, http-errors@npm:^1.8.1, http-errors@npm:~1.8.0": - version: 1.8.1 - resolution: "http-errors@npm:1.8.1" - dependencies: - depd: "npm:~1.1.2" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:>= 1.5.0 < 2" - toidentifier: "npm:1.0.1" - checksum: 76fc491bd8df2251e21978e080d5dae20d9736cfb29bb72b5b76ec1bcebb1c14f0f58a3a128dd89288934379d2173cfb0421c571d54103e93dd65ef6243d64d8 - languageName: node - linkType: hard - "http-errors@npm:~1.6.2": version: 1.6.3 resolution: "http-errors@npm:1.6.3" @@ -29304,7 +30093,7 @@ __metadata: languageName: node linkType: hard -"tsconfig@npm:5.0.0-beta.12, tsconfig@workspace:packages/utils/tsconfig": +"tsconfig@npm:5.0.0-beta.13, tsconfig@workspace:packages/utils/tsconfig": version: 0.0.0-use.local resolution: "tsconfig@workspace:packages/utils/tsconfig" dependencies: From f283c6888d87ff29fce74cb8ee30689f9cd1344d Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Thu, 20 Jun 2024 09:33:41 +0200 Subject: [PATCH 15/78] chore: beta-13 release --- examples/experimental-dev/package.json | 6 +- examples/getstarted/package.json | 20 +- examples/kitchensink-ts/package.json | 6 +- examples/kitchensink/package.json | 10 +- .../plugins/workspace-plugin/package.json | 2 +- packages/core/review-workflows/package.json | 2 +- yarn.lock | 867 +----------------- 7 files changed, 62 insertions(+), 851 deletions(-) diff --git a/examples/experimental-dev/package.json b/examples/experimental-dev/package.json index 82476e93a3..149a01dd8e 100644 --- a/examples/experimental-dev/package.json +++ b/examples/experimental-dev/package.json @@ -1,6 +1,6 @@ { "name": "experimental-dev", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "description": "A Strapi application", "license": "MIT", @@ -14,8 +14,8 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/plugin-users-permissions": "5.0.0-beta.12", - "@strapi/strapi": "5.0.0-beta.12", + "@strapi/plugin-users-permissions": "5.0.0-beta.13", + "@strapi/strapi": "5.0.0-beta.13", "better-sqlite3": "9.4.3", "react": "rc", "react-dom": "rc", diff --git a/examples/getstarted/package.json b/examples/getstarted/package.json index 349f4157c8..0d3501584f 100644 --- a/examples/getstarted/package.json +++ b/examples/getstarted/package.json @@ -1,6 +1,6 @@ { "name": "getstarted", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "description": "A Strapi application.", "license": "SEE LICENSE IN LICENSE", @@ -14,15 +14,15 @@ }, "dependencies": { "@strapi/icons": "2.0.0-beta.6", - "@strapi/plugin-color-picker": "5.0.0-beta.12", - "@strapi/plugin-documentation": "5.0.0-beta.12", - "@strapi/plugin-graphql": "5.0.0-beta.12", - "@strapi/plugin-sentry": "5.0.0-beta.12", - "@strapi/plugin-users-permissions": "5.0.0-beta.12", - "@strapi/provider-email-mailgun": "5.0.0-beta.12", - "@strapi/provider-upload-aws-s3": "5.0.0-beta.12", - "@strapi/provider-upload-cloudinary": "5.0.0-beta.12", - "@strapi/strapi": "5.0.0-beta.12", + "@strapi/plugin-color-picker": "5.0.0-beta.13", + "@strapi/plugin-documentation": "5.0.0-beta.13", + "@strapi/plugin-graphql": "5.0.0-beta.13", + "@strapi/plugin-sentry": "5.0.0-beta.13", + "@strapi/plugin-users-permissions": "5.0.0-beta.13", + "@strapi/provider-email-mailgun": "5.0.0-beta.13", + "@strapi/provider-upload-aws-s3": "5.0.0-beta.13", + "@strapi/provider-upload-cloudinary": "5.0.0-beta.13", + "@strapi/strapi": "5.0.0-beta.13", "better-sqlite3": "9.4.3", "lodash": "4.17.21", "mysql2": "3.9.4", diff --git a/examples/kitchensink-ts/package.json b/examples/kitchensink-ts/package.json index e2a94f6d00..f021029edc 100644 --- a/examples/kitchensink-ts/package.json +++ b/examples/kitchensink-ts/package.json @@ -1,6 +1,6 @@ { "name": "kitchensink-ts", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "description": "A Strapi application", "license": "MIT", @@ -14,8 +14,8 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/plugin-users-permissions": "5.0.0-beta.12", - "@strapi/strapi": "5.0.0-beta.12", + "@strapi/plugin-users-permissions": "5.0.0-beta.13", + "@strapi/strapi": "5.0.0-beta.13", "better-sqlite3": "9.4.3", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/examples/kitchensink/package.json b/examples/kitchensink/package.json index 89cb1560d9..65bd4e98e0 100644 --- a/examples/kitchensink/package.json +++ b/examples/kitchensink/package.json @@ -1,6 +1,6 @@ { "name": "kitchensink", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "description": "A Strapi application.", "license": "SEE LICENSE IN LICENSE", @@ -13,10 +13,10 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/provider-email-mailgun": "5.0.0-beta.12", - "@strapi/provider-upload-aws-s3": "5.0.0-beta.12", - "@strapi/provider-upload-cloudinary": "5.0.0-beta.12", - "@strapi/strapi": "5.0.0-beta.12", + "@strapi/provider-email-mailgun": "5.0.0-beta.13", + "@strapi/provider-upload-aws-s3": "5.0.0-beta.13", + "@strapi/provider-upload-cloudinary": "5.0.0-beta.13", + "@strapi/strapi": "5.0.0-beta.13", "better-sqlite3": "9.4.3", "lodash": "4.17.21", "mysql2": "3.9.4", diff --git a/examples/plugins/workspace-plugin/package.json b/examples/plugins/workspace-plugin/package.json index e281bab7cb..cf2fa90843 100644 --- a/examples/plugins/workspace-plugin/package.json +++ b/examples/plugins/workspace-plugin/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-workspace-plugin", - "version": "5.0.0-beta.12", + "version": "5.0.0-beta.13", "private": true, "description": "This is the description of my plugin.", "exports": { diff --git a/packages/core/review-workflows/package.json b/packages/core/review-workflows/package.json index cb83e0db10..4370f6b46e 100644 --- a/packages/core/review-workflows/package.json +++ b/packages/core/review-workflows/package.json @@ -69,7 +69,7 @@ "@strapi/content-manager": "5.0.0-beta.13", "@strapi/pack-up": "5.0.0", "@strapi/types": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.12", + "@strapi/utils": "5.0.0-beta.13", "@testing-library/react": "15.0.7", "msw": "1.3.0", "react": "18.3.1", diff --git a/yarn.lock b/yarn.lock index 70d3b0dbeb..de51028856 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7664,81 +7664,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/admin@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/admin@npm:5.0.0-beta.12" - dependencies: - "@casl/ability": "npm:6.5.0" - "@internationalized/date": "npm:3.5.4" - "@radix-ui/react-context": "npm:1.0.1" - "@radix-ui/react-toolbar": "npm:1.0.4" - "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/permissions": "npm:5.0.0-beta.12" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/typescript-utils": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" - "@testing-library/dom": "npm:10.1.0" - "@testing-library/react": "npm:15.0.7" - "@testing-library/user-event": "npm:14.5.2" - axios: "npm:1.6.8" - bcryptjs: "npm:2.4.3" - boxen: "npm:5.1.2" - chalk: "npm:^4.1.2" - codemirror5: "npm:codemirror@^5.65.11" - cross-env: "npm:^7.0.3" - date-fns: "npm:2.30.0" - execa: "npm:5.1.1" - fast-deep-equal: "npm:3.1.3" - formik: "npm:2.4.5" - fractional-indexing: "npm:3.2.0" - fs-extra: "npm:11.2.0" - highlight.js: "npm:^10.4.1" - immer: "npm:9.0.21" - inquirer: "npm:8.2.5" - invariant: "npm:^2.2.4" - jsonwebtoken: "npm:9.0.0" - koa: "npm:2.15.2" - koa-compose: "npm:4.1.0" - koa-passport: "npm:6.0.0" - koa-static: "npm:5.0.0" - koa2-ratelimit: "npm:^1.1.3" - lodash: "npm:4.17.21" - msw: "npm:1.3.0" - node-schedule: "npm:2.1.0" - ora: "npm:5.4.1" - p-map: "npm:4.0.0" - passport-local: "npm:1.0.0" - pluralize: "npm:8.0.0" - qs: "npm:6.11.1" - react-dnd: "npm:16.0.1" - react-dnd-html5-backend: "npm:16.0.1" - react-intl: "npm:6.6.2" - react-is: "npm:^18.2.0" - react-query: "npm:3.39.3" - react-redux: "npm:8.1.3" - react-select: "npm:5.8.0" - react-window: "npm:1.8.10" - rimraf: "npm:5.0.5" - sanitize-html: "npm:2.11.0" - scheduler: "npm:0.23.0" - semver: "npm:7.5.4" - sift: "npm:16.0.1" - typescript: "npm:5.3.2" - use-context-selector: "npm:1.4.1" - yup: "npm:0.32.9" - zod: "npm:^3.22.4" - peerDependencies: - "@strapi/data-transfer": ^5.0.0 ||  ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: 6b53a7ce55950b87a794b72f53a817c96f9a90eeff25c9a14956b1fb81b08d022d876c4dc217574aff6845def36872fc64daab05ed0d42a46df480f306b3c872 - languageName: node - linkType: hard - "@strapi/admin@npm:5.0.0-beta.13, @strapi/admin@workspace:packages/core/admin": version: 0.0.0-use.local resolution: "@strapi/admin@workspace:packages/core/admin" @@ -7838,58 +7763,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-manager@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/content-manager@npm:5.0.0-beta.12" - dependencies: - "@radix-ui/react-toolbar": "npm:1.0.4" - "@reduxjs/toolkit": "npm:1.9.7" - "@sindresorhus/slugify": "npm:1.1.0" - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" - codemirror5: "npm:codemirror@^5.65.11" - date-fns: "npm:2.30.0" - fractional-indexing: "npm:3.2.0" - highlight.js: "npm:^10.4.1" - immer: "npm:9.0.21" - koa: "npm:2.15.2" - lodash: "npm:4.17.21" - markdown-it: "npm:^12.3.2" - markdown-it-abbr: "npm:^1.0.4" - markdown-it-container: "npm:^3.0.0" - markdown-it-deflist: "npm:^2.1.0" - markdown-it-emoji: "npm:^2.0.0" - markdown-it-footnote: "npm:^3.0.3" - markdown-it-ins: "npm:^3.0.1" - markdown-it-mark: "npm:^3.0.1" - markdown-it-sub: "npm:^1.0.0" - markdown-it-sup: "npm:1.0.0" - node-schedule: "npm:2.1.0" - qs: "npm:6.11.1" - react-dnd: "npm:16.0.1" - react-dnd-html5-backend: "npm:16.0.1" - react-helmet: "npm:^6.1.0" - react-intl: "npm:6.6.2" - react-query: "npm:3.39.3" - react-redux: "npm:8.1.3" - react-window: "npm:1.8.10" - sanitize-html: "npm:2.11.0" - slate: "npm:0.94.1" - slate-history: "npm:0.93.0" - slate-react: "npm:0.98.3" - yup: "npm:0.32.9" - peerDependencies: - "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: d77dc01b9fa57b79effd0f3b74c052d66a5d5ee6eb137e82e09741b74dff230dbce397fde9a9bcde1b101214250290a670640cf5b9e06c294a604c68e04f2603 - languageName: node - linkType: hard - "@strapi/content-manager@npm:5.0.0-beta.13, @strapi/content-manager@workspace:packages/core/content-manager": version: 0.0.0-use.local resolution: "@strapi/content-manager@workspace:packages/core/content-manager" @@ -7953,35 +7826,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-releases@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/content-releases@npm:5.0.0-beta.12" - dependencies: - "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/database": "npm:5.0.0-beta.12" - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" - date-fns: "npm:2.30.0" - date-fns-tz: "npm:2.0.1" - formik: "npm:2.4.5" - lodash: "npm:4.17.21" - node-schedule: "npm:2.1.0" - react-intl: "npm:6.6.2" - react-redux: "npm:8.1.3" - yup: "npm:0.32.9" - peerDependencies: - "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - "@strapi/content-manager": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: b303b4d3abd6d397cf98fa2f03324f9f15411ab5faef59371fde6a8b3cb000be1bdeea4145f3eafd528c9da1a23b2024b754180fb9d36a877db7ba0101279b14 - languageName: node - linkType: hard - "@strapi/content-releases@npm:5.0.0-beta.13, @strapi/content-releases@workspace:packages/core/content-releases": version: 0.0.0-use.local resolution: "@strapi/content-releases@workspace:packages/core/content-releases" @@ -8025,35 +7869,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-type-builder@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/content-type-builder@npm:5.0.0-beta.12" - dependencies: - "@reduxjs/toolkit": "npm:1.9.7" - "@sindresorhus/slugify": "npm:1.1.0" - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/generators": "npm:5.0.0-beta.12" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/utils": "npm:5.0.0-beta.12" - date-fns: "npm:2.30.0" - fs-extra: "npm:11.2.0" - immer: "npm:9.0.21" - lodash: "npm:4.17.21" - pluralize: "npm:8.0.0" - qs: "npm:6.11.1" - react-intl: "npm:6.6.2" - react-redux: "npm:8.1.3" - yup: "npm:0.32.9" - peerDependencies: - "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: aa953911519f136f82597acd5a2ea9fb3109d18fb7f8485150a03a2ae246132deaca5c3ec53c83d8d02f16d3c935480dfa0e96d85ca5def1cca0c729ab82bef1 - languageName: node - linkType: hard - "@strapi/content-type-builder@npm:5.0.0-beta.13, @strapi/content-type-builder@workspace:packages/core/content-type-builder": version: 0.0.0-use.local resolution: "@strapi/content-type-builder@workspace:packages/core/content-type-builder" @@ -8096,67 +7911,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/core@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/core@npm:5.0.0-beta.12" - dependencies: - "@koa/cors": "npm:5.0.0" - "@koa/router": "npm:12.0.1" - "@paralleldrive/cuid2": "npm:2.2.2" - "@strapi/admin": "npm:5.0.0-beta.12" - "@strapi/database": "npm:5.0.0-beta.12" - "@strapi/generate-new": "npm:5.0.0-beta.12" - "@strapi/generators": "npm:5.0.0-beta.12" - "@strapi/logger": "npm:5.0.0-beta.12" - "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.12" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/typescript-utils": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" - bcryptjs: "npm:2.4.3" - boxen: "npm:5.1.2" - chalk: "npm:4.1.2" - ci-info: "npm:4.0.0" - cli-table3: "npm:0.6.2" - commander: "npm:8.3.0" - configstore: "npm:5.0.1" - copyfiles: "npm:2.4.1" - debug: "npm:4.3.4" - delegates: "npm:1.0.0" - dotenv: "npm:16.4.5" - execa: "npm:5.1.1" - fs-extra: "npm:11.2.0" - glob: "npm:10.3.10" - global-agent: "npm:3.0.0" - http-errors: "npm:2.0.0" - inquirer: "npm:8.2.5" - is-docker: "npm:2.2.1" - koa: "npm:2.15.2" - koa-body: "npm:6.0.1" - koa-compose: "npm:4.1.0" - koa-compress: "npm:5.1.1" - koa-favicon: "npm:2.1.0" - koa-helmet: "npm:7.0.2" - koa-ip: "npm:^2.1.3" - koa-session: "npm:6.4.0" - koa-static: "npm:5.0.0" - lodash: "npm:4.17.21" - mime-types: "npm:2.1.35" - node-schedule: "npm:2.1.0" - open: "npm:8.4.0" - ora: "npm:5.4.1" - package-json: "npm:7.0.0" - pkg-up: "npm:3.1.0" - qs: "npm:6.11.1" - semver: "npm:7.5.4" - statuses: "npm:2.0.1" - typescript: "npm:5.2.2" - undici: "npm:6.18.2" - yup: "npm:0.32.9" - checksum: f7133fcce80fa006e81987f3d17287908a5bafbb1fe4546b3998a4a9715bb51560b215b50258b0fc4466579a96622f6eb8f8a7f5793bde297c8d60b97dd6791c - languageName: node - linkType: hard - "@strapi/core@npm:5.0.0-beta.13, @strapi/core@workspace:packages/core/core": version: 0.0.0-use.local resolution: "@strapi/core@workspace:packages/core/core" @@ -8238,31 +7992,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/data-transfer@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/data-transfer@npm:5.0.0-beta.12" - dependencies: - "@strapi/logger": "npm:5.0.0-beta.12" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" - chalk: "npm:4.1.2" - cli-table3: "npm:0.6.2" - commander: "npm:8.3.0" - fs-extra: "npm:11.2.0" - inquirer: "npm:8.2.5" - lodash: "npm:4.17.21" - ora: "npm:5.4.1" - resolve-cwd: "npm:3.0.0" - semver: "npm:7.5.4" - stream-chain: "npm:2.2.5" - stream-json: "npm:1.8.0" - tar: "npm:6.1.13" - tar-stream: "npm:2.2.0" - ws: "npm:8.13.0" - checksum: 5e1b279dd2523fcac28e3a6a228efd519bb3cd0429346e7aabf85e7c0da13eaeae0d839cea292a86a543f6a5a9cde6a51d8b1c8eef71b12af52232870c48b270 - languageName: node - linkType: hard - "@strapi/data-transfer@npm:5.0.0-beta.13, @strapi/data-transfer@workspace:packages/core/data-transfer": version: 0.0.0-use.local resolution: "@strapi/data-transfer@workspace:packages/core/data-transfer" @@ -8304,24 +8033,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/database@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/database@npm:5.0.0-beta.12" - dependencies: - "@paralleldrive/cuid2": "npm:2.2.2" - "@strapi/utils": "npm:5.0.0-beta.12" - ajv: "npm:8.16.0" - date-fns: "npm:2.30.0" - debug: "npm:4.3.4" - fs-extra: "npm:11.2.0" - knex: "npm:3.0.1" - lodash: "npm:4.17.21" - semver: "npm:7.5.4" - umzug: "npm:3.8.1" - checksum: 79c6149afdb928436a9aee0e51f828a106d3436dcfc5dc35b0626ae48914b42670109323f54f7aa6bbecfa5e8c04dbd2698e4609501603247c740bb5162cdc78 - languageName: node - linkType: hard - "@strapi/database@npm:5.0.0-beta.13, @strapi/database@workspace:*, @strapi/database@workspace:packages/core/database": version: 0.0.0-use.local resolution: "@strapi/database@workspace:packages/core/database" @@ -8378,29 +8089,6 @@ __metadata: languageName: node linkType: hard -"@strapi/email@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/email@npm:5.0.0-beta.12" - dependencies: - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/provider-email-sendmail": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" - lodash: "npm:4.17.21" - react-intl: "npm:6.6.2" - react-query: "npm:3.39.3" - yup: "npm:0.32.9" - peerDependencies: - "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - koa: 2.13.4 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: 152c56b0f82ece193dbd84489768969bb606c06eb0f1637be353906adb11aeff20bd8e333ce5cfceb0d7e770f13d9e0057e68e81a5ac537643c89acbcffbe258 - languageName: node - linkType: hard - "@strapi/email@npm:5.0.0-beta.13, @strapi/email@workspace:packages/core/email": version: 0.0.0-use.local resolution: "@strapi/email@workspace:packages/core/email" @@ -8467,23 +8155,6 @@ __metadata: languageName: node linkType: hard -"@strapi/generate-new@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/generate-new@npm:5.0.0-beta.12" - dependencies: - chalk: "npm:^4.1.2" - execa: "npm:5.1.1" - fs-extra: "npm:11.2.0" - inquirer: "npm:8.2.5" - lodash: "npm:4.17.21" - node-machine-id: "npm:^1.1.10" - ora: "npm:^5.4.1" - semver: "npm:7.5.4" - tar: "npm:6.1.13" - checksum: e5ad599e294251547bb36d0b6e4df7490b6968f4fd66a9991522ca53132fb6a6fd736d144a20569ed29637e076589ac40eb3dc7d1b73d4947961fe487b7008d0 - languageName: node - linkType: hard - "@strapi/generate-new@npm:5.0.0-beta.13, @strapi/generate-new@workspace:packages/generators/app": version: 0.0.0-use.local resolution: "@strapi/generate-new@workspace:packages/generators/app" @@ -8504,23 +8175,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/generators@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/generators@npm:5.0.0-beta.12" - dependencies: - "@sindresorhus/slugify": "npm:1.1.0" - "@strapi/typescript-utils": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" - chalk: "npm:4.1.2" - copyfiles: "npm:2.4.1" - fs-extra: "npm:11.2.0" - node-plop: "npm:0.26.3" - plop: "npm:2.7.6" - pluralize: "npm:8.0.0" - checksum: 7b475ca91b6502b0bff00c4053b93e815e91b9b34b1ba7640809fab8aec121dcca8b93d5ef7d0c823d9506eff7d37a602b246ff2122e38535587ab3b5e918b2c - languageName: node - linkType: hard - "@strapi/generators@npm:5.0.0-beta.13, @strapi/generators@workspace:packages/generators/generators": version: 0.0.0-use.local resolution: "@strapi/generators@workspace:packages/generators/generators" @@ -8541,30 +8195,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/i18n@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/i18n@npm:5.0.0-beta.12" - dependencies: - "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/utils": "npm:5.0.0-beta.12" - lodash: "npm:4.17.21" - qs: "npm:6.11.1" - react-intl: "npm:6.6.2" - react-redux: "npm:8.1.3" - yup: "npm:0.32.9" - peerDependencies: - "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - "@strapi/content-manager": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: b3e3878a8715979bcc47959790fef364c69353b3bb82cbefac40c9791956560169161377b3c41ca7ebbf2fd22058a7e3fee74f2eb326dc3d62cc8e0bf4f15eb9 - languageName: node - linkType: hard - "@strapi/i18n@npm:5.0.0-beta.13, @strapi/i18n@workspace:packages/plugins/i18n": version: 0.0.0-use.local resolution: "@strapi/i18n@workspace:packages/plugins/i18n" @@ -8612,16 +8242,6 @@ __metadata: languageName: node linkType: hard -"@strapi/logger@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/logger@npm:5.0.0-beta.12" - dependencies: - lodash: "npm:4.17.21" - winston: "npm:3.10.0" - checksum: 8b59d82af267f6cee6b7e239f14da4b8a97c26acd8f33883a948cb18af220b63a9e71feb7dffc5310cca48c8258431a991706c340d495a06eb23408941a6cbc8 - languageName: node - linkType: hard - "@strapi/logger@npm:5.0.0-beta.13, @strapi/logger@workspace:packages/utils/logger": version: 0.0.0-use.local resolution: "@strapi/logger@workspace:packages/utils/logger" @@ -8696,19 +8316,6 @@ __metadata: languageName: node linkType: hard -"@strapi/permissions@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/permissions@npm:5.0.0-beta.12" - dependencies: - "@casl/ability": "npm:6.5.0" - "@strapi/utils": "npm:5.0.0-beta.12" - lodash: "npm:4.17.21" - qs: "npm:6.11.1" - sift: "npm:16.0.1" - checksum: e17e68406d8082eed1c97c81707efbc908f9472c772b30acd9999dfbf507dbce3b409df26328ef8cff58e8515b3da8616636607dea58ac0c1203d16cc402c6b2 - languageName: node - linkType: hard - "@strapi/permissions@npm:5.0.0-beta.13, @strapi/permissions@workspace:packages/core/permissions": version: 0.0.0-use.local resolution: "@strapi/permissions@workspace:packages/core/permissions" @@ -8749,25 +8356,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-color-picker@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/plugin-color-picker@npm:5.0.0-beta.12" - dependencies: - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - react-colorful: "npm:5.6.1" - react-intl: "npm:6.6.2" - peerDependencies: - "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: 20a652cd0f5f1489336ca6294820f2a2a02f26cbb01a20aca03eb6401c8fa31ad2e43de9d696a6b77658b4b7b80c3fce1a750ca9242828fa7851fdacb97b8ec2 - languageName: node - linkType: hard - -"@strapi/plugin-color-picker@workspace:packages/plugins/color-picker": +"@strapi/plugin-color-picker@npm:5.0.0-beta.13, @strapi/plugin-color-picker@workspace:packages/plugins/color-picker": version: 0.0.0-use.local resolution: "@strapi/plugin-color-picker@workspace:packages/plugins/color-picker" dependencies: @@ -8793,38 +8382,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-documentation@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/plugin-documentation@npm:5.0.0-beta.12" - dependencies: - "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.12" - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/utils": "npm:5.0.0-beta.12" - bcryptjs: "npm:2.4.3" - cheerio: "npm:^1.0.0-rc.12" - formik: "npm:2.4.5" - fs-extra: "npm:11.2.0" - immer: "npm:9.0.21" - koa-static: "npm:^5.0.0" - lodash: "npm:4.17.21" - path-to-regexp: "npm:6.2.1" - react-intl: "npm:6.6.2" - swagger-ui-dist: "npm:4.19.0" - yaml: "npm:1.10.2" - yup: "npm:0.32.9" - peerDependencies: - "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: afe380a5a7101cd1831ce859fe1463a87d9445e7f05284f22ec13a59128555fcdaeaa2b5af87dfd375fd63360faef6ed0d95f3b30bec76d44bb92f8e0bc03a7a - languageName: node - linkType: hard - -"@strapi/plugin-documentation@workspace:packages/plugins/documentation": +"@strapi/plugin-documentation@npm:5.0.0-beta.13, @strapi/plugin-documentation@workspace:packages/plugins/documentation": version: 0.0.0-use.local resolution: "@strapi/plugin-documentation@workspace:packages/plugins/documentation" dependencies: @@ -8875,38 +8433,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-graphql@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/plugin-graphql@npm:5.0.0-beta.12" - dependencies: - "@apollo/server": "npm:4.10.0" - "@as-integrations/koa": "npm:1.1.1" - "@graphql-tools/schema": "npm:10.0.3" - "@graphql-tools/utils": "npm:^10.1.3" - "@koa/cors": "npm:5.0.0" - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/utils": "npm:5.0.0-beta.12" - graphql: "npm:^16.8.1" - graphql-depth-limit: "npm:^1.1.0" - graphql-playground-middleware-koa: "npm:^1.6.21" - graphql-scalars: "npm:1.22.2" - koa-bodyparser: "npm:4.4.1" - koa-compose: "npm:^4.1.0" - lodash: "npm:4.17.21" - nexus: "npm:1.3.0" - pluralize: "npm:8.0.0" - peerDependencies: - "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: 83016010ceb486532fc1dbd28035157baaa9cb35c97ac136175add06d073db10f65f2882cb664c313cad39e5fe9fe312a01f8595af9e8a6a9686a8ae0fe99469 - languageName: node - linkType: hard - -"@strapi/plugin-graphql@workspace:packages/plugins/graphql": +"@strapi/plugin-graphql@npm:5.0.0-beta.13, @strapi/plugin-graphql@workspace:packages/plugins/graphql": version: 0.0.0-use.local resolution: "@strapi/plugin-graphql@workspace:packages/plugins/graphql" dependencies: @@ -8951,24 +8478,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-sentry@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/plugin-sentry@npm:5.0.0-beta.12" - dependencies: - "@sentry/node": "npm:7.112.2" - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - peerDependencies: - "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: df213385cd177e35c4e8d955b256e93bd5b22a2ee1d6c0e97cc322b2c968aeea3b58278a459318b39b2c7489875e40cad40c2a44beedaa585eb3dd9876362275 - languageName: node - linkType: hard - -"@strapi/plugin-sentry@workspace:packages/plugins/sentry": +"@strapi/plugin-sentry@npm:5.0.0-beta.13, @strapi/plugin-sentry@workspace:packages/plugins/sentry": version: 0.0.0-use.local resolution: "@strapi/plugin-sentry@workspace:packages/plugins/sentry" dependencies: @@ -8991,40 +8501,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-users-permissions@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/plugin-users-permissions@npm:5.0.0-beta.12" - dependencies: - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/utils": "npm:5.0.0-beta.12" - bcryptjs: "npm:2.4.3" - formik: "npm:2.4.5" - grant-koa: "npm:5.4.8" - immer: "npm:9.0.21" - jsonwebtoken: "npm:9.0.0" - jwk-to-pem: "npm:2.0.5" - koa: "npm:2.15.2" - koa2-ratelimit: "npm:^1.1.3" - lodash: "npm:4.17.21" - prop-types: "npm:^15.8.1" - purest: "npm:4.0.2" - react-intl: "npm:6.6.2" - react-query: "npm:3.39.3" - react-redux: "npm:8.1.3" - url-join: "npm:4.0.1" - yup: "npm:0.32.9" - peerDependencies: - "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: bf64462a17c18b0a2f14346d495ee8539e8ae96e8afff7ea816e9a27741cf5fd8628552b92fd059b335b98760aa21a0c190e7063ddceaa9d039ee6403ddc9952 - languageName: node - linkType: hard - -"@strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions": +"@strapi/plugin-users-permissions@npm:5.0.0-beta.13, @strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions": version: 0.0.0-use.local resolution: "@strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions" dependencies: @@ -9078,18 +8555,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/provider-email-mailgun@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/provider-email-mailgun@npm:5.0.0-beta.12" - dependencies: - "@strapi/utils": "npm:5.0.0-beta.12" - form-data: "npm:^4.0.0" - mailgun.js: "npm:10.2.1" - checksum: dc7b36a2676e2655dc2af55c476b0463dc32bc6a1b63dd6454c8fc5b4dacf7b2606f0100c2695ec1e86be9fc67c10becfeb279e65a5d974cbd5578d07d72a55f - languageName: node - linkType: hard - -"@strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun": +"@strapi/provider-email-mailgun@npm:5.0.0-beta.13, @strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun": version: 0.0.0-use.local resolution: "@strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun" dependencies: @@ -9127,16 +8593,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/provider-email-sendmail@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/provider-email-sendmail@npm:5.0.0-beta.12" - dependencies: - "@strapi/utils": "npm:5.0.0-beta.12" - sendmail: "npm:^1.6.1" - checksum: 3ff5498c7c013bf5eb0620eb3ed295532eff29e1c6ee85b3cbbf6d7bbdee9f3d0fa3a9d459a9ce327800b35c6fbdcb6c417dfef7017c7b2e5078b42d60ef163f - languageName: node - linkType: hard - "@strapi/provider-email-sendmail@npm:5.0.0-beta.13, @strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail": version: 0.0.0-use.local resolution: "@strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail" @@ -9150,20 +8606,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/provider-upload-aws-s3@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/provider-upload-aws-s3@npm:5.0.0-beta.12" - dependencies: - "@aws-sdk/client-s3": "npm:3.433.0" - "@aws-sdk/lib-storage": "npm:3.433.0" - "@aws-sdk/s3-request-presigner": "npm:3.433.0" - "@aws-sdk/types": "npm:3.433.0" - lodash: "npm:4.17.21" - checksum: 4ee42bf6e0861830f2ea5ee9262c5a078da1d272ffe56d310e1cd443ea775619530b9462fb809b64ba12c848e52aec44ea3ca0aa785f88ce754d0a87ed5b91b3 - languageName: node - linkType: hard - -"@strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3": +"@strapi/provider-upload-aws-s3@npm:5.0.0-beta.13, @strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3": version: 0.0.0-use.local resolution: "@strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3" dependencies: @@ -9179,18 +8622,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/provider-upload-cloudinary@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/provider-upload-cloudinary@npm:5.0.0-beta.12" - dependencies: - "@strapi/utils": "npm:5.0.0-beta.12" - cloudinary: "npm:^1.41.0" - into-stream: "npm:^5.1.0" - checksum: e4f2c2f66ba17600a84fefb440b40815d61232c9c5b796aeb5abc351aa5d23cdc38a0c42d6c4563198f4fdba96fc946bad26146f437f37de990a6b817a27f901 - languageName: node - linkType: hard - -"@strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary": +"@strapi/provider-upload-cloudinary@npm:5.0.0-beta.13, @strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary": version: 0.0.0-use.local resolution: "@strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary" dependencies: @@ -9203,16 +8635,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/provider-upload-local@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/provider-upload-local@npm:5.0.0-beta.12" - dependencies: - "@strapi/utils": "npm:5.0.0-beta.12" - fs-extra: "npm:11.2.0" - checksum: 1dd45df244de00e015afe8499b2b96668506119148ed36260701adf53e134da2a904ddc349284db085dd6c19525aad83a2b7f05925e74c7fb607addb5857fe89 - languageName: node - linkType: hard - "@strapi/provider-upload-local@npm:5.0.0-beta.13, @strapi/provider-upload-local@workspace:packages/providers/upload-local": version: 0.0.0-use.local resolution: "@strapi/provider-upload-local@workspace:packages/providers/upload-local" @@ -9229,32 +8651,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/review-workflows@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/review-workflows@npm:5.0.0-beta.12" - dependencies: - "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/utils": "npm:5.0.0-beta.1" - fractional-indexing: "npm:3.2.0" - react-dnd: "npm:16.0.1" - react-dnd-html5-backend: "npm:16.0.1" - react-helmet: "npm:^6.1.0" - react-intl: "npm:6.6.2" - react-redux: "npm:8.1.3" - yup: "npm:0.32.9" - peerDependencies: - "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - "@strapi/content-manager": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: 94ee895f9d8934a38fc887289aa86733acfa2deddead3248d4d14e7b846c7511014800dbbdd68238ee90ae49a7ba4e2d547b328ebef0d25a75d2c24254626c0a - languageName: node - linkType: hard - "@strapi/review-workflows@npm:5.0.0-beta.13, @strapi/review-workflows@workspace:packages/core/review-workflows": version: 0.0.0-use.local resolution: "@strapi/review-workflows@workspace:packages/core/review-workflows" @@ -9266,7 +8662,7 @@ __metadata: "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.12" + "@strapi/utils": "npm:5.0.0-beta.13" "@testing-library/react": "npm:15.0.7" fractional-indexing: "npm:3.2.0" msw: "npm:1.3.0" @@ -9315,84 +8711,6 @@ __metadata: languageName: node linkType: hard -"@strapi/strapi@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/strapi@npm:5.0.0-beta.12" - dependencies: - "@pmmmwh/react-refresh-webpack-plugin": "npm:0.5.11" - "@strapi/admin": "npm:5.0.0-beta.12" - "@strapi/content-manager": "npm:5.0.0-beta.12" - "@strapi/content-releases": "npm:5.0.0-beta.12" - "@strapi/content-type-builder": "npm:5.0.0-beta.12" - "@strapi/core": "npm:5.0.0-beta.12" - "@strapi/data-transfer": "npm:5.0.0-beta.12" - "@strapi/database": "npm:5.0.0-beta.12" - "@strapi/email": "npm:5.0.0-beta.12" - "@strapi/generate-new": "npm:5.0.0-beta.12" - "@strapi/generators": "npm:5.0.0-beta.12" - "@strapi/i18n": "npm:5.0.0-beta.12" - "@strapi/logger": "npm:5.0.0-beta.12" - "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.12" - "@strapi/review-workflows": "npm:5.0.0-beta.12" - "@strapi/types": "npm:5.0.0-beta.12" - "@strapi/typescript-utils": "npm:5.0.0-beta.12" - "@strapi/upload": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" - "@types/nodemon": "npm:1.19.6" - "@vitejs/plugin-react-swc": "npm:3.6.0" - boxen: "npm:5.1.2" - browserslist: "npm:^4.23.0" - browserslist-to-esbuild: "npm:1.2.0" - chalk: "npm:4.1.2" - chokidar: "npm:3.5.3" - cli-table3: "npm:0.6.2" - commander: "npm:8.3.0" - concurrently: "npm:8.2.2" - copyfiles: "npm:2.4.1" - css-loader: "npm:^6.10.0" - dotenv: "npm:16.4.5" - esbuild: "npm:0.21.3" - esbuild-loader: "npm:^2.21.0" - esbuild-register: "npm:3.5.0" - execa: "npm:5.1.1" - fork-ts-checker-webpack-plugin: "npm:8.0.0" - fs-extra: "npm:11.2.0" - get-latest-version: "npm:5.1.0" - git-url-parse: "npm:14.0.0" - html-webpack-plugin: "npm:5.6.0" - inquirer: "npm:8.2.5" - lodash: "npm:4.17.21" - mini-css-extract-plugin: "npm:2.7.7" - nodemon: "npm:3.0.2" - ora: "npm:5.4.1" - outdent: "npm:0.8.0" - pkg-up: "npm:3.1.0" - prettier: "npm:3.2.5" - react-refresh: "npm:0.14.0" - read-pkg-up: "npm:7.0.1" - resolve-from: "npm:5.0.0" - semver: "npm:7.5.4" - style-loader: "npm:3.3.4" - typescript: "npm:5.3.2" - vite: "npm:5.1.6" - webpack: "npm:^5.90.3" - webpack-bundle-analyzer: "npm:^4.10.1" - webpack-dev-middleware: "npm:6.1.1" - webpack-hot-middleware: "npm:2.26.1" - yalc: "npm:1.0.0-pre.53" - yup: "npm:0.32.9" - peerDependencies: - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - bin: - strapi: bin/strapi.js - checksum: bbcd79c31e0c3c69490f63fac89cc8b4b40287b07169c3383cd0ad079ac1de1d0c87af696c04a6afb9de203055e89286a3ac575165bfab361229e73234a0b004 - languageName: node - linkType: hard - "@strapi/strapi@npm:5.0.0-beta.13, @strapi/strapi@workspace:packages/core/strapi": version: 0.0.0-use.local resolution: "@strapi/strapi@workspace:packages/core/strapi" @@ -9491,27 +8809,6 @@ __metadata: languageName: node linkType: hard -"@strapi/types@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/types@npm:5.0.0-beta.12" - dependencies: - "@casl/ability": "npm:6.5.0" - "@koa/cors": "npm:5.0.0" - "@koa/router": "npm:12.0.1" - "@strapi/database": "npm:5.0.0-beta.12" - "@strapi/logger": "npm:5.0.0-beta.12" - "@strapi/permissions": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" - commander: "npm:8.3.0" - koa: "npm:2.15.2" - node-schedule: "npm:2.1.0" - typedoc: "npm:0.25.10" - typedoc-github-wiki-theme: "npm:1.1.0" - typedoc-plugin-markdown: "npm:3.17.1" - checksum: 7c897e190bf6265b18f47006bc76377ede81c80f664636036993579cd6590aaedaac8231d0dc24e92efee334b90be59e46239cae3283cd320f8dcf14b3e06454 - languageName: node - linkType: hard - "@strapi/types@npm:5.0.0-beta.13, @strapi/types@workspace:*, @strapi/types@workspace:packages/core/types": version: 0.0.0-use.local resolution: "@strapi/types@workspace:packages/core/types" @@ -9543,20 +8840,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/typescript-utils@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/typescript-utils@npm:5.0.0-beta.12" - dependencies: - chalk: "npm:4.1.2" - cli-table3: "npm:0.6.2" - fs-extra: "npm:11.2.0" - lodash: "npm:4.17.21" - prettier: "npm:3.2.5" - typescript: "npm:5.3.2" - checksum: b4e01a90330184d10716595e5e46f6894ca8b83f5828626f56273fb8f077830b966c2f8ba465a70f5054292de77d4e5372d6fa79615dc539104d9a6cdcb60c22 - languageName: node - linkType: hard - "@strapi/typescript-utils@npm:5.0.0-beta.13, @strapi/typescript-utils@workspace:packages/utils/typescript": version: 0.0.0-use.local resolution: "@strapi/typescript-utils@workspace:packages/utils/typescript" @@ -9632,43 +8915,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/upload@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/upload@npm:5.0.0-beta.12" - dependencies: - "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/provider-upload-local": "npm:5.0.0-beta.12" - "@strapi/utils": "npm:5.0.0-beta.12" - byte-size: "npm:8.1.1" - cropperjs: "npm:1.6.1" - date-fns: "npm:2.30.0" - formik: "npm:2.4.5" - fs-extra: "npm:11.2.0" - immer: "npm:9.0.21" - koa-range: "npm:0.3.0" - koa-static: "npm:5.0.0" - lodash: "npm:4.17.21" - mime-types: "npm:2.1.35" - prop-types: "npm:^15.8.1" - qs: "npm:6.11.1" - react-dnd: "npm:16.0.1" - react-intl: "npm:6.6.2" - react-query: "npm:3.39.3" - react-redux: "npm:8.1.3" - react-select: "npm:5.8.0" - sharp: "npm:0.32.6" - yup: "npm:0.32.9" - peerDependencies: - "@strapi/admin": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - react-router-dom: ^6.0.0 - styled-components: ^6.0.0 - checksum: e711016c7ba3514ce522b8719d14bae535ea83db665663172ff8f36151ef4d7a9eb205a62aad68f72a673d5b02f1a8c2e4e292e8b866d697b33ccc49bdbc84b3 - languageName: node - linkType: hard - "@strapi/upload@npm:5.0.0-beta.13, @strapi/upload@workspace:packages/core/upload": version: 0.0.0-use.local resolution: "@strapi/upload@workspace:packages/core/upload" @@ -9723,41 +8969,6 @@ __metadata: languageName: unknown linkType: soft -"@strapi/utils@npm:5.0.0-beta.1": - version: 5.0.0-beta.1 - resolution: "@strapi/utils@npm:5.0.0-beta.1" - dependencies: - "@sindresorhus/slugify": "npm:1.1.0" - date-fns: "npm:2.30.0" - execa: "npm:5.1.1" - http-errors: "npm:1.8.1" - lodash: "npm:4.17.21" - node-machine-id: "npm:1.1.12" - p-map: "npm:4.0.0" - preferred-pm: "npm:3.1.2" - yup: "npm:0.32.9" - checksum: 906877a7557e4e88b68cee0cb449457707ac892044864e7b1fb7c75a7b2e1c6c97a6f7840334ac5ecd3fed3388398da0b423329505c1365f09e8593342713f23 - languageName: node - linkType: hard - -"@strapi/utils@npm:5.0.0-beta.12": - version: 5.0.0-beta.12 - resolution: "@strapi/utils@npm:5.0.0-beta.12" - dependencies: - "@sindresorhus/slugify": "npm:1.1.0" - date-fns: "npm:2.30.0" - execa: "npm:5.1.1" - http-errors: "npm:2.0.0" - lodash: "npm:4.17.21" - node-machine-id: "npm:1.1.12" - p-map: "npm:4.0.0" - preferred-pm: "npm:3.1.2" - yup: "npm:0.32.9" - zod: "npm:^3.22.4" - checksum: 76fb1a2a8d34eafc655e355ed62171cac513b1272ba9ec025a1e6d89dc93036c6a23feec3fd65e60caa20a012a3cae014f6de4fbbefb9d013bb2b06497ea7d38 - languageName: node - linkType: hard - "@strapi/utils@npm:5.0.0-beta.13, @strapi/utils@workspace:packages/core/utils": version: 0.0.0-use.local resolution: "@strapi/utils@workspace:packages/core/utils" @@ -17537,8 +16748,8 @@ __metadata: version: 0.0.0-use.local resolution: "experimental-dev@workspace:examples/experimental-dev" dependencies: - "@strapi/plugin-users-permissions": "npm:5.0.0-beta.12" - "@strapi/strapi": "npm:5.0.0-beta.12" + "@strapi/plugin-users-permissions": "npm:5.0.0-beta.13" + "@strapi/strapi": "npm:5.0.0-beta.13" "@vitejs/plugin-react": "npm:4.2.1" babel-plugin-react-compiler: "npm:0.0.0-experimental-c23de8d-20240515" better-sqlite3: "npm:9.4.3" @@ -18627,15 +17838,15 @@ __metadata: resolution: "getstarted@workspace:examples/getstarted" dependencies: "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/plugin-color-picker": "npm:5.0.0-beta.12" - "@strapi/plugin-documentation": "npm:5.0.0-beta.12" - "@strapi/plugin-graphql": "npm:5.0.0-beta.12" - "@strapi/plugin-sentry": "npm:5.0.0-beta.12" - "@strapi/plugin-users-permissions": "npm:5.0.0-beta.12" - "@strapi/provider-email-mailgun": "npm:5.0.0-beta.12" - "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.12" - "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.12" - "@strapi/strapi": "npm:5.0.0-beta.12" + "@strapi/plugin-color-picker": "npm:5.0.0-beta.13" + "@strapi/plugin-documentation": "npm:5.0.0-beta.13" + "@strapi/plugin-graphql": "npm:5.0.0-beta.13" + "@strapi/plugin-sentry": "npm:5.0.0-beta.13" + "@strapi/plugin-users-permissions": "npm:5.0.0-beta.13" + "@strapi/provider-email-mailgun": "npm:5.0.0-beta.13" + "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.13" + "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.13" + "@strapi/strapi": "npm:5.0.0-beta.13" better-sqlite3: "npm:9.4.3" lodash: "npm:4.17.21" mysql2: "npm:3.9.4" @@ -19561,19 +18772,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:1.8.1, http-errors@npm:^1.6.3, http-errors@npm:^1.7.3, http-errors@npm:^1.8.1, http-errors@npm:~1.8.0": - version: 1.8.1 - resolution: "http-errors@npm:1.8.1" - dependencies: - depd: "npm:~1.1.2" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:>= 1.5.0 < 2" - toidentifier: "npm:1.0.1" - checksum: 76fc491bd8df2251e21978e080d5dae20d9736cfb29bb72b5b76ec1bcebb1c14f0f58a3a128dd89288934379d2173cfb0421c571d54103e93dd65ef6243d64d8 - languageName: node - linkType: hard - "http-errors@npm:2.0.0, http-errors@npm:^2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" @@ -19587,6 +18785,19 @@ __metadata: languageName: node linkType: hard +"http-errors@npm:^1.6.3, http-errors@npm:^1.7.3, http-errors@npm:^1.8.1, http-errors@npm:~1.8.0": + version: 1.8.1 + resolution: "http-errors@npm:1.8.1" + dependencies: + depd: "npm:~1.1.2" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:>= 1.5.0 < 2" + toidentifier: "npm:1.0.1" + checksum: 76fc491bd8df2251e21978e080d5dae20d9736cfb29bb72b5b76ec1bcebb1c14f0f58a3a128dd89288934379d2173cfb0421c571d54103e93dd65ef6243d64d8 + languageName: node + linkType: hard + "http-errors@npm:~1.6.2": version: 1.6.3 resolution: "http-errors@npm:1.6.3" @@ -21951,8 +21162,8 @@ __metadata: version: 0.0.0-use.local resolution: "kitchensink-ts@workspace:examples/kitchensink-ts" dependencies: - "@strapi/plugin-users-permissions": "npm:5.0.0-beta.12" - "@strapi/strapi": "npm:5.0.0-beta.12" + "@strapi/plugin-users-permissions": "npm:5.0.0-beta.13" + "@strapi/strapi": "npm:5.0.0-beta.13" better-sqlite3: "npm:9.4.3" react: "npm:18.3.1" react-dom: "npm:18.3.1" @@ -21965,10 +21176,10 @@ __metadata: version: 0.0.0-use.local resolution: "kitchensink@workspace:examples/kitchensink" dependencies: - "@strapi/provider-email-mailgun": "npm:5.0.0-beta.12" - "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.12" - "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.12" - "@strapi/strapi": "npm:5.0.0-beta.12" + "@strapi/provider-email-mailgun": "npm:5.0.0-beta.13" + "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.13" + "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.13" + "@strapi/strapi": "npm:5.0.0-beta.13" better-sqlite3: "npm:9.4.3" lodash: "npm:4.17.21" mysql2: "npm:3.9.4" From 64a985e89bcfc6903026bc77487b93273e736aa3 Mon Sep 17 00:00:00 2001 From: Fernando Chavez Date: Thu, 20 Jun 2024 10:17:30 +0200 Subject: [PATCH 16/78] fix(core): linter issues --- .../src/services/entity-validator/index.ts | 36 ++++++++----------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/packages/core/core/src/services/entity-validator/index.ts b/packages/core/core/src/services/entity-validator/index.ts index 7228fade6e..806bdf3e8f 100644 --- a/packages/core/core/src/services/entity-validator/index.ts +++ b/packages/core/core/src/services/entity-validator/index.ts @@ -202,22 +202,19 @@ const createDzValidator = return validator; }; -const createRelationValidator = - (createOrUpdate: CreateOrUpdate) => - ( - { attr, updatedAttribute }: ValidatorMeta, - { isDraft }: ValidatorContext - ) => { - let validator; +const createRelationValidator = ({ + updatedAttribute, +}: ValidatorMeta) => { + let validator; - if (Array.isArray(updatedAttribute.value)) { - validator = yup.array().of(yup.mixed()); - } else { - validator = yup.mixed(); - } + if (Array.isArray(updatedAttribute.value)) { + validator = yup.array().of(yup.mixed()); + } else { + validator = yup.mixed(); + } - return validator; - }; + return validator; +}; const createScalarAttributeValidator = (createOrUpdate: CreateOrUpdate) => (metas: ValidatorMeta, options: ValidatorContext) => { @@ -256,13 +253,10 @@ const createAttributeValidator = } else if (metas.attr.type === 'dynamiczone') { validator = createDzValidator(createOrUpdate)(metas, options); } else if (metas.attr.type === 'relation') { - validator = createRelationValidator(createOrUpdate)( - { - attr: metas.attr, - updatedAttribute: metas.updatedAttribute, - }, - options - ); + validator = createRelationValidator({ + attr: metas.attr, + updatedAttribute: metas.updatedAttribute, + }); } validator = preventCast(validator); From bbdc5e8aa3a26f6f2f4f9699b98330354687e5d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20de=20Juvigny?= <8087692+remidej@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:35:59 +0200 Subject: [PATCH 17/78] fix: navigation issues (#20565) --- .../src/pages/Settings/pages/Roles/CreatePage.tsx | 2 +- .../src/pages/EditView/components/DocumentActions.tsx | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/CreatePage.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/CreatePage.tsx index 7f34135cf3..3768a76213 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/CreatePage.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/CreatePage.tsx @@ -150,7 +150,7 @@ const CreatePage = () => { message: formatMessage({ id: 'Settings.roles.created', defaultMessage: 'created' }), }); - navigate(res.data.id.toString(), { replace: true }); + navigate(`../roles/${res.data.id.toString()}`, { replace: true }); } catch (err) { toggleNotification({ type: 'danger', diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/DocumentActions.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/DocumentActions.tsx index e6a9ab8669..e3d0a47667 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/DocumentActions.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/DocumentActions.tsx @@ -721,10 +721,13 @@ const UpdateAction: DocumentActionComponent = ({ /** * TODO: refactor the router so we can just do `../${res.data.documentId}` instead of this. */ - navigate({ - pathname: `../${collectionType}/${model}/${res.data.documentId}`, - search: rawQuery, - }); + navigate( + { + pathname: `../${collectionType}/${model}/${res.data.documentId}`, + search: rawQuery, + }, + { replace: true } + ); } else if ( 'error' in res && isBaseQueryError(res.error) && From 5285f8db425cb2e2f783e9469712395015871ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20Herbaux?= Date: Thu, 20 Jun 2024 14:46:31 +0200 Subject: [PATCH 18/78] Fix Duplicate Rows on Deep Sorting (#20543) --- .../src/entity-manager/regular-relations.ts | 30 +- .../database/src/query/helpers/order-by.ts | 157 ++++++- .../src/query/helpers/streams/readable.ts | 4 +- .../core/database/src/query/query-builder.ts | 84 +++- .../api/number-of-draft-relations.test.api.js | 56 +-- .../api/core/strapi/api/sort/sort.test.api.ts | 402 ++++++++++++++++++ .../core/strapi/deep-filtering.test.api.js | 4 +- .../document-service/events.test.api.ts | 3 +- .../resources/fixtures/article.js | 61 +++ .../resources/fixtures/article.json | 52 --- .../resources/fixtures/author.js | 16 + .../resources/fixtures/author.json | 16 - .../resources/fixtures/category.js | 28 ++ .../resources/fixtures/category.json | 30 -- .../resources/fixtures/index.js | 6 +- .../strapi/document-service/utils/index.ts | 21 +- 16 files changed, 801 insertions(+), 169 deletions(-) create mode 100644 tests/api/core/strapi/api/sort/sort.test.api.ts create mode 100644 tests/api/core/strapi/document-service/resources/fixtures/article.js delete mode 100644 tests/api/core/strapi/document-service/resources/fixtures/article.json create mode 100644 tests/api/core/strapi/document-service/resources/fixtures/author.js delete mode 100644 tests/api/core/strapi/document-service/resources/fixtures/author.json create mode 100644 tests/api/core/strapi/document-service/resources/fixtures/category.js delete mode 100644 tests/api/core/strapi/document-service/resources/fixtures/category.json diff --git a/packages/core/database/src/entity-manager/regular-relations.ts b/packages/core/database/src/entity-manager/regular-relations.ts index b299c24882..51a1ed9276 100644 --- a/packages/core/database/src/entity-manager/regular-relations.ts +++ b/packages/core/database/src/entity-manager/regular-relations.ts @@ -25,7 +25,7 @@ declare module 'knex' { // TODO: This is a short term solution, to not steal relations from the same document. const getDocumentSiblingIdsQuery = (tableName: string, id: ID) => { - // Find if the model is a content type or something else (e.g component) + // Find if the model is a content type or something else (e.g. component) // to only get the documentId if it's a content type const models: Model[] = Array.from(strapi.db.metadata.values()); @@ -39,15 +39,19 @@ const getDocumentSiblingIdsQuery = (tableName: string, id: ID) => { // NOTE: SubQueries are wrapped in a function to not reuse the same connection, // which causes infinite self references - return (con: Knex) => { - con + return function (query) { + query + .select('id') .from(tableName) // Get all child ids of the document id - .select('id') - .where('document_id', (con2: Knex) => - con2.select('document_id').from(tableName).where('id', id) - ); - }; + .whereIn('document_id', (documentIDSubQuery) => { + documentIDSubQuery + .from(tableName) + // get document id related to the current id + .select('document_id') + .where('id', id); + }); + } satisfies Knex.QueryCallback; }; /** @@ -80,12 +84,8 @@ const deletePreviousOneToAnyRelations = async ({ .delete() .from(joinTable.name) // Exclude the ids of the current document - .whereNotIn( - // @ts-expect-error - knex incorrectly expects a string array - joinColumn.name, - getDocumentSiblingIdsQuery(joinColumn.referencedTable!, id) - ) - // Include all of the ids that are being connected + .whereNotIn(joinColumn.name, getDocumentSiblingIdsQuery(joinColumn.referencedTable!, id)) + // Include all the ids that are being connected .whereIn(inverseJoinColumn.name, relIdsToadd) .where(joinTable.on || {}) .transacting(trx); @@ -124,7 +124,6 @@ const deletePreviousAnyToOneRelations = async ({ .from(joinTable.name) .where(joinColumn.name, id) .whereNotIn( - // @ts-expect-error - knex incorrectly expects a string array inverseJoinColumn.name, getDocumentSiblingIdsQuery(inverseJoinColumn.referencedTable!, relIdToadd) ) @@ -153,7 +152,6 @@ const deletePreviousAnyToOneRelations = async ({ .where(joinColumn.name, id) // Exclude the ids of the current document .whereNotIn( - // @ts-expect-error - knex incorrectly expects a string array inverseJoinColumn.name, getDocumentSiblingIdsQuery(inverseJoinColumn.referencedTable!, relIdToadd) ) diff --git a/packages/core/database/src/query/helpers/order-by.ts b/packages/core/database/src/query/helpers/order-by.ts index 96812092f4..966024d3be 100644 --- a/packages/core/database/src/query/helpers/order-by.ts +++ b/packages/core/database/src/query/helpers/order-by.ts @@ -1,4 +1,5 @@ import _ from 'lodash/fp'; +import knex from 'knex'; import * as types from '../../utils/types'; import { createJoin } from './join'; @@ -8,7 +9,10 @@ import type { Ctx } from '../types'; type OrderByCtx = Ctx & { alias?: string }; type OrderBy = string | { [key: string]: 'asc' | 'desc' } | OrderBy[]; -type OrderByValue = { column: unknown; order?: 'asc' | 'desc' }; +type OrderByValue = { column: string; order?: 'asc' | 'desc' }; + +const COL_STRAPI_ROW_NUMBER = '__strapi_row_number'; +const COL_STRAPI_ORDER_BY_PREFIX = '__strapi_order_by'; export const processOrderBy = (orderBy: OrderBy, ctx: OrderByCtx): OrderByValue[] => { const { db, uid, qb, alias } = ctx; @@ -67,3 +71,154 @@ export const processOrderBy = (orderBy: OrderBy, ctx: OrderByCtx): OrderByValue[ throw new Error('Invalid orderBy syntax'); }; + +export const getStrapiOrderColumnAlias = (column: string) => { + const trimmedColumnName = column.replaceAll('.', '_'); + + return `${COL_STRAPI_ORDER_BY_PREFIX}__${trimmedColumnName}`; +}; + +/** + * Wraps the original Knex query with deep sorting functionality. + * + * The function takes an original query and an OrderByCtx object as parameters and returns a new Knex query with deep sorting applied. + */ +export const wrapWithDeepSort = (originalQuery: knex.Knex.QueryBuilder, ctx: OrderByCtx) => { + /** + * Notes: + * - The generated query has the following flow: baseQuery (filtered unsorted data) -> T (partitioned/sorted data) --> resultQuery (distinct, paginated, sorted data) + * - Pagination and selection are transferred from the original query to the outer one to avoid pruning rows too early + * - Filtering (where) has to be done in the deepest sub query possible to avoid processing invalid rows and corrupting the final results + * - We assume that all necessary joins are done in the original query (`originalQuery`), and every needed column is available with the right name and alias. + */ + + const { db, qb, uid } = ctx; + + const { tableName } = db.metadata.get(uid); + + // The orderBy is cloned to avoid unwanted mutations of the original object + const orderBy = _.cloneDeep(qb.state.orderBy); + + // 0. Init a new Knex query instance (referenced as resultQuery) using the DB connection + // The connection reuse the original table name (aliased if needed) + const resultQueryAlias = qb.getAlias(); + const aliasedTableName = qb.mustUseAlias() ? alias(resultQueryAlias, tableName) : tableName; + + const resultQuery = db.getConnection(aliasedTableName); + + // 1. Clone the original query to create the sub-query (referenced as baseQuery) and avoid any mutation on the initial object + const baseQuery = originalQuery.clone(); + const baseQueryAlias = qb.getAlias(); + + // Clear unwanted statements from the sub-query 'baseQuery' + // Note: `first()` is cleared through the combination of `baseQuery.clear('limit')` and calling `baseQuery.select(...)` again + // Note: Those statements will be re-applied when duplicates are removed from the final selection + baseQuery + // Columns selection + .clear('select') + // Pagination and sorting + .clear('order') + .clear('limit') + .clear('offset'); + + // Override the initial select and return only the columns needed for the partitioning. + baseQuery.select( + // Always select the row id for future manipulation + prefix(qb.alias, 'id'), + // Select every column used in an order by clause, but alias it for future reference + // i.e. if t2.name is present in an order by clause: + // Then, "t2.name" will become "t2.name as __strapi_order_by__t2_name" + ...orderBy.map((orderByClause) => + alias(getStrapiOrderColumnAlias(orderByClause.column), orderByClause.column) + ) + ); + + // 2. Create a sub-query callback to extract and sort the partitions using row number + const partitionedQueryAlias = qb.getAlias(); + + const selectRowsAsNumberedPartitions = (partitionedQuery: knex.Knex.QueryBuilder) => { + // Transform order by clause to their alias to reference them from baseQuery + const prefixedOrderBy = orderBy.map((orderByClause) => ({ + column: prefix(baseQueryAlias, getStrapiOrderColumnAlias(orderByClause.column)), + order: orderByClause.order, + })); + + // partitionedQuery select must contain every column used for sorting + const orderByColumns = prefixedOrderBy.map(_.prop('column')); + + partitionedQuery + .select( + // Always select baseQuery.id + prefix(baseQueryAlias, 'id'), + // Sort columns + ...orderByColumns + ) + // The row number is used to assign an index to every row in every partition + .rowNumber(COL_STRAPI_ROW_NUMBER, (subQuery) => { + for (const orderByClause of prefixedOrderBy) { + subQuery.orderBy(orderByClause.column, orderByClause.order, 'last'); + } + + // And each partition/group is created based on baseQuery.id + subQuery.partitionBy(`${baseQueryAlias}.id`); + }) + .from(baseQuery.as(baseQueryAlias)) + .as(partitionedQueryAlias); + }; + + // 3. Create the final resultQuery query, that select and sort the wanted data using T + + const originalSelect = _.difference( + qb.state.select, + // Remove order by columns from the initial select + qb.state.orderBy.map(_.prop('column')) + ) + // Alias everything in resultQuery + .map(prefix(resultQueryAlias)); + + resultQuery + .select(originalSelect) + // Join T to resultQuery to access sorted data + // Notes: + // - Only select the first row for each partition + // - Since we're applying the "where" statement directly on baseQuery (and not on resultQuery), we're using an inner join to avoid unwanted rows + .innerJoin(selectRowsAsNumberedPartitions, function () { + this + // Only select rows that are returned by T + .on(`${partitionedQueryAlias}.id`, `${resultQueryAlias}.id`) + // By only selecting the rows number equal to 1, we make sure we don't have duplicate, and that + // we're selecting rows in the correct order amongst the groups created by the "partition by" + .andOnVal(`${partitionedQueryAlias}.${COL_STRAPI_ROW_NUMBER}`, '=', 1); + }); + + // Re-apply pagination params + + if (qb.state.limit) { + resultQuery.limit(qb.state.limit); + } + + if (qb.state.offset) { + resultQuery.offset(qb.state.offset); + } + + if (qb.state.first) { + resultQuery.first(); + } + + // Re-apply the sort using T values + resultQuery.orderBy([ + // Transform "order by" clause to their T alias and prefix them with T alias + ...orderBy.map((orderByClause) => ({ + column: prefix(partitionedQueryAlias, getStrapiOrderColumnAlias(orderByClause.column)), + order: orderByClause.order, + })), + // Add T.id to the order by clause to get consistent results in case several rows have the exact same order + { column: `${partitionedQueryAlias}.id`, order: 'asc' }, + ]); + + return resultQuery; +}; + +// Utils +const alias = _.curry((alias: string, value: string) => `${value} as ${alias}`); +const prefix = _.curry((prefix: string, value: string) => `${prefix}.${value}`); diff --git a/packages/core/database/src/query/helpers/streams/readable.ts b/packages/core/database/src/query/helpers/streams/readable.ts index e392173534..0f50af9207 100644 --- a/packages/core/database/src/query/helpers/streams/readable.ts +++ b/packages/core/database/src/query/helpers/streams/readable.ts @@ -92,7 +92,7 @@ class ReadableStrapiQuery extends Readable { * Custom ._read() implementation * * NOTE: Here "size" means the number of entities to be read from the database. - * Not the actual byte size, as it would means that we need to return partial entities. + * Not the actual byte size, as it would mean that we need to return partial entities. * */ async _read(size: number) { @@ -147,7 +147,7 @@ class ReadableStrapiQuery extends Readable { const { populate } = this._qb.state; - // Apply populate if needed + // Applies the populate if needed if (populate) { await applyPopulate(results, populate, { qb: this._qb, uid: this._uid, db: this._db }); } diff --git a/packages/core/database/src/query/query-builder.ts b/packages/core/database/src/query/query-builder.ts index 1d3fd846ea..d9438c278e 100644 --- a/packages/core/database/src/query/query-builder.ts +++ b/packages/core/database/src/query/query-builder.ts @@ -1,13 +1,13 @@ -import _ from 'lodash/fp'; import type { Knex } from 'knex'; - -import { DatabaseError } from '../errors'; -import * as helpers from './helpers'; -import { transactionCtx } from '../transaction-context'; -import type { Join } from './helpers/join'; +import _ from 'lodash/fp'; import type { Database } from '..'; + +import { DatabaseError } from '../errors'; +import { transactionCtx } from '../transaction-context'; import { isKnexQuery } from '../utils/knex'; +import * as helpers from './helpers'; +import type { Join } from './helpers/join'; interface State { type: 'select' | 'insert' | 'update' | 'delete' | 'count' | 'max' | 'truncate'; @@ -38,48 +38,86 @@ interface State { export interface QueryBuilder { alias: string; state: State; + raw: Knex.RawBuilder; + getAlias(): string; + clone(): QueryBuilder; + select(args: string | Array): QueryBuilder; + addSelect(args: string | string[]): QueryBuilder; + insert | Record[]>( data: TData ): QueryBuilder; + onConflict(args: any): QueryBuilder; + merge(args: any): QueryBuilder; + ignore(): QueryBuilder; + delete(): QueryBuilder; + ref(name: string): any; + update>(data: TData): QueryBuilder; + increment(column: string, amount?: number): QueryBuilder; + decrement(column: string, amount?: number): QueryBuilder; + count(count?: string): QueryBuilder; + max(column: string): QueryBuilder; + where(where?: object): QueryBuilder; + limit(limit: number): QueryBuilder; + offset(offset: number): QueryBuilder; + orderBy(orderBy: any): QueryBuilder; + groupBy(groupBy: any): QueryBuilder; + populate(populate: any): QueryBuilder; + search(query: string): QueryBuilder; + transacting(transaction: any): QueryBuilder; + forUpdate(): QueryBuilder; + init(params?: any): QueryBuilder; + filters(filters: any): void; + first(): QueryBuilder; + join(join: any): QueryBuilder; + mustUseAlias(): boolean; aliasColumn(key: any, alias?: string): any; - raw: Knex.RawBuilder; shouldUseSubQuery(): boolean; + runSubQuery(): any; + processState(): void; + shouldUseDistinct(): boolean; + + shouldUseDeepSort(): boolean; + processSelect(): void; + getKnexQuery(): Knex.QueryBuilder; + execute(options?: { mapResults?: boolean }): Promise; + stream(options?: { mapResults?: boolean }): helpers.ReadableQuery; } @@ -408,6 +446,34 @@ const createQueryBuilder = ( return state.joins.length > 0 && _.isEmpty(state.groupBy); }, + shouldUseDeepSort() { + return ( + state.orderBy + .filter(({ column }) => column.indexOf('.') >= 0) + .filter(({ column }) => { + const col = column.split('.'); + + for (let i = 0; i < col.length - 1; i += 1) { + const el = col[i]; + + // order by "rel"."xxx" + const isRelationAttribute = meta.attributes[el]?.type === 'relation'; + + // order by "t2"."xxx" + const isAliasedRelation = Object.values(state.joins) + .map((join) => join.alias) + .includes(el); + + if (isRelationAttribute || isAliasedRelation) { + return true; + } + } + + return false; + }).length > 0 + ); + }, + processSelect() { state.select = state.select.map((field) => { if (isKnexQuery(field)) { @@ -556,6 +622,10 @@ const createQueryBuilder = ( helpers.applyJoins(qb, state.joins); } + if (this.shouldUseDeepSort()) { + return helpers.wrapWithDeepSort(qb, { qb: this, db, uid }); + } + return qb; }, diff --git a/tests/api/core/content-manager/api/number-of-draft-relations.test.api.js b/tests/api/core/content-manager/api/number-of-draft-relations.test.api.js index e29caad9be..fd9a68c28c 100644 --- a/tests/api/core/content-manager/api/number-of-draft-relations.test.api.js +++ b/tests/api/core/content-manager/api/number-of-draft-relations.test.api.js @@ -465,32 +465,36 @@ describe('CM API - Number of draft relations', () => { const categoryIds = categories.map(({ body: { data } }) => data.id); - const products = await Promise.all([ - rq({ - method: 'POST', - url: `/content-manager/collection-types/${UID_PRODUCT}`, - body: { - name: 'New Product 1', - categories: [categoryIds[0]], - }, - }), - rq({ - method: 'POST', - url: `/content-manager/collection-types/${UID_PRODUCT}`, - body: { - name: 'New Product 2', - categories: [categoryIds[1], categoryIds[0]], - }, - }), - rq({ - method: 'POST', - url: `/content-manager/collection-types/${UID_PRODUCT}`, - body: { - name: 'New Product 3', - categories: [categoryIds[2]], - }, - }), - ]); + const p1 = await rq({ + method: 'POST', + url: `/content-manager/collection-types/${UID_PRODUCT}`, + body: { + name: 'New Product 1', + categories: [categoryIds[0]], + }, + }); + + // Given products have a oneToMany relation with categories, adding categoryIds[0] here // steals the relation from p1. Hence why we are expecting totalDraftRelations to equal 3 below + + const p2 = await rq({ + method: 'POST', + url: `/content-manager/collection-types/${UID_PRODUCT}`, + body: { + name: 'New Product 2', + categories: [categoryIds[1], categoryIds[0]], + }, + }); + + const p3 = await rq({ + method: 'POST', + url: `/content-manager/collection-types/${UID_PRODUCT}`, + body: { + name: 'New Product 3', + categories: [categoryIds[2]], + }, + }); + + const products = [p1, p2, p3]; const productIds = products.map(({ body: { data } }) => data.documentId); diff --git a/tests/api/core/strapi/api/sort/sort.test.api.ts b/tests/api/core/strapi/api/sort/sort.test.api.ts new file mode 100644 index 0000000000..b5ceb6f32e --- /dev/null +++ b/tests/api/core/strapi/api/sort/sort.test.api.ts @@ -0,0 +1,402 @@ +'use strict'; + +import type { Core } from '@strapi/strapi'; + +import { createTestBuilder } from 'api-tests/builder'; +import { createContentAPIRequest } from 'api-tests/request'; +import { createStrapiInstance } from 'api-tests/strapi'; + +const builder = createTestBuilder(); + +let strapi: Core.Strapi; +let data; +let rq; + +const cat = (letter: string) => { + return data.category.find((c) => c.name.toLowerCase().endsWith(letter)); +}; + +const article = (letter: string) => { + return data.article.find((a) => a.title.toLowerCase().endsWith(letter)); +}; + +const expectArticle = (letter: string) => { + const { id, title } = article(letter); + + return { + id, + title, + locale: 'en', + documentId: expect.any(String), + publishedAt: expect.anything(), + updatedAt: expect.anything(), + createdAt: expect.anything(), + }; +}; + +const schemas = { + contentTypes: { + tag: { + options: { + populateCreatorFields: true, + }, + attributes: { + name: { + type: 'string', + }, + }, + displayName: 'Tag', + singularName: 'tag', + pluralName: 'tags', + description: '', + collectionName: '', + }, + category: { + options: { + populateCreatorFields: true, + }, + attributes: { + name: { + type: 'string', + }, + tags: { + type: 'relation', + relation: 'oneToMany', + target: 'api::tag.tag', + }, + }, + displayName: 'Categories', + singularName: 'category', + pluralName: 'categories', + description: '', + collectionName: '', + }, + article: { + options: { + populateCreatorFields: true, + }, + attributes: { + title: { + type: 'string', + }, + categories: { + type: 'relation', + relation: 'oneToMany', + target: 'api::category.category', + }, + primary: { + type: 'relation', + relation: 'oneToOne', + target: 'api::category.category', + }, + relatedArticles: { + type: 'relation', + relation: 'manyToMany', + target: 'api::article.article', + }, + }, + displayName: 'Article', + singularName: 'article', + pluralName: 'articles', + description: '', + collectionName: '', + }, + }, +}; + +const fixtures = { + category: (fixtures) => [ + { + name: 'Category A', + locale: 'en', + tags: fixtures.tag.filter((tag) => tag.name.endsWith('B')).map((cat) => cat.id), + }, + { + name: 'Category C', + locale: 'en', + tags: fixtures.tag + .filter((tag) => tag.name.endsWith('D') || tag.name.endsWith('A')) + .map((cat) => cat.id), + }, + { + name: 'Category B', + locale: 'en', + tags: fixtures.tag.filter((tag) => tag.name.endsWith('C')).map((cat) => cat.id), + }, + { + name: 'Category D', + locale: 'en', + tags: fixtures.tag.filter((tag) => tag.name.endsWith('A')).map((cat) => cat.id), + }, + ], + tag: [{ name: 'Tag A' }, { name: 'Tag B' }, { name: 'Tag C' }, { name: 'Tag D' }], + articles(fixtures) { + return [ + { + title: 'Article A', + locale: 'en', + categories: fixtures.category.filter((cat) => cat.name.endsWith('B')).map((cat) => cat.id), + }, + { + title: 'Article C', + locale: 'en', + categories: fixtures.category.filter((cat) => cat.name.endsWith('D')).map((cat) => cat.id), + }, + { + title: 'Article D', + locale: 'en', + categories: fixtures.category + .filter((cat) => cat.name.endsWith('A') || cat.name.endsWith('D')) + .map((cat) => cat.id), + }, + { + title: 'Article B', + locale: 'en', + categories: fixtures.category + .filter((cat) => cat.name.endsWith('C') || cat.name.endsWith('D')) + .map((cat) => cat.id), + }, + ]; + }, +}; + +/** + * Article(A) -> Categories(B) + * Article(B) -> Categories(C, D) + * Article(C) -> Categories(D) + * Article(D) -> Categories(A, D) + * + * Category(A) -> Tags(B) + * Category(B) -> Tags(C) + * Category(C) -> Tags(A, D) + * Category(D) -> Tags(A) + * + * 1 - Article(A) -> Categories(B) -> Tags(C) + * 4 - Article(B) -> Categories(C, D) -> Tags(A, D) + * 2 - Article(C) -> Categories(D) -> Tags(A) + * 3 - Article(D) -> Categories(A, D) -> Tags(A, B) + */ +describe('Sort', () => { + beforeAll(async () => { + await builder + .addContentTypes(Object.values(schemas.contentTypes)) + .addFixtures(schemas.contentTypes.tag.singularName, fixtures.tag) + .addFixtures(schemas.contentTypes.category.singularName, fixtures.category) + .addFixtures(schemas.contentTypes.article.singularName, fixtures.articles) + .build(); + + strapi = await createStrapiInstance(); + rq = createContentAPIRequest({ strapi }); + data = await builder.sanitizedFixtures(strapi); + }); + + afterAll(async () => { + await strapi.destroy(); + await builder.cleanup(); + }); + + test('Regular sort', async () => { + const res = await rq.get(`/${schemas.contentTypes.article.pluralName}`, { + qs: { sort: 'title' }, + }); + + expect(res.status).toBe(200); + expect(res.body.data.length).toBe(4); + + expect(res.body.data).toMatchObject([ + expectArticle('a'), + expectArticle('b'), + expectArticle('c'), + expectArticle('d'), + ]); + }); + + test('Deep Sort (1st level)', async () => { + const res = await rq.get(`/${schemas.contentTypes.article.pluralName}`, { + qs: { sort: 'categories.name', populate: 'categories' }, + }); + + expect(res.status).toBe(200); + expect(res.body.data.length).toBe(4); + + expect(res.body.data).toMatchObject([ + { ...expectArticle('d'), categories: [cat('a'), cat('d')] }, + { ...expectArticle('a'), categories: [cat('b')] }, + { ...expectArticle('b'), categories: [cat('c'), cat('d')] }, + { ...expectArticle('c'), categories: [cat('d')] }, + ]); + }); + + test('Deep Sort (2nd level)', async () => { + const res = await rq.get(`/${schemas.contentTypes.article.pluralName}`, { + qs: { sort: 'categories.tags.name', populate: 'categories.tags' }, + }); + + expect(res.status).toBe(200); + expect(res.body.data.length).toBe(4); + + expect(res.body.data).toMatchObject([ + { ...expectArticle('c'), categories: [cat('d')] }, + { ...expectArticle('d'), categories: [cat('a'), cat('d')] }, + { ...expectArticle('b'), categories: [cat('c'), cat('d')] }, + { ...expectArticle('a'), categories: [cat('b')] }, + ]); + }); + + test('Deep sort (2nd level) + Regular sort', async () => { + const res = await rq.get(`/${schemas.contentTypes.article.pluralName}`, { + qs: { sort: ['categories.name:desc', 'title:asc'], populate: 'categories' }, + }); + + expect(res.status).toBe(200); + expect(res.body.data.length).toBe(4); + + expect(res.body.data).toMatchObject([ + { ...expectArticle('b'), categories: [cat('c'), cat('d')] }, + { ...expectArticle('c'), categories: [cat('d')] }, + { ...expectArticle('d'), categories: [cat('a'), cat('d')] }, + { ...expectArticle('a'), categories: [cat('b')] }, + ]); + }); + + test('2 Deep Sort (2nd level + 1st level)', async () => { + const res = await rq.get(`/${schemas.contentTypes.article.pluralName}`, { + qs: { sort: ['categories.tags.name', 'categories.name'], populate: 'categories.tags' }, + }); + + expect(res.status).toBe(200); + expect(res.body.data.length).toBe(4); + + expect(res.body.data).toMatchObject([ + { ...expectArticle('d'), categories: [cat('a'), cat('d')] }, + { ...expectArticle('b'), categories: [cat('c'), cat('d')] }, + { ...expectArticle('c'), categories: [cat('d')] }, + { ...expectArticle('a'), categories: [cat('b')] }, + ]); + }); + + test('Deep sort (2st level) + Pagination (start/limit)', async () => { + const res = await rq.get(`/${schemas.contentTypes.article.pluralName}`, { + qs: { + sort: 'categories.tags.name', + pagination: { start: 1, limit: 2 }, + populate: 'categories.tags', + }, + }); + + expect(res.status).toBe(200); + expect(res.body.data.length).toBe(2); + + expect(res.body.data).toMatchObject([ + { ...expectArticle('d'), categories: [cat('a'), cat('d')] }, + { ...expectArticle('b'), categories: [cat('c'), cat('d')] }, + ]); + }); + + test('Deep sort (1st level) + Pagination (page/pageSize)', async () => { + const pageSize = 3; + + const page1 = await rq.get(`/${schemas.contentTypes.article.pluralName}`, { + qs: { sort: 'categories.name', populate: 'categories', pagination: { pageSize, page: 1 } }, + }); + + const page2 = await rq.get(`/${schemas.contentTypes.article.pluralName}`, { + qs: { sort: 'categories.name', populate: 'categories', pagination: { pageSize, page: 2 } }, + }); + + expect(page1.status).toBe(200); + expect(page1.body.data.length).toBe(3); + + expect(page2.status).toBe(200); + expect(page2.body.data.length).toBe(1); + + // Page 1 + expect(page1.body.data).toMatchObject([ + { ...expectArticle('d'), categories: [cat('a'), cat('d')] }, + { ...expectArticle('a'), categories: [cat('b')] }, + { ...expectArticle('b'), categories: [cat('c'), cat('d')] }, + ]); + + expect(page1.body.meta).toMatchObject({ + pagination: { page: 1, pageSize, pageCount: 2, total: 4 }, + }); + + // Page 2 + expect(page2.body.data).toMatchObject([{ ...expectArticle('c'), categories: [cat('d')] }]); + + expect(page2.body.meta).toMatchObject({ + pagination: { page: 2, pageSize, pageCount: 2, total: 4 }, + }); + }); + + test('Deep sort (1st level) + Filters', async () => { + const res = await rq.get(`/${schemas.contentTypes.article.pluralName}`, { + qs: { + sort: ['categories.name:ASC', 'title:DESC'], + filters: { title: { $ne: 'Article B' } }, + }, + }); + + expect(res.body.data).toMatchObject([ + { ...expectArticle('d') }, + { ...expectArticle('a') }, + { ...expectArticle('c') }, + ]); + }); + + // This one will fail because we don't support deep sort with deep filter + // The where and orderBy will be applied to two different joins (instead of a single one), impacting the results + test.skip('Deep sort (1st level) + Deep filters (1st level)', async () => { + const res = await rq.get(`/${schemas.contentTypes.article.pluralName}`, { + qs: { + sort: ['categories.name:ASC', 'title:DESC'], + filters: { categories: { name: { $ne: 'Category C' } } }, + }, + }); + + expect(res.body.data).toMatchObject([ + { ...expectArticle('d') }, + { ...expectArticle('a') }, + { ...expectArticle('c') }, + { ...expectArticle('b') }, + ]); + }); + + test('Update + Deep sort (1st level) should ignore the sort', async () => { + const articleToModify = article('a'); + + const res = await rq.put( + `/${schemas.contentTypes.article.pluralName}/${articleToModify.documentId}`, + { + body: { data: { primary: cat('d').id } }, + qs: { + filter: { title: articleToModify.title }, + sort: 'categories.name', + populate: 'categories', + }, + } + ); + + expect(res.status).toBe(200); + + expect(res.body.data).toMatchObject({ ...expectArticle('a'), categories: [cat('b')] }); + }); + + test('Delete + Deep sort (1st level) should ignore the sort', async () => { + const articleToDelete = article('a'); + + const res = await rq.delete( + `/${schemas.contentTypes.article.pluralName}/${articleToDelete.documentId}`, + { + qs: { + filter: { title: articleToDelete.title }, + sort: 'categories.name', + populate: 'categories', + }, + } + ); + + expect(res.status).toBe(204); + expect(res.body.data).toBeUndefined(); + }); +}); diff --git a/tests/api/core/strapi/deep-filtering.test.api.js b/tests/api/core/strapi/deep-filtering.test.api.js index 235e479df1..a22663de72 100644 --- a/tests/api/core/strapi/deep-filtering.test.api.js +++ b/tests/api/core/strapi/deep-filtering.test.api.js @@ -222,12 +222,12 @@ describe('Deep Filtering API', () => { $and: [ { name: { - $contains: 'HUGO', + $containsi: 'HUGO', }, }, { name: { - $contains: 'LLORIS', + $containsi: 'LLORIS', }, }, ], diff --git a/tests/api/core/strapi/document-service/events.test.api.ts b/tests/api/core/strapi/document-service/events.test.api.ts index 1ca9f5c870..36c6bcef72 100644 --- a/tests/api/core/strapi/document-service/events.test.api.ts +++ b/tests/api/core/strapi/document-service/events.test.api.ts @@ -3,9 +3,8 @@ import { omit } from 'lodash/fp'; import type { Core } from '@strapi/types'; import { createTestSetup, destroyTestSetup } from '../../../utils/builder-helper'; -import { testInTransaction } from '../../../utils/index'; import resources from './resources/index'; -import { ARTICLE_UID, findArticlesDb, AUTHOR_UID } from './utils'; +import { ARTICLE_UID } from './utils'; // Data to create a new article const articleData = { diff --git a/tests/api/core/strapi/document-service/resources/fixtures/article.js b/tests/api/core/strapi/document-service/resources/fixtures/article.js new file mode 100644 index 0000000000..ce9d9eceb9 --- /dev/null +++ b/tests/api/core/strapi/document-service/resources/fixtures/article.js @@ -0,0 +1,61 @@ +'use strict'; + +module.exports = (fixtures) => { + const category = (name) => { + const categoryID = fixtures.category.find((cat) => cat.name === name)?.id; + + if (!categoryID) { + throw new Error(`Invalid fixture category '${name}': not found`); + } + + return categoryID; + }; + + return [ + { + documentId: 'Article1', + title: 'Article1-Draft-EN', + publishedAt: null, + password: '$2a$10$4EP.Y8crWYRpfk2rVmmoce8raDqGYVwMlcI//GDQdO6z06bO50igu', + private: 'private', + locale: 'en', + categories: [category('Cat1-EN')], + }, + { + documentId: 'Article2', + title: 'Article2-Draft-EN', + publishedAt: null, + password: null, + private: 'private', + locale: 'en', + categories: [], + }, + { + documentId: 'Article1', + title: 'Article1-Draft-NL', + publishedAt: null, + password: null, + private: 'private', + locale: 'nl', + categories: [category('Cat1-NL')], + }, + { + documentId: 'Article1', + title: 'Article1-Draft-IT', + publishedAt: null, + password: null, + private: 'private', + locale: 'it', + categories: [category('Cat1-IT')], + }, + { + documentId: 'Article2', + title: 'Article2-Published-EN', + publishedAt: '2019-01-01T00:00:00.000Z', + password: null, + private: 'private', + locale: 'en', + categories: [], + }, + ]; +}; diff --git a/tests/api/core/strapi/document-service/resources/fixtures/article.json b/tests/api/core/strapi/document-service/resources/fixtures/article.json deleted file mode 100644 index d4f6a29db3..0000000000 --- a/tests/api/core/strapi/document-service/resources/fixtures/article.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "id": 1, - "documentId": "Article1", - "title": "Article1-Draft-EN", - "publishedAt": null, - "password": "$2a$10$4EP.Y8crWYRpfk2rVmmoce8raDqGYVwMlcI//GDQdO6z06bO50igu", - "private": "private", - "locale": "en", - "categories": [1] - }, - { - "id": 2, - "documentId": "Article2", - "title": "Article2-Draft-EN", - "publishedAt": null, - "password": null, - "private": "private", - "locale": "en", - "categories": [] - }, - { - "id": 3, - "documentId": "Article1", - "title": "Article1-Draft-NL", - "publishedAt": null, - "password": null, - "private": "private", - "locale": "nl", - "categories": [2] - }, - { - "id": 4, - "documentId": "Article1", - "title": "Article1-Draft-IT", - "publishedAt": null, - "password": null, - "private": "private", - "locale": "it", - "categories": [3] - }, - { - "id": 25, - "documentId": "Article2", - "title": "Article2-Published-EN", - "publishedAt": "2019-01-01T00:00:00.000Z", - "password": null, - "private": "private", - "locale": "en", - "categories": [] - } -] diff --git a/tests/api/core/strapi/document-service/resources/fixtures/author.js b/tests/api/core/strapi/document-service/resources/fixtures/author.js new file mode 100644 index 0000000000..570445b6d4 --- /dev/null +++ b/tests/api/core/strapi/document-service/resources/fixtures/author.js @@ -0,0 +1,16 @@ +'use strict'; + +module.exports = [ + { + documentId: 'Author1', + name: 'Author1-Draft', + publishedAt: null, + locale: null, + }, + { + documentId: 'Author2', + name: 'Author2-Draft', + publishedAt: null, + locale: null, + }, +]; diff --git a/tests/api/core/strapi/document-service/resources/fixtures/author.json b/tests/api/core/strapi/document-service/resources/fixtures/author.json deleted file mode 100644 index 1b6b31ebb8..0000000000 --- a/tests/api/core/strapi/document-service/resources/fixtures/author.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "id": 1, - "documentId": "Author1", - "name": "Author1-Draft", - "publishedAt": null, - "locale": null - }, - { - "id": 2, - "documentId": "Author2", - "name": "Author2-Draft", - "publishedAt": null, - "locale": null - } -] diff --git a/tests/api/core/strapi/document-service/resources/fixtures/category.js b/tests/api/core/strapi/document-service/resources/fixtures/category.js new file mode 100644 index 0000000000..02bfa4c6c2 --- /dev/null +++ b/tests/api/core/strapi/document-service/resources/fixtures/category.js @@ -0,0 +1,28 @@ +'use strict'; + +module.exports = [ + { + documentId: 'Cat1', + name: 'Cat1-EN', + publishedAt: null, + locale: 'en', + }, + { + documentId: 'Cat1', + name: 'Cat1-NL', + publishedAt: null, + locale: 'nl', + }, + { + documentId: 'Cat1', + name: 'Cat1-IT', + publishedAt: null, + locale: 'it', + }, + { + documentId: 'Cat2', + name: 'Cat2-EN', + publishedAt: null, + locale: 'en', + }, +]; diff --git a/tests/api/core/strapi/document-service/resources/fixtures/category.json b/tests/api/core/strapi/document-service/resources/fixtures/category.json deleted file mode 100644 index 991af04fcd..0000000000 --- a/tests/api/core/strapi/document-service/resources/fixtures/category.json +++ /dev/null @@ -1,30 +0,0 @@ -[ - { - "id": 1, - "documentId": "Cat1", - "name": "Cat1-EN", - "publishedAt": null, - "locale": "en" - }, - { - "id": 2, - "documentId": "Cat1", - "name": "Cat1-NL", - "publishedAt": null, - "locale": "nl" - }, - { - "id": 3, - "documentId": "Cat1", - "name": "Cat1-IT", - "publishedAt": null, - "locale": "it" - }, - { - "id": 4, - "documentId": "Cat2", - "name": "Cat2-EN", - "publishedAt": null, - "locale": "en" - } -] diff --git a/tests/api/core/strapi/document-service/resources/fixtures/index.js b/tests/api/core/strapi/document-service/resources/fixtures/index.js index 2be48d0281..fbc2b23ab7 100644 --- a/tests/api/core/strapi/document-service/resources/fixtures/index.js +++ b/tests/api/core/strapi/document-service/resources/fixtures/index.js @@ -3,8 +3,8 @@ module.exports = { 'content-types': { // Make sure this is sorted by order to create them - 'api::category.category': require('./category.json'), - 'api::article.article': require('./article.json'), - 'api::author.author': require('./author.json'), + 'api::category.category': require('./category'), + 'api::article.article': require('./article'), + 'api::author.author': require('./author'), }, }; diff --git a/tests/api/core/strapi/document-service/utils/index.ts b/tests/api/core/strapi/document-service/utils/index.ts index 81debb04a9..07468b4d05 100644 --- a/tests/api/core/strapi/document-service/utils/index.ts +++ b/tests/api/core/strapi/document-service/utils/index.ts @@ -1,19 +1,16 @@ -import { Attribute, Entity } from '@strapi/strapi'; +import type { Schema, Data } from '@strapi/strapi'; -export const AUTHOR_UID = 'api::author.author'; -export type Author = Attribute.GetAll & { documentId: string; id: number }; +export const AUTHOR_UID = 'api::author.author' as const; +export type Author = Data.ContentType; -export const ARTICLE_UID = 'api::article.article'; -export type Article = Attribute.GetAll & { documentId: string; id: number }; +export const ARTICLE_UID = 'api::article.article' as const; +export type Article = Data.ContentType; -export const CATEGORY_UID = 'api::category.category'; -export type Category = Attribute.GetValues< +export const CATEGORY_UID = 'api::category.category' as const; +export type Category = Data.ContentType< typeof CATEGORY_UID, - Attribute.GetNonPopulatableKeys -> & { - documentId?: string; - id?: Entity.ID; -}; + Schema.NonPopulatableAttributeNames +>; export const findArticleDb = async (where: any) => { return strapi.db.query(ARTICLE_UID).findOne({ where }) as Article | undefined; From 3aee925501e1311b46ac972ab5705e88a27b8fff Mon Sep 17 00:00:00 2001 From: Alexandre Bodin Date: Thu, 20 Jun 2024 12:21:02 +0200 Subject: [PATCH 19/78] fix: several media lib ui issues fix: using open prop does not clear any state and create a lot of bugs fix: crop --- .../admin/src/components/ConfirmDialog.tsx | 6 +- .../Settings/pages/Webhooks/ListPage.tsx | 2 +- .../AssetDialog/BrowseStep/index.jsx | 6 +- .../tests/__snapshots__/index.test.jsx.snap | 2 +- .../src/components/AssetDialog/index.jsx | 10 ++- .../PreviewBox/CroppingActions.jsx | 5 +- .../EditAssetDialog/PreviewBox/components.jsx | 3 +- .../EditAssetDialog/RemoveAssetDialog.jsx | 7 +- .../EditAssetDialog.test.jsx.snap | 3 +- .../tests/__snapshots__/index.test.jsx.snap | 3 +- .../components/MediaLibraryInput/index.jsx | 66 ++++++++++--------- .../src/components/SelectTree/SelectTree.jsx | 9 +-- .../PendingAssetStep/PendingAssetStep.jsx | 6 +- .../UploadAssetDialog/UploadAssetDialog.jsx | 20 +++--- .../src/pages/App/ConfigureTheView/index.jsx | 2 +- .../App/MediaLibrary/components/Header.jsx | 3 +- .../tests/__snapshots__/Header.test.jsx.snap | 5 +- .../src/pages/App/MediaLibrary/index.jsx | 62 +++++++++-------- .../api/number-of-draft-relations.test.api.js | 2 +- 19 files changed, 129 insertions(+), 93 deletions(-) diff --git a/packages/core/admin/admin/src/components/ConfirmDialog.tsx b/packages/core/admin/admin/src/components/ConfirmDialog.tsx index c80d47fbd2..736edc7236 100644 --- a/packages/core/admin/admin/src/components/ConfirmDialog.tsx +++ b/packages/core/admin/admin/src/components/ConfirmDialog.tsx @@ -8,7 +8,7 @@ import { useIntl } from 'react-intl'; * ConfirmDialog * -----------------------------------------------------------------------------------------------*/ interface ConfirmDialogProps extends Pick, Pick { - onConfirm?: () => Promise | void; + onConfirm?: (e?: React.MouseEvent) => Promise | void; children?: React.ReactNode; endAction?: React.ReactNode; startAction?: React.ReactNode; @@ -66,14 +66,14 @@ const ConfirmDialog = ({ defaultMessage: 'Are you sure?', }); - const handleConfirm = async () => { + const handleConfirm = async (e: React.MouseEvent) => { if (!onConfirm) { return; } try { setIsConfirming(true); - await onConfirm(); + await onConfirm(e); } finally { setIsConfirming(false); } diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.tsx index a6e1d4aa6e..5fb5bf4ee7 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.tsx @@ -309,7 +309,7 @@ const ListPage = () => { {webhook.url} - + e.stopPropagation()}> handleClickFolderCard(folder.id, folder.path)} > - + {folder.name} {/* VisuallyHidden dash here allows to separate folder title and count informations for voice reading structure purpose */} diff --git a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/__snapshots__/index.test.jsx.snap b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/__snapshots__/index.test.jsx.snap index 1f917dcc67..d5774156c0 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/__snapshots__/index.test.jsx.snap +++ b/packages/core/upload/admin/src/components/AssetDialog/BrowseStep/tests/__snapshots__/index.test.jsx.snap @@ -278,7 +278,7 @@ exports[`BrowseStep renders and match snapshot 1`] = ` overflow: hidden; text-overflow: ellipsis; font-weight: 500; - color: currentcolor; + color: #32324d; } .c56 { diff --git a/packages/core/upload/admin/src/components/AssetDialog/index.jsx b/packages/core/upload/admin/src/components/AssetDialog/index.jsx index dd6fa73f47..5f74968066 100644 --- a/packages/core/upload/admin/src/components/AssetDialog/index.jsx +++ b/packages/core/upload/admin/src/components/AssetDialog/index.jsx @@ -214,7 +214,7 @@ export const AssetContent = ({ - 0 ? 'selected' : 'browse'}> + 0 ? 'selected' : 'browse'}> @@ -283,7 +283,7 @@ export const AssetContent = ({ /> - + onValidate(selectedAssets)} /> ); @@ -342,3 +342,9 @@ AssetDialog.propTypes = { onValidate: PropTypes.func.isRequired, trackedLocation: PropTypes.string, }; + +const TabsRoot = styled(Tabs.Root)` + display: flex; + flex-direction: column; + overflow: hidden; +`; diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx index fd12d2dec4..b0cf5bb27e 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx +++ b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/CroppingActions.jsx @@ -4,7 +4,7 @@ import { Flex, FocusTrap, IconButton, Menu } from '@strapi/design-system'; import { Check, Cross } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { styled } from 'styled-components'; +import { styled, useTheme } from 'styled-components'; import getTrad from '../../../utils/getTrad'; @@ -12,6 +12,7 @@ import { CroppingActionRow } from './components'; export const CroppingActions = ({ onCancel, onValidate, onDuplicate }) => { const { formatMessage } = useIntl(); + const theme = useTheme(); return ( @@ -45,7 +46,7 @@ export const CroppingActions = ({ onCancel, onValidate, onDuplicate }) => { fill="#C0C0D0" /> - + {formatMessage({ id: getTrad('checkControl.crop-original'), diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/components.jsx b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/components.jsx index 0f4e7e68bb..d6e87ea2ca 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/components.jsx +++ b/packages/core/upload/admin/src/components/EditAssetDialog/PreviewBox/components.jsx @@ -7,7 +7,8 @@ export const RelativeBox = styled(Box)` export const Wrapper = styled.div` position: relative; - text-align: center; + display: flex; + justify-content: center; background: repeating-conic-gradient( ${({ theme }) => theme.colors.neutral100} 0% 25%, transparent 0% 50% diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/RemoveAssetDialog.jsx b/packages/core/upload/admin/src/components/EditAssetDialog/RemoveAssetDialog.jsx index 702f22fdf0..c4266c1582 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/RemoveAssetDialog.jsx +++ b/packages/core/upload/admin/src/components/EditAssetDialog/RemoveAssetDialog.jsx @@ -8,9 +8,12 @@ import { useRemoveAsset } from '../../hooks/useRemoveAsset'; export const RemoveAssetDialog = ({ open, onClose, asset }) => { // `null` means asset is deleted - const { removeAsset } = useRemoveAsset(() => onClose(null)); + const { removeAsset } = useRemoveAsset(() => { + onClose(null); + }); - const handleConfirm = async () => { + const handleConfirm = async (event) => { + event.preventDefault(); await removeAsset(asset.id); }; diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/EditAssetDialog.test.jsx.snap b/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/EditAssetDialog.test.jsx.snap index a5a9b48313..14b16a02d9 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/EditAssetDialog.test.jsx.snap +++ b/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/EditAssetDialog.test.jsx.snap @@ -485,7 +485,8 @@ exports[` renders and matches the snapshot 1`] = ` .c24 { position: relative; - text-align: center; + display: flex; + justify-content: center; background: repeating-conic-gradient( #f6f6f9 0% 25%, transparent 0% 50% ) 50%/20px 20px; } diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/index.test.jsx.snap b/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/index.test.jsx.snap index 39310ab985..68b3a9863d 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/index.test.jsx.snap +++ b/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/index.test.jsx.snap @@ -485,7 +485,8 @@ exports[` renders and matches the snapshot 1`] = ` .c24 { position: relative; - text-align: center; + display: flex; + justify-content: center; background: repeating-conic-gradient( #f6f6f9 0% 25%, transparent 0% 50% ) 50%/20px 20px; } diff --git a/packages/core/upload/admin/src/components/MediaLibraryInput/index.jsx b/packages/core/upload/admin/src/components/MediaLibraryInput/index.jsx index d1e3baed3a..07f779a509 100644 --- a/packages/core/upload/admin/src/components/MediaLibraryInput/index.jsx +++ b/packages/core/upload/admin/src/components/MediaLibraryInput/index.jsx @@ -179,38 +179,44 @@ export const MediaLibraryInput = forwardRef( trackedLocation="content-manager" /> - { - setStep(undefined); - setFolderId(null); - }} - open={step === STEPS.AssetSelect} - onValidate={handleValidation} - multiple={multiple} - onAddAsset={() => setStep(STEPS.AssetUpload)} - onAddFolder={() => setStep(STEPS.FolderCreate)} - onChangeFolder={(folder) => setFolderId(folder)} - trackedLocation="content-manager" - /> + {step === STEPS.AssetSelect && ( + { + setStep(undefined); + setFolderId(null); + }} + open={step === STEPS.AssetSelect} + onValidate={handleValidation} + multiple={multiple} + onAddAsset={() => setStep(STEPS.AssetUpload)} + onAddFolder={() => setStep(STEPS.FolderCreate)} + onChangeFolder={(folder) => setFolderId(folder)} + trackedLocation="content-manager" + /> + )} - setStep(STEPS.AssetSelect)} - initialAssetsToAdd={droppedAssets} - addUploadedFiles={handleFilesUploadSucceeded} - trackedLocation="content-manager" - folderId={folderId} - validateAssetsTypes={validateAssetsTypes} - /> + {step === STEPS.AssetUpload && ( + setStep(STEPS.AssetSelect)} + initialAssetsToAdd={droppedAssets} + addUploadedFiles={handleFilesUploadSucceeded} + trackedLocation="content-manager" + folderId={folderId} + validateAssetsTypes={validateAssetsTypes} + /> + )} - setStep(STEPS.AssetSelect)} - parentFolderId={folderId} - /> + {step === STEPS.FolderCreate && ( + setStep(STEPS.AssetSelect)} + parentFolderId={folderId} + /> + )} ); } diff --git a/packages/core/upload/admin/src/components/SelectTree/SelectTree.jsx b/packages/core/upload/admin/src/components/SelectTree/SelectTree.jsx index 1a1ad42bb8..4e32f8397f 100644 --- a/packages/core/upload/admin/src/components/SelectTree/SelectTree.jsx +++ b/packages/core/upload/admin/src/components/SelectTree/SelectTree.jsx @@ -199,6 +199,11 @@ const getSelectStyles = (theme, error) => { color: theme.colors.neutral800, gridTemplateColumns: '0 100%', }), + menuPortal: (base) => ({ + ...base, + zIndex: theme.zIndices.dialog, + pointerEvents: 'auto', + }), menu(base) { return { ...base, @@ -220,10 +225,6 @@ const getSelectStyles = (theme, error) => { paddingRight: theme.spaces[1], paddingBottom: theme.spaces[1], }), - menuPortal: (base) => ({ - ...base, - zIndex: 100, - }), option(base, state) { let backgroundColor = base.backgroundColor; diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.jsx b/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.jsx index 2a1f8cd189..85c451b2f5 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.jsx +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.jsx @@ -77,7 +77,7 @@ export const PendingAssetStep = ({ }; return ( -
+ <> {formatMessage({ @@ -159,7 +159,7 @@ export const PendingAssetStep = ({ - - + ); }; diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.jsx b/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.jsx index 93cb557be9..eb3642966d 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.jsx +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/UploadAssetDialog.jsx @@ -93,16 +93,18 @@ export const UploadAssetDialog = ({ return ( - - {step === Steps.AddAsset && ( + {step === Steps.AddAsset && ( + - )} + + )} - {step === Steps.PendingAsset && ( + {step === Steps.PendingAsset && ( + - )} + + )} - {assetToEdit && ( + {assetToEdit && ( + - )} - + + )} ); }; diff --git a/packages/core/upload/admin/src/pages/App/ConfigureTheView/index.jsx b/packages/core/upload/admin/src/pages/App/ConfigureTheView/index.jsx index 0379da844e..90e6fa9556 100644 --- a/packages/core/upload/admin/src/pages/App/ConfigureTheView/index.jsx +++ b/packages/core/upload/admin/src/pages/App/ConfigureTheView/index.jsx @@ -44,7 +44,7 @@ const ConfigureTheView = ({ config }) => { const handleConfirm = async () => { trackUsage('willEditMediaLibraryConfig'); await mutateConfig.mutateAsync(modifiedData); - toggleWarningSubmit(); + setWarningSubmit(false); dispatch(setLoaded()); toggleNotification({ type: 'success', diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Header.jsx b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Header.jsx index 940aa61457..a08985b0e9 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Header.jsx +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/Header.jsx @@ -6,7 +6,7 @@ import { ArrowLeft, Plus } from '@strapi/icons'; import PropTypes from 'prop-types'; import { stringify } from 'qs'; import { useIntl } from 'react-intl'; -import { useLocation } from 'react-router-dom'; +import { useLocation, NavLink } from 'react-router-dom'; import { Breadcrumbs } from '../../../../components/Breadcrumbs'; import { BreadcrumbsDefinition, FolderDefinition } from '../../../../constants'; @@ -51,6 +51,7 @@ export const Header = ({ navigationAction={ folder && ( } to={`${pathname}?${stringify(backQuery, { encode: false })}`} > diff --git a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/__snapshots__/Header.test.jsx.snap b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/__snapshots__/Header.test.jsx.snap index cc7f872b48..faccfe4db0 100644 --- a/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/__snapshots__/Header.test.jsx.snap +++ b/packages/core/upload/admin/src/pages/App/MediaLibrary/components/tests/__snapshots__/Header.test.jsx.snap @@ -262,10 +262,11 @@ exports[`Header renders 1`] = ` class="c1" > { - - - { - // The asset has been deleted - if (editedAsset === null) { - handleAssetDeleted(1); - } + {showUploadAssetDialog && ( + + )} + {showEditFolderDialog && ( + + )} + {assetToEdit && ( + { + // The asset has been deleted + if (editedAsset === null) { + handleAssetDeleted(1); + } - setAssetToEdit(undefined); - }} - open={!!assetToEdit} - asset={assetToEdit} - canUpdate={canUpdate} - canCopyLink={canCopyLink} - canDownload={canDownload} - trackedLocation="upload" - /> + setAssetToEdit(undefined); + }} + open={!!assetToEdit} + asset={assetToEdit} + canUpdate={canUpdate} + canCopyLink={canCopyLink} + canDownload={canDownload} + trackedLocation="upload" + /> + )} ); }; diff --git a/tests/api/core/content-manager/api/number-of-draft-relations.test.api.js b/tests/api/core/content-manager/api/number-of-draft-relations.test.api.js index fd9a68c28c..d245dd8bbd 100644 --- a/tests/api/core/content-manager/api/number-of-draft-relations.test.api.js +++ b/tests/api/core/content-manager/api/number-of-draft-relations.test.api.js @@ -475,7 +475,7 @@ describe('CM API - Number of draft relations', () => { }); // Given products have a oneToMany relation with categories, adding categoryIds[0] here // steals the relation from p1. Hence why we are expecting totalDraftRelations to equal 3 below - + const p2 = await rq({ method: 'POST', url: `/content-manager/collection-types/${UID_PRODUCT}`, From b8b91d16eb2e8f5edeef21fb5b285afbf002819c Mon Sep 17 00:00:00 2001 From: Convly Date: Fri, 21 Jun 2024 10:28:28 +0200 Subject: [PATCH 20/78] chore: v5.0.0-beta.14 --- .github/actions/check-pr-status/package.json | 2 +- examples/experimental-dev/package.json | 6 +- examples/getstarted/package.json | 20 +- examples/kitchensink-ts/package.json | 6 +- examples/kitchensink/package.json | 10 +- .../plugins/workspace-plugin/package.json | 2 +- lerna.json | 2 +- packages/admin-test-utils/package.json | 6 +- packages/cli/create-strapi-app/package.json | 8 +- packages/cli/create-strapi/package.json | 4 +- packages/core/admin/package.json | 14 +- packages/core/content-manager/package.json | 8 +- packages/core/content-releases/package.json | 12 +- .../core/content-type-builder/package.json | 10 +- packages/core/core/package.json | 24 +- packages/core/data-transfer/package.json | 8 +- packages/core/database/package.json | 8 +- packages/core/email/package.json | 10 +- packages/core/permissions/package.json | 8 +- packages/core/review-workflows/package.json | 10 +- packages/core/strapi/package.json | 42 +- packages/core/types/package.json | 14 +- packages/core/upload/package.json | 10 +- packages/core/utils/package.json | 6 +- packages/generators/app/package.json | 2 +- packages/generators/generators/package.json | 10 +- packages/plugins/cloud/package.json | 8 +- packages/plugins/color-picker/package.json | 4 +- packages/plugins/documentation/package.json | 12 +- packages/plugins/graphql/package.json | 12 +- packages/plugins/i18n/package.json | 12 +- packages/plugins/sentry/package.json | 4 +- .../plugins/users-permissions/package.json | 6 +- .../providers/email-amazon-ses/package.json | 8 +- packages/providers/email-mailgun/package.json | 8 +- .../providers/email-nodemailer/package.json | 6 +- .../providers/email-sendgrid/package.json | 8 +- .../providers/email-sendmail/package.json | 8 +- packages/providers/upload-aws-s3/package.json | 6 +- .../providers/upload-cloudinary/package.json | 8 +- packages/providers/upload-local/package.json | 10 +- packages/utils/api-tests/package.json | 2 +- .../utils/eslint-config-custom/package.json | 2 +- packages/utils/logger/package.json | 6 +- packages/utils/tsconfig/package.json | 2 +- packages/utils/typescript/package.json | 2 +- packages/utils/upgrade/package.json | 6 +- scripts/front/package.json | 2 +- yarn.lock | 374 +++++++++--------- 49 files changed, 389 insertions(+), 389 deletions(-) diff --git a/.github/actions/check-pr-status/package.json b/.github/actions/check-pr-status/package.json index d42bef8a8a..e28302d6e2 100644 --- a/.github/actions/check-pr-status/package.json +++ b/.github/actions/check-pr-status/package.json @@ -1,6 +1,6 @@ { "name": "check-pr-status", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "license": "MIT", "main": "dist/index.js", diff --git a/examples/experimental-dev/package.json b/examples/experimental-dev/package.json index 149a01dd8e..231931e939 100644 --- a/examples/experimental-dev/package.json +++ b/examples/experimental-dev/package.json @@ -1,6 +1,6 @@ { "name": "experimental-dev", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "description": "A Strapi application", "license": "MIT", @@ -14,8 +14,8 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/plugin-users-permissions": "5.0.0-beta.13", - "@strapi/strapi": "5.0.0-beta.13", + "@strapi/plugin-users-permissions": "5.0.0-beta.14", + "@strapi/strapi": "5.0.0-beta.14", "better-sqlite3": "9.4.3", "react": "rc", "react-dom": "rc", diff --git a/examples/getstarted/package.json b/examples/getstarted/package.json index 0d3501584f..5cfce218f4 100644 --- a/examples/getstarted/package.json +++ b/examples/getstarted/package.json @@ -1,6 +1,6 @@ { "name": "getstarted", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "description": "A Strapi application.", "license": "SEE LICENSE IN LICENSE", @@ -14,15 +14,15 @@ }, "dependencies": { "@strapi/icons": "2.0.0-beta.6", - "@strapi/plugin-color-picker": "5.0.0-beta.13", - "@strapi/plugin-documentation": "5.0.0-beta.13", - "@strapi/plugin-graphql": "5.0.0-beta.13", - "@strapi/plugin-sentry": "5.0.0-beta.13", - "@strapi/plugin-users-permissions": "5.0.0-beta.13", - "@strapi/provider-email-mailgun": "5.0.0-beta.13", - "@strapi/provider-upload-aws-s3": "5.0.0-beta.13", - "@strapi/provider-upload-cloudinary": "5.0.0-beta.13", - "@strapi/strapi": "5.0.0-beta.13", + "@strapi/plugin-color-picker": "5.0.0-beta.14", + "@strapi/plugin-documentation": "5.0.0-beta.14", + "@strapi/plugin-graphql": "5.0.0-beta.14", + "@strapi/plugin-sentry": "5.0.0-beta.14", + "@strapi/plugin-users-permissions": "5.0.0-beta.14", + "@strapi/provider-email-mailgun": "5.0.0-beta.14", + "@strapi/provider-upload-aws-s3": "5.0.0-beta.14", + "@strapi/provider-upload-cloudinary": "5.0.0-beta.14", + "@strapi/strapi": "5.0.0-beta.14", "better-sqlite3": "9.4.3", "lodash": "4.17.21", "mysql2": "3.9.4", diff --git a/examples/kitchensink-ts/package.json b/examples/kitchensink-ts/package.json index f021029edc..3ae7cedf1d 100644 --- a/examples/kitchensink-ts/package.json +++ b/examples/kitchensink-ts/package.json @@ -1,6 +1,6 @@ { "name": "kitchensink-ts", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "description": "A Strapi application", "license": "MIT", @@ -14,8 +14,8 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/plugin-users-permissions": "5.0.0-beta.13", - "@strapi/strapi": "5.0.0-beta.13", + "@strapi/plugin-users-permissions": "5.0.0-beta.14", + "@strapi/strapi": "5.0.0-beta.14", "better-sqlite3": "9.4.3", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/examples/kitchensink/package.json b/examples/kitchensink/package.json index 65bd4e98e0..86fc694065 100644 --- a/examples/kitchensink/package.json +++ b/examples/kitchensink/package.json @@ -1,6 +1,6 @@ { "name": "kitchensink", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "description": "A Strapi application.", "license": "SEE LICENSE IN LICENSE", @@ -13,10 +13,10 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/provider-email-mailgun": "5.0.0-beta.13", - "@strapi/provider-upload-aws-s3": "5.0.0-beta.13", - "@strapi/provider-upload-cloudinary": "5.0.0-beta.13", - "@strapi/strapi": "5.0.0-beta.13", + "@strapi/provider-email-mailgun": "5.0.0-beta.14", + "@strapi/provider-upload-aws-s3": "5.0.0-beta.14", + "@strapi/provider-upload-cloudinary": "5.0.0-beta.14", + "@strapi/strapi": "5.0.0-beta.14", "better-sqlite3": "9.4.3", "lodash": "4.17.21", "mysql2": "3.9.4", diff --git a/examples/plugins/workspace-plugin/package.json b/examples/plugins/workspace-plugin/package.json index cf2fa90843..5b520b5b4b 100644 --- a/examples/plugins/workspace-plugin/package.json +++ b/examples/plugins/workspace-plugin/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-workspace-plugin", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "description": "This is the description of my plugin.", "exports": { diff --git a/lerna.json b/lerna.json index 64119649ec..3b50cbf442 100644 --- a/lerna.json +++ b/lerna.json @@ -1,4 +1,4 @@ { - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "npmClient": "yarn" } diff --git a/packages/admin-test-utils/package.json b/packages/admin-test-utils/package.json index 098ca7f75e..21a2f824b4 100644 --- a/packages/admin-test-utils/package.json +++ b/packages/admin-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/admin-test-utils", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "description": "Test utilities for the Strapi administration panel", "license": "MIT", @@ -81,9 +81,9 @@ "@reduxjs/toolkit": "1.9.7", "@strapi/pack-up": "5.0.0", "@testing-library/jest-dom": "6.4.5", - "eslint-config-custom": "5.0.0-beta.13", + "eslint-config-custom": "5.0.0-beta.14", "jest-environment-jsdom": "29.6.1", - "tsconfig": "5.0.0-beta.13" + "tsconfig": "5.0.0-beta.14" }, "peerDependencies": { "@reduxjs/toolkit": "^1.9.7", diff --git a/packages/cli/create-strapi-app/package.json b/packages/cli/create-strapi-app/package.json index 3586f934fa..e80e3ad108 100644 --- a/packages/cli/create-strapi-app/package.json +++ b/packages/cli/create-strapi-app/package.json @@ -1,6 +1,6 @@ { "name": "create-strapi-app", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Generate a new Strapi application.", "keywords": [ "create-strapi-app", @@ -43,15 +43,15 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/generate-new": "5.0.0-beta.13", + "@strapi/generate-new": "5.0.0-beta.14", "commander": "8.3.0", "inquirer": "8.2.5" }, "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/inquirer": "8.2.5", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/cli/create-strapi/package.json b/packages/cli/create-strapi/package.json index c53dc3794b..7259f2c9b1 100644 --- a/packages/cli/create-strapi/package.json +++ b/packages/cli/create-strapi/package.json @@ -1,6 +1,6 @@ { "name": "create-strapi", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Generate a new Strapi application.", "keywords": [ "create-strapi", @@ -36,7 +36,7 @@ "bin/" ], "dependencies": { - "create-strapi-app": "5.0.0-beta.13" + "create-strapi-app": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/admin/package.json b/packages/core/admin/package.json index f6738fdb83..44afc154c0 100644 --- a/packages/core/admin/package.json +++ b/packages/core/admin/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/admin", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Strapi Admin", "repository": { "type": "git", @@ -81,10 +81,10 @@ "@reduxjs/toolkit": "1.9.7", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/permissions": "5.0.0-beta.13", - "@strapi/types": "5.0.0-beta.13", - "@strapi/typescript-utils": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/permissions": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.14", + "@strapi/typescript-utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.14", "@testing-library/dom": "10.1.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", @@ -137,8 +137,8 @@ "zod": "^3.22.4" }, "devDependencies": { - "@strapi/admin-test-utils": "5.0.0-beta.13", - "@strapi/data-transfer": "5.0.0-beta.13", + "@strapi/admin-test-utils": "5.0.0-beta.14", + "@strapi/data-transfer": "5.0.0-beta.14", "@strapi/pack-up": "5.0.0", "@types/codemirror5": "npm:@types/codemirror@^5.60.15", "@types/fs-extra": "11.0.4", diff --git a/packages/core/content-manager/package.json b/packages/core/content-manager/package.json index e7d6b849af..b6435fddaf 100644 --- a/packages/core/content-manager/package.json +++ b/packages/core/content-manager/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/content-manager", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "A powerful UI to easily manage your data.", "repository": { "type": "git", @@ -62,8 +62,8 @@ "@sindresorhus/slugify": "1.1.0", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/types": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.14", "codemirror5": "npm:codemirror@^5.65.11", "date-fns": "2.30.0", "fractional-indexing": "3.2.0", @@ -97,7 +97,7 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.13", + "@strapi/admin": "5.0.0-beta.14", "@strapi/database": "workspace:*", "@strapi/pack-up": "5.0.0", "@testing-library/react": "15.0.7", diff --git a/packages/core/content-releases/package.json b/packages/core/content-releases/package.json index ce7fabb147..cae3eee904 100644 --- a/packages/core/content-releases/package.json +++ b/packages/core/content-releases/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/content-releases", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Strapi plugin for organizing and releasing content", "repository": { "type": "git", @@ -55,11 +55,11 @@ }, "dependencies": { "@reduxjs/toolkit": "1.9.7", - "@strapi/database": "5.0.0-beta.13", + "@strapi/database": "5.0.0-beta.14", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", "@strapi/types": "workspace:*", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "date-fns": "2.30.0", "date-fns-tz": "2.0.1", "formik": "2.4.5", @@ -70,9 +70,9 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.13", - "@strapi/admin-test-utils": "5.0.0-beta.13", - "@strapi/content-manager": "5.0.0-beta.13", + "@strapi/admin": "5.0.0-beta.14", + "@strapi/admin-test-utils": "5.0.0-beta.14", + "@strapi/content-manager": "5.0.0-beta.14", "@strapi/pack-up": "5.0.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", diff --git a/packages/core/content-type-builder/package.json b/packages/core/content-type-builder/package.json index 52d7e7643c..3c9d0251af 100644 --- a/packages/core/content-type-builder/package.json +++ b/packages/core/content-type-builder/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/content-type-builder", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Create and manage content types", "repository": { "type": "git", @@ -59,9 +59,9 @@ "@reduxjs/toolkit": "1.9.7", "@sindresorhus/slugify": "1.1.0", "@strapi/design-system": "2.0.0-beta.6", - "@strapi/generators": "5.0.0-beta.13", + "@strapi/generators": "5.0.0-beta.14", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "date-fns": "2.30.0", "fs-extra": "11.2.0", "immer": "9.0.21", @@ -73,9 +73,9 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.13", + "@strapi/admin": "5.0.0-beta.14", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.14", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "@types/fs-extra": "11.0.4", diff --git a/packages/core/core/package.json b/packages/core/core/package.json index 02a1f6e225..058f2d1a0e 100644 --- a/packages/core/core/package.json +++ b/packages/core/core/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/core", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Core of Strapi", "homepage": "https://strapi.io", "bugs": { @@ -55,16 +55,16 @@ "@koa/cors": "5.0.0", "@koa/router": "12.0.1", "@paralleldrive/cuid2": "2.2.2", - "@strapi/admin": "5.0.0-beta.13", - "@strapi/database": "5.0.0-beta.13", - "@strapi/generate-new": "5.0.0-beta.13", - "@strapi/generators": "5.0.0-beta.13", - "@strapi/logger": "5.0.0-beta.13", + "@strapi/admin": "5.0.0-beta.14", + "@strapi/database": "5.0.0-beta.14", + "@strapi/generate-new": "5.0.0-beta.14", + "@strapi/generators": "5.0.0-beta.14", + "@strapi/logger": "5.0.0-beta.14", "@strapi/pack-up": "5.0.0", - "@strapi/permissions": "5.0.0-beta.13", - "@strapi/types": "5.0.0-beta.13", - "@strapi/typescript-utils": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/permissions": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.14", + "@strapi/typescript-utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.14", "bcryptjs": "2.4.3", "boxen": "5.1.2", "chalk": "4.1.2", @@ -126,9 +126,9 @@ "@types/node": "18.19.24", "@types/node-schedule": "2.1.0", "@types/statuses": "2.0.1", - "eslint-config-custom": "5.0.0-beta.13", + "eslint-config-custom": "5.0.0-beta.14", "supertest": "6.3.3", - "tsconfig": "5.0.0-beta.13" + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/data-transfer/package.json b/packages/core/data-transfer/package.json index 852b9fc0e7..0de820cbd2 100644 --- a/packages/core/data-transfer/package.json +++ b/packages/core/data-transfer/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/data-transfer", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Data transfer capabilities for Strapi", "keywords": [ "strapi", @@ -40,9 +40,9 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/logger": "5.0.0-beta.13", - "@strapi/types": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/logger": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.14", "chalk": "4.1.2", "cli-table3": "0.6.2", "commander": "8.3.0", diff --git a/packages/core/database/package.json b/packages/core/database/package.json index 52ea448dd2..cbb9650f6c 100644 --- a/packages/core/database/package.json +++ b/packages/core/database/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/database", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Strapi's database layer", "homepage": "https://strapi.io", "bugs": { @@ -40,7 +40,7 @@ }, "dependencies": { "@paralleldrive/cuid2": "2.2.2", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "ajv": "8.16.0", "date-fns": "2.30.0", "debug": "4.3.4", @@ -53,8 +53,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/fs-extra": "11.0.4", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/email/package.json b/packages/core/email/package.json index 293ed70b1c..82b6550c44 100644 --- a/packages/core/email/package.json +++ b/packages/core/email/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/email", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Easily configure your Strapi application to send emails.", "repository": { "type": "git", @@ -54,17 +54,17 @@ "dependencies": { "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/provider-email-sendmail": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/provider-email-sendmail": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.14", "lodash": "4.17.21", "react-intl": "6.6.2", "react-query": "3.39.3", "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.13", + "@strapi/admin": "5.0.0-beta.14", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.14", "@testing-library/react": "15.0.7", "@types/koa": "2.13.4", "@types/lodash": "^4.14.191", diff --git a/packages/core/permissions/package.json b/packages/core/permissions/package.json index 063179abed..2ca8f9a83c 100644 --- a/packages/core/permissions/package.json +++ b/packages/core/permissions/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/permissions", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Strapi's permission layer.", "repository": { "type": "git", @@ -37,15 +37,15 @@ }, "dependencies": { "@casl/ability": "6.5.0", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "lodash": "4.17.21", "qs": "6.11.1", "sift": "16.0.1" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/review-workflows/package.json b/packages/core/review-workflows/package.json index 4370f6b46e..888d285a63 100644 --- a/packages/core/review-workflows/package.json +++ b/packages/core/review-workflows/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/review-workflows", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Review workflows for your content", "repository": { "type": "git", @@ -65,11 +65,11 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.13", - "@strapi/content-manager": "5.0.0-beta.13", + "@strapi/admin": "5.0.0-beta.14", + "@strapi/content-manager": "5.0.0-beta.14", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.14", "@testing-library/react": "15.0.7", "msw": "1.3.0", "react": "18.3.1", diff --git a/packages/core/strapi/package.json b/packages/core/strapi/package.json index b0bd972018..364615459d 100644 --- a/packages/core/strapi/package.json +++ b/packages/core/strapi/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/strapi", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite", "keywords": [ "strapi", @@ -109,25 +109,25 @@ }, "dependencies": { "@pmmmwh/react-refresh-webpack-plugin": "0.5.11", - "@strapi/admin": "5.0.0-beta.13", - "@strapi/content-manager": "5.0.0-beta.13", - "@strapi/content-releases": "5.0.0-beta.13", - "@strapi/content-type-builder": "5.0.0-beta.13", - "@strapi/core": "5.0.0-beta.13", - "@strapi/data-transfer": "5.0.0-beta.13", - "@strapi/database": "5.0.0-beta.13", - "@strapi/email": "5.0.0-beta.13", - "@strapi/generate-new": "5.0.0-beta.13", - "@strapi/generators": "5.0.0-beta.13", - "@strapi/i18n": "5.0.0-beta.13", - "@strapi/logger": "5.0.0-beta.13", + "@strapi/admin": "5.0.0-beta.14", + "@strapi/content-manager": "5.0.0-beta.14", + "@strapi/content-releases": "5.0.0-beta.14", + "@strapi/content-type-builder": "5.0.0-beta.14", + "@strapi/core": "5.0.0-beta.14", + "@strapi/data-transfer": "5.0.0-beta.14", + "@strapi/database": "5.0.0-beta.14", + "@strapi/email": "5.0.0-beta.14", + "@strapi/generate-new": "5.0.0-beta.14", + "@strapi/generators": "5.0.0-beta.14", + "@strapi/i18n": "5.0.0-beta.14", + "@strapi/logger": "5.0.0-beta.14", "@strapi/pack-up": "5.0.0", - "@strapi/permissions": "5.0.0-beta.13", - "@strapi/review-workflows": "5.0.0-beta.13", - "@strapi/types": "5.0.0-beta.13", - "@strapi/typescript-utils": "5.0.0-beta.13", - "@strapi/upload": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/permissions": "5.0.0-beta.14", + "@strapi/review-workflows": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.14", + "@strapi/typescript-utils": "5.0.0-beta.14", + "@strapi/upload": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.14", "@types/nodemon": "1.19.6", "@vitejs/plugin-react-swc": "3.6.0", "boxen": "5.1.2", @@ -180,10 +180,10 @@ "@types/node": "18.19.24", "@types/webpack-bundle-analyzer": "4.7.0", "@types/webpack-hot-middleware": "2.25.9", - "eslint-config-custom": "5.0.0-beta.13", + "eslint-config-custom": "5.0.0-beta.14", "react": "18.3.1", "react-dom": "18.3.1", - "tsconfig": "5.0.0-beta.13" + "tsconfig": "5.0.0-beta.14" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0", diff --git a/packages/core/types/package.json b/packages/core/types/package.json index a98d6ddda4..3bb2e00e9a 100644 --- a/packages/core/types/package.json +++ b/packages/core/types/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/types", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Shared typescript types for Strapi internal use", "keywords": [ "strapi" @@ -46,10 +46,10 @@ "@casl/ability": "6.5.0", "@koa/cors": "5.0.0", "@koa/router": "12.0.1", - "@strapi/database": "5.0.0-beta.13", - "@strapi/logger": "5.0.0-beta.13", - "@strapi/permissions": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/database": "5.0.0-beta.14", + "@strapi/logger": "5.0.0-beta.14", + "@strapi/permissions": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.14", "commander": "8.3.0", "koa": "2.15.2", "node-schedule": "2.1.0", @@ -64,9 +64,9 @@ "@types/koa": "2.13.4", "@types/koa__router": "12.0.0", "@types/node-schedule": "2.1.0", - "eslint-config-custom": "5.0.0-beta.13", + "eslint-config-custom": "5.0.0-beta.14", "lodash": "4.17.21", - "tsconfig": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.14", "typescript": "5.3.2", "undici": "6.18.2" }, diff --git a/packages/core/upload/package.json b/packages/core/upload/package.json index faaf7b4f3b..2acb5c0bc7 100644 --- a/packages/core/upload/package.json +++ b/packages/core/upload/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/upload", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Makes it easy to upload images and files to your Strapi Application.", "license": "SEE LICENSE IN LICENSE", "author": { @@ -47,8 +47,8 @@ "dependencies": { "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/provider-upload-local": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/provider-upload-local": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.14", "byte-size": "8.1.1", "cropperjs": "1.6.1", "date-fns": "2.30.0", @@ -70,9 +70,9 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.13", + "@strapi/admin": "5.0.0-beta.14", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.14", "@testing-library/dom": "10.1.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", diff --git a/packages/core/utils/package.json b/packages/core/utils/package.json index 049a4a3131..804ea490c6 100644 --- a/packages/core/utils/package.json +++ b/packages/core/utils/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/utils", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Shared utilities for the Strapi packages", "keywords": [ "strapi", @@ -60,10 +60,10 @@ "@types/http-errors": "2.0.4", "@types/koa": "2.13.4", "@types/node": "18.19.24", - "eslint-config-custom": "5.0.0-beta.13", + "eslint-config-custom": "5.0.0-beta.14", "koa": "2.15.2", "koa-body": "6.0.1", - "tsconfig": "5.0.0-beta.13" + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/generators/app/package.json b/packages/generators/app/package.json index 880d5722e7..3051245521 100644 --- a/packages/generators/app/package.json +++ b/packages/generators/app/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/generate-new", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Generate a new Strapi application.", "keywords": [ "generate", diff --git a/packages/generators/generators/package.json b/packages/generators/generators/package.json index 9dc614eef1..c5ff31bf71 100644 --- a/packages/generators/generators/package.json +++ b/packages/generators/generators/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/generators", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Interactive API generator.", "keywords": [ "strapi", @@ -46,8 +46,8 @@ }, "dependencies": { "@sindresorhus/slugify": "1.1.0", - "@strapi/typescript-utils": "5.0.0-beta.13", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/typescript-utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.14", "chalk": "4.1.2", "copyfiles": "2.4.1", "fs-extra": "11.2.0", @@ -58,8 +58,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/fs-extra": "11.0.4", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/plugins/cloud/package.json b/packages/plugins/cloud/package.json index 51911e89aa..c8d4e46913 100644 --- a/packages/plugins/cloud/package.json +++ b/packages/plugins/cloud/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-cloud", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Instructions to deploy your local project to Strapi Cloud", "license": "MIT", "author": { @@ -42,13 +42,13 @@ }, "devDependencies": { "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.13", - "eslint-config-custom": "5.0.0-beta.13", + "@strapi/strapi": "5.0.0-beta.14", + "eslint-config-custom": "5.0.0-beta.14", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.22.3", "styled-components": "6.1.8", - "tsconfig": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.14", "typescript": "5.2.2" }, "peerDependencies": { diff --git a/packages/plugins/color-picker/package.json b/packages/plugins/color-picker/package.json index 917cac25e9..32679a81f9 100644 --- a/packages/plugins/color-picker/package.json +++ b/packages/plugins/color-picker/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-color-picker", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Strapi maintained Custom Fields", "repository": { "type": "git", @@ -60,7 +60,7 @@ }, "devDependencies": { "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.13", + "@strapi/strapi": "5.0.0-beta.14", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "react": "18.3.1", diff --git a/packages/plugins/documentation/package.json b/packages/plugins/documentation/package.json index 8321610041..842d92c1eb 100644 --- a/packages/plugins/documentation/package.json +++ b/packages/plugins/documentation/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-documentation", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Create an OpenAPI Document and visualize your API with SWAGGER UI.", "repository": { "type": "git", @@ -55,10 +55,10 @@ }, "dependencies": { "@reduxjs/toolkit": "1.9.7", - "@strapi/admin": "5.0.0-beta.13", + "@strapi/admin": "5.0.0-beta.14", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "bcryptjs": "2.4.3", "cheerio": "^1.0.0-rc.12", "formik": "2.4.5", @@ -74,11 +74,11 @@ }, "devDependencies": { "@apidevtools/swagger-parser": "^10.1.0", - "@strapi/admin-test-utils": "5.0.0-beta.13", + "@strapi/admin-test-utils": "5.0.0-beta.14", "@strapi/pack-up": "5.0.0", "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.13", - "@strapi/types": "5.0.0-beta.13", + "@strapi/strapi": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.14", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "@types/fs-extra": "11.0.4", diff --git a/packages/plugins/graphql/package.json b/packages/plugins/graphql/package.json index ea58784076..91077b8b73 100644 --- a/packages/plugins/graphql/package.json +++ b/packages/plugins/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-graphql", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Adds GraphQL endpoint with default API methods.", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@koa/cors": "5.0.0", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "graphql": "^16.8.1", "graphql-depth-limit": "^1.1.0", "graphql-playground-middleware-koa": "^1.6.21", @@ -68,19 +68,19 @@ }, "devDependencies": { "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.13", - "@strapi/types": "5.0.0-beta.13", + "@strapi/strapi": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.14", "@types/graphql-depth-limit": "1.1.5", "@types/koa-bodyparser": "4.3.12", "@types/koa__cors": "5.0.0", "cross-env": "^7.0.3", - "eslint-config-custom": "5.0.0-beta.13", + "eslint-config-custom": "5.0.0-beta.14", "koa": "2.15.2", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.22.3", "styled-components": "6.1.8", - "tsconfig": "5.0.0-beta.13", + "tsconfig": "5.0.0-beta.14", "typescript": "5.3.2" }, "peerDependencies": { diff --git a/packages/plugins/i18n/package.json b/packages/plugins/i18n/package.json index 92d69cad3d..9b2408e59b 100644 --- a/packages/plugins/i18n/package.json +++ b/packages/plugins/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/i18n", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Create read and update content in different languages, both from the Admin Panel and from the API", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "1.9.7", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "lodash": "4.17.21", "qs": "6.11.1", "react-intl": "6.6.2", @@ -63,11 +63,11 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.13", - "@strapi/admin-test-utils": "5.0.0-beta.13", - "@strapi/content-manager": "5.0.0-beta.13", + "@strapi/admin": "5.0.0-beta.14", + "@strapi/admin-test-utils": "5.0.0-beta.14", + "@strapi/content-manager": "5.0.0-beta.14", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.14", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "msw": "1.3.0", diff --git a/packages/plugins/sentry/package.json b/packages/plugins/sentry/package.json index 335ece8a1e..9ec63c6897 100644 --- a/packages/plugins/sentry/package.json +++ b/packages/plugins/sentry/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-sentry", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Send Strapi error events to Sentry", "repository": { "type": "git", @@ -57,7 +57,7 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.13", + "@strapi/strapi": "5.0.0-beta.14", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.22.3", diff --git a/packages/plugins/users-permissions/package.json b/packages/plugins/users-permissions/package.json index 597180a543..4b9cb75108 100644 --- a/packages/plugins/users-permissions/package.json +++ b/packages/plugins/users-permissions/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-users-permissions", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Protect your API with a full-authentication process based on JWT", "repository": { "type": "git", @@ -48,7 +48,7 @@ "dependencies": { "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "bcryptjs": "2.4.3", "formik": "2.4.5", "grant-koa": "5.4.8", @@ -68,7 +68,7 @@ }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "@strapi/strapi": "5.0.0-beta.13", + "@strapi/strapi": "5.0.0-beta.14", "@testing-library/dom": "10.1.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", diff --git a/packages/providers/email-amazon-ses/package.json b/packages/providers/email-amazon-ses/package.json index 71d40a9f98..edc2c5a74f 100644 --- a/packages/providers/email-amazon-ses/package.json +++ b/packages/providers/email-amazon-ses/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-amazon-ses", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Amazon SES provider for strapi email", "keywords": [ "email", @@ -42,13 +42,13 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "node-ses": "^3.0.3" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-mailgun/package.json b/packages/providers/email-mailgun/package.json index 27f79a23f4..3652d33a7c 100644 --- a/packages/providers/email-mailgun/package.json +++ b/packages/providers/email-mailgun/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-mailgun", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Mailgun provider for strapi email plugin", "keywords": [ "email", @@ -44,14 +44,14 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "form-data": "^4.0.0", "mailgun.js": "10.2.1" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-nodemailer/package.json b/packages/providers/email-nodemailer/package.json index 3263bc7162..bc7b0eac99 100644 --- a/packages/providers/email-nodemailer/package.json +++ b/packages/providers/email-nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-nodemailer", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Nodemailer provider for Strapi 3", "keywords": [ "strapi", @@ -61,8 +61,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/nodemailer": "6.4.7", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-sendgrid/package.json b/packages/providers/email-sendgrid/package.json index 0c6cb7d3ad..1ffde8fc34 100644 --- a/packages/providers/email-sendgrid/package.json +++ b/packages/providers/email-sendgrid/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-sendgrid", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Sendgrid provider for strapi email", "keywords": [ "email", @@ -43,12 +43,12 @@ }, "dependencies": { "@sendgrid/mail": "7.7.0", - "@strapi/utils": "5.0.0-beta.13" + "@strapi/utils": "5.0.0-beta.14" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-sendmail/package.json b/packages/providers/email-sendmail/package.json index f9f7755930..fbe73109a4 100644 --- a/packages/providers/email-sendmail/package.json +++ b/packages/providers/email-sendmail/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-sendmail", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Sendmail provider for strapi email", "keywords": [ "email", @@ -41,14 +41,14 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "sendmail": "^1.6.1" }, "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/sendmail": "1.4.4", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/upload-aws-s3/package.json b/packages/providers/upload-aws-s3/package.json index 13dd7328d0..7ed134f77c 100644 --- a/packages/providers/upload-aws-s3/package.json +++ b/packages/providers/upload-aws-s3/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-aws-s3", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "AWS S3 provider for strapi upload", "keywords": [ "upload", @@ -54,8 +54,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/jest": "29.5.2", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/upload-cloudinary/package.json b/packages/providers/upload-cloudinary/package.json index 032925fb33..7ee5c93064 100644 --- a/packages/providers/upload-cloudinary/package.json +++ b/packages/providers/upload-cloudinary/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-cloudinary", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Cloudinary provider for strapi upload", "keywords": [ "upload", @@ -42,14 +42,14 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "cloudinary": "^1.41.0", "into-stream": "^5.1.0" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/upload-local/package.json b/packages/providers/upload-local/package.json index b7aaf30106..1879c17254 100644 --- a/packages/providers/upload-local/package.json +++ b/packages/providers/upload-local/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-local", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Local provider for strapi upload", "keywords": [ "upload", @@ -43,17 +43,17 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "fs-extra": "11.2.0" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.14", "@types/fs-extra": "11.0.4", "@types/jest": "29.5.2", - "eslint-config-custom": "5.0.0-beta.13", + "eslint-config-custom": "5.0.0-beta.14", "memfs": "4.6.0", - "tsconfig": "5.0.0-beta.13" + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/utils/api-tests/package.json b/packages/utils/api-tests/package.json index fab20e28a9..aa409814bd 100644 --- a/packages/utils/api-tests/package.json +++ b/packages/utils/api-tests/package.json @@ -1,6 +1,6 @@ { "name": "api-tests", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "dependencies": { "dotenv": "16.4.5", diff --git a/packages/utils/eslint-config-custom/package.json b/packages/utils/eslint-config-custom/package.json index 5a8bfea3ee..308188a1f3 100644 --- a/packages/utils/eslint-config-custom/package.json +++ b/packages/utils/eslint-config-custom/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-custom", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "main": "index.js" } diff --git a/packages/utils/logger/package.json b/packages/utils/logger/package.json index 5c3ec84958..a2e92e6aab 100644 --- a/packages/utils/logger/package.json +++ b/packages/utils/logger/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/logger", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Strapi's logger", "homepage": "https://strapi.io", "bugs": { @@ -43,8 +43,8 @@ }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.13", - "tsconfig": "5.0.0-beta.13" + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/utils/tsconfig/package.json b/packages/utils/tsconfig/package.json index 6359a4aa39..67300dcfc3 100644 --- a/packages/utils/tsconfig/package.json +++ b/packages/utils/tsconfig/package.json @@ -1,6 +1,6 @@ { "name": "tsconfig", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "devDependencies": { "@tsconfig/node18": "18.2.2" diff --git a/packages/utils/typescript/package.json b/packages/utils/typescript/package.json index e89670b10c..9eb4b3af0a 100644 --- a/packages/utils/typescript/package.json +++ b/packages/utils/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/typescript-utils", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "Typescript support for Strapi", "keywords": [ "strapi", diff --git a/packages/utils/upgrade/package.json b/packages/utils/upgrade/package.json index e077be3dc8..628350ef48 100644 --- a/packages/utils/upgrade/package.json +++ b/packages/utils/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/upgrade", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "description": "CLI to upgrade Strapi applications effortless", "keywords": [ "strapi", @@ -59,7 +59,7 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.13", + "@strapi/utils": "5.0.0-beta.14", "chalk": "4.1.2", "cli-table3": "0.6.2", "commander": "8.3.0", @@ -76,7 +76,7 @@ }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.13", + "@strapi/types": "5.0.0-beta.14", "@types/fs-extra": "11.0.4", "@types/jscodeshift": "0.11.10", "eslint-config-custom": "workspace:*", diff --git a/scripts/front/package.json b/scripts/front/package.json index ce7747a9eb..026595481a 100644 --- a/scripts/front/package.json +++ b/scripts/front/package.json @@ -1,6 +1,6 @@ { "name": "scripts-front", - "version": "5.0.0-beta.13", + "version": "5.0.0-beta.14", "private": true, "scripts": { "test:front": "jest --config jest.config.front.js" diff --git a/yarn.lock b/yarn.lock index de51028856..b5f0bd951c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7644,7 +7644,7 @@ __metadata: languageName: node linkType: hard -"@strapi/admin-test-utils@npm:5.0.0-beta.13, @strapi/admin-test-utils@workspace:*, @strapi/admin-test-utils@workspace:packages/admin-test-utils": +"@strapi/admin-test-utils@npm:5.0.0-beta.14, @strapi/admin-test-utils@workspace:*, @strapi/admin-test-utils@workspace:packages/admin-test-utils": version: 0.0.0-use.local resolution: "@strapi/admin-test-utils@workspace:packages/admin-test-utils" dependencies: @@ -7652,10 +7652,10 @@ __metadata: "@reduxjs/toolkit": "npm:1.9.7" "@strapi/pack-up": "npm:5.0.0" "@testing-library/jest-dom": "npm:6.4.5" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" jest-environment-jsdom: "npm:29.6.1" jest-styled-components: "npm:7.1.1" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" whatwg-fetch: "npm:3.6.2" peerDependencies: "@reduxjs/toolkit": ^1.9.7 @@ -7664,7 +7664,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/admin@npm:5.0.0-beta.13, @strapi/admin@workspace:packages/core/admin": +"@strapi/admin@npm:5.0.0-beta.14, @strapi/admin@workspace:packages/core/admin": version: 0.0.0-use.local resolution: "@strapi/admin@workspace:packages/core/admin" dependencies: @@ -7673,15 +7673,15 @@ __metadata: "@radix-ui/react-context": "npm:1.0.1" "@radix-ui/react-toolbar": "npm:1.0.4" "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin-test-utils": "npm:5.0.0-beta.13" - "@strapi/data-transfer": "npm:5.0.0-beta.13" + "@strapi/admin-test-utils": "npm:5.0.0-beta.14" + "@strapi/data-transfer": "npm:5.0.0-beta.14" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.13" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/typescript-utils": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/permissions": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/typescript-utils": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@testing-library/dom": "npm:10.1.0" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" @@ -7763,20 +7763,20 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-manager@npm:5.0.0-beta.13, @strapi/content-manager@workspace:packages/core/content-manager": +"@strapi/content-manager@npm:5.0.0-beta.14, @strapi/content-manager@workspace:packages/core/content-manager": version: 0.0.0-use.local resolution: "@strapi/content-manager@workspace:packages/core/content-manager" dependencies: "@radix-ui/react-toolbar": "npm:1.0.4" "@reduxjs/toolkit": "npm:1.9.7" "@sindresorhus/slugify": "npm:1.1.0" - "@strapi/admin": "npm:5.0.0-beta.13" + "@strapi/admin": "npm:5.0.0-beta.14" "@strapi/database": "workspace:*" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@testing-library/react": "npm:15.0.7" "@types/jest": "npm:29.5.2" "@types/lodash": "npm:^4.14.191" @@ -7826,20 +7826,20 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-releases@npm:5.0.0-beta.13, @strapi/content-releases@workspace:packages/core/content-releases": +"@strapi/content-releases@npm:5.0.0-beta.14, @strapi/content-releases@workspace:packages/core/content-releases": version: 0.0.0-use.local resolution: "@strapi/content-releases@workspace:packages/core/content-releases" dependencies: "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.13" - "@strapi/admin-test-utils": "npm:5.0.0-beta.13" - "@strapi/content-manager": "npm:5.0.0-beta.13" - "@strapi/database": "npm:5.0.0-beta.13" + "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/admin-test-utils": "npm:5.0.0-beta.14" + "@strapi/content-manager": "npm:5.0.0-beta.14" + "@strapi/database": "npm:5.0.0-beta.14" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" "@strapi/types": "workspace:*" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.14" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" "@types/koa": "npm:2.13.4" @@ -7869,19 +7869,19 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-type-builder@npm:5.0.0-beta.13, @strapi/content-type-builder@workspace:packages/core/content-type-builder": +"@strapi/content-type-builder@npm:5.0.0-beta.14, @strapi/content-type-builder@workspace:packages/core/content-type-builder": version: 0.0.0-use.local resolution: "@strapi/content-type-builder@workspace:packages/core/content-type-builder" dependencies: "@reduxjs/toolkit": "npm:1.9.7" "@sindresorhus/slugify": "npm:1.1.0" - "@strapi/admin": "npm:5.0.0-beta.13" + "@strapi/admin": "npm:5.0.0-beta.14" "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/generators": "npm:5.0.0-beta.13" + "@strapi/generators": "npm:5.0.0-beta.14" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" "@types/fs-extra": "npm:11.0.4" @@ -7911,24 +7911,24 @@ __metadata: languageName: unknown linkType: soft -"@strapi/core@npm:5.0.0-beta.13, @strapi/core@workspace:packages/core/core": +"@strapi/core@npm:5.0.0-beta.14, @strapi/core@workspace:packages/core/core": version: 0.0.0-use.local resolution: "@strapi/core@workspace:packages/core/core" dependencies: "@koa/cors": "npm:5.0.0" "@koa/router": "npm:12.0.1" "@paralleldrive/cuid2": "npm:2.2.2" - "@strapi/admin": "npm:5.0.0-beta.13" - "@strapi/database": "npm:5.0.0-beta.13" - "@strapi/generate-new": "npm:5.0.0-beta.13" - "@strapi/generators": "npm:5.0.0-beta.13" - "@strapi/logger": "npm:5.0.0-beta.13" + "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/database": "npm:5.0.0-beta.14" + "@strapi/generate-new": "npm:5.0.0-beta.14" + "@strapi/generators": "npm:5.0.0-beta.14" + "@strapi/logger": "npm:5.0.0-beta.14" "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.13" + "@strapi/permissions": "npm:5.0.0-beta.14" "@strapi/ts-zen": "npm:^0.2.0" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/typescript-utils": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/typescript-utils": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@types/bcryptjs": "npm:2.4.3" "@types/configstore": "npm:5.0.1" "@types/delegates": "npm:1.0.0" @@ -7957,7 +7957,7 @@ __metadata: debug: "npm:4.3.4" delegates: "npm:1.0.0" dotenv: "npm:16.4.5" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" execa: "npm:5.1.1" fs-extra: "npm:11.2.0" glob: "npm:10.3.10" @@ -7985,22 +7985,22 @@ __metadata: semver: "npm:7.5.4" statuses: "npm:2.0.1" supertest: "npm:6.3.3" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" typescript: "npm:5.2.2" undici: "npm:6.18.2" yup: "npm:0.32.9" languageName: unknown linkType: soft -"@strapi/data-transfer@npm:5.0.0-beta.13, @strapi/data-transfer@workspace:packages/core/data-transfer": +"@strapi/data-transfer@npm:5.0.0-beta.14, @strapi/data-transfer@workspace:packages/core/data-transfer": version: 0.0.0-use.local resolution: "@strapi/data-transfer@workspace:packages/core/data-transfer" dependencies: "@strapi/database": "workspace:*" - "@strapi/logger": "npm:5.0.0-beta.13" + "@strapi/logger": "npm:5.0.0-beta.14" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@types/fs-extra": "npm:11.0.4" "@types/jest": "npm:29.5.2" "@types/koa": "npm:2.13.4" @@ -8033,23 +8033,23 @@ __metadata: languageName: unknown linkType: soft -"@strapi/database@npm:5.0.0-beta.13, @strapi/database@workspace:*, @strapi/database@workspace:packages/core/database": +"@strapi/database@npm:5.0.0-beta.14, @strapi/database@workspace:*, @strapi/database@workspace:packages/core/database": version: 0.0.0-use.local resolution: "@strapi/database@workspace:packages/core/database" dependencies: "@paralleldrive/cuid2": "npm:2.2.2" "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.14" "@types/fs-extra": "npm:11.0.4" ajv: "npm:8.16.0" date-fns: "npm:2.30.0" debug: "npm:4.3.4" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" fs-extra: "npm:11.2.0" knex: "npm:3.0.1" lodash: "npm:4.17.21" semver: "npm:7.5.4" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" umzug: "npm:3.8.1" languageName: unknown linkType: soft @@ -8089,17 +8089,17 @@ __metadata: languageName: node linkType: hard -"@strapi/email@npm:5.0.0-beta.13, @strapi/email@workspace:packages/core/email": +"@strapi/email@npm:5.0.0-beta.14, @strapi/email@workspace:packages/core/email": version: 0.0.0-use.local resolution: "@strapi/email@workspace:packages/core/email" dependencies: - "@strapi/admin": "npm:5.0.0-beta.13" + "@strapi/admin": "npm:5.0.0-beta.14" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/provider-email-sendmail": "npm:5.0.0-beta.13" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/provider-email-sendmail": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@testing-library/react": "npm:15.0.7" "@types/koa": "npm:2.13.4" "@types/lodash": "npm:^4.14.191" @@ -8155,7 +8155,7 @@ __metadata: languageName: node linkType: hard -"@strapi/generate-new@npm:5.0.0-beta.13, @strapi/generate-new@workspace:packages/generators/app": +"@strapi/generate-new@npm:5.0.0-beta.14, @strapi/generate-new@workspace:packages/generators/app": version: 0.0.0-use.local resolution: "@strapi/generate-new@workspace:packages/generators/app" dependencies: @@ -8175,39 +8175,39 @@ __metadata: languageName: unknown linkType: soft -"@strapi/generators@npm:5.0.0-beta.13, @strapi/generators@workspace:packages/generators/generators": +"@strapi/generators@npm:5.0.0-beta.14, @strapi/generators@workspace:packages/generators/generators": version: 0.0.0-use.local resolution: "@strapi/generators@workspace:packages/generators/generators" dependencies: "@sindresorhus/slugify": "npm:1.1.0" "@strapi/pack-up": "npm:5.0.0" - "@strapi/typescript-utils": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/typescript-utils": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@types/fs-extra": "npm:11.0.4" chalk: "npm:4.1.2" copyfiles: "npm:2.4.1" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" fs-extra: "npm:11.2.0" node-plop: "npm:0.26.3" plop: "npm:2.7.6" pluralize: "npm:8.0.0" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" languageName: unknown linkType: soft -"@strapi/i18n@npm:5.0.0-beta.13, @strapi/i18n@workspace:packages/plugins/i18n": +"@strapi/i18n@npm:5.0.0-beta.14, @strapi/i18n@workspace:packages/plugins/i18n": version: 0.0.0-use.local resolution: "@strapi/i18n@workspace:packages/plugins/i18n" dependencies: "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.13" - "@strapi/admin-test-utils": "npm:5.0.0-beta.13" - "@strapi/content-manager": "npm:5.0.0-beta.13" + "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/admin-test-utils": "npm:5.0.0-beta.14" + "@strapi/content-manager": "npm:5.0.0-beta.14" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" lodash: "npm:4.17.21" @@ -8242,14 +8242,14 @@ __metadata: languageName: node linkType: hard -"@strapi/logger@npm:5.0.0-beta.13, @strapi/logger@workspace:packages/utils/logger": +"@strapi/logger@npm:5.0.0-beta.14, @strapi/logger@workspace:packages/utils/logger": version: 0.0.0-use.local resolution: "@strapi/logger@workspace:packages/utils/logger" dependencies: "@strapi/pack-up": "npm:5.0.0" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" lodash: "npm:4.17.21" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" winston: "npm:3.10.0" languageName: unknown linkType: soft @@ -8316,18 +8316,18 @@ __metadata: languageName: node linkType: hard -"@strapi/permissions@npm:5.0.0-beta.13, @strapi/permissions@workspace:packages/core/permissions": +"@strapi/permissions@npm:5.0.0-beta.14, @strapi/permissions@workspace:packages/core/permissions": version: 0.0.0-use.local resolution: "@strapi/permissions@workspace:packages/core/permissions" dependencies: "@casl/ability": "npm:6.5.0" "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.13" - eslint-config-custom: "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.14" lodash: "npm:4.17.21" qs: "npm:6.11.1" sift: "npm:16.0.1" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" languageName: unknown linkType: soft @@ -8338,14 +8338,14 @@ __metadata: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.13" - eslint-config-custom: "npm:5.0.0-beta.13" + "@strapi/strapi": "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.14" react: "npm:18.3.1" react-dom: "npm:18.3.1" react-intl: "npm:6.6.2" react-router-dom: "npm:6.22.3" styled-components: "npm:6.1.8" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" typescript: "npm:5.2.2" peerDependencies: "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc @@ -8356,14 +8356,14 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-color-picker@npm:5.0.0-beta.13, @strapi/plugin-color-picker@workspace:packages/plugins/color-picker": +"@strapi/plugin-color-picker@npm:5.0.0-beta.14, @strapi/plugin-color-picker@workspace:packages/plugins/color-picker": version: 0.0.0-use.local resolution: "@strapi/plugin-color-picker@workspace:packages/plugins/color-picker" dependencies: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.13" + "@strapi/strapi": "npm:5.0.0-beta.14" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" react: "npm:18.3.1" @@ -8382,21 +8382,21 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-documentation@npm:5.0.0-beta.13, @strapi/plugin-documentation@workspace:packages/plugins/documentation": +"@strapi/plugin-documentation@npm:5.0.0-beta.14, @strapi/plugin-documentation@workspace:packages/plugins/documentation": version: 0.0.0-use.local resolution: "@strapi/plugin-documentation@workspace:packages/plugins/documentation" dependencies: "@apidevtools/swagger-parser": "npm:^10.1.0" "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.13" - "@strapi/admin-test-utils": "npm:5.0.0-beta.13" + "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/admin-test-utils": "npm:5.0.0-beta.14" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.13" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/strapi": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" "@types/fs-extra": "npm:11.0.4" @@ -8433,7 +8433,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-graphql@npm:5.0.0-beta.13, @strapi/plugin-graphql@workspace:packages/plugins/graphql": +"@strapi/plugin-graphql@npm:5.0.0-beta.14, @strapi/plugin-graphql@workspace:packages/plugins/graphql": version: 0.0.0-use.local resolution: "@strapi/plugin-graphql@workspace:packages/plugins/graphql" dependencies: @@ -8445,14 +8445,14 @@ __metadata: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.13" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/strapi": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@types/graphql-depth-limit": "npm:1.1.5" "@types/koa-bodyparser": "npm:4.3.12" "@types/koa__cors": "npm:5.0.0" cross-env: "npm:^7.0.3" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" graphql: "npm:^16.8.1" graphql-depth-limit: "npm:^1.1.0" graphql-playground-middleware-koa: "npm:^1.6.21" @@ -8467,7 +8467,7 @@ __metadata: react-dom: "npm:18.3.1" react-router-dom: "npm:6.22.3" styled-components: "npm:6.1.8" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" typescript: "npm:5.3.2" peerDependencies: "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc @@ -8478,7 +8478,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-sentry@npm:5.0.0-beta.13, @strapi/plugin-sentry@workspace:packages/plugins/sentry": +"@strapi/plugin-sentry@npm:5.0.0-beta.14, @strapi/plugin-sentry@workspace:packages/plugins/sentry": version: 0.0.0-use.local resolution: "@strapi/plugin-sentry@workspace:packages/plugins/sentry" dependencies: @@ -8487,7 +8487,7 @@ __metadata: "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.13" + "@strapi/strapi": "npm:5.0.0-beta.14" react: "npm:18.3.1" react-dom: "npm:18.3.1" react-router-dom: "npm:6.22.3" @@ -8501,15 +8501,15 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-users-permissions@npm:5.0.0-beta.13, @strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions": +"@strapi/plugin-users-permissions@npm:5.0.0-beta.14, @strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions": version: 0.0.0-use.local resolution: "@strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions" dependencies: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/strapi": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@testing-library/dom": "npm:10.1.0" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" @@ -8548,23 +8548,23 @@ __metadata: resolution: "@strapi/provider-email-amazon-ses@workspace:packages/providers/email-amazon-ses" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.13" - eslint-config-custom: "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.14" node-ses: "npm:^3.0.3" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" languageName: unknown linkType: soft -"@strapi/provider-email-mailgun@npm:5.0.0-beta.13, @strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun": +"@strapi/provider-email-mailgun@npm:5.0.0-beta.14, @strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun": version: 0.0.0-use.local resolution: "@strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.13" - eslint-config-custom: "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.14" form-data: "npm:^4.0.0" mailgun.js: "npm:10.2.1" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" languageName: unknown linkType: soft @@ -8574,10 +8574,10 @@ __metadata: dependencies: "@strapi/pack-up": "npm:5.0.0" "@types/nodemailer": "npm:6.4.7" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" lodash: "npm:4.17.21" nodemailer: "npm:6.9.1" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" languageName: unknown linkType: soft @@ -8587,26 +8587,26 @@ __metadata: dependencies: "@sendgrid/mail": "npm:7.7.0" "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.13" - eslint-config-custom: "npm:5.0.0-beta.13" - tsconfig: "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.14" languageName: unknown linkType: soft -"@strapi/provider-email-sendmail@npm:5.0.0-beta.13, @strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail": +"@strapi/provider-email-sendmail@npm:5.0.0-beta.14, @strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail": version: 0.0.0-use.local resolution: "@strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.14" "@types/sendmail": "npm:1.4.4" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" sendmail: "npm:^1.6.1" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" languageName: unknown linkType: soft -"@strapi/provider-upload-aws-s3@npm:5.0.0-beta.13, @strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3": +"@strapi/provider-upload-aws-s3@npm:5.0.0-beta.14, @strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3": version: 0.0.0-use.local resolution: "@strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3" dependencies: @@ -8616,53 +8616,53 @@ __metadata: "@aws-sdk/types": "npm:3.433.0" "@strapi/pack-up": "npm:5.0.0" "@types/jest": "npm:29.5.2" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" lodash: "npm:4.17.21" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" languageName: unknown linkType: soft -"@strapi/provider-upload-cloudinary@npm:5.0.0-beta.13, @strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary": +"@strapi/provider-upload-cloudinary@npm:5.0.0-beta.14, @strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary": version: 0.0.0-use.local resolution: "@strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.14" cloudinary: "npm:^1.41.0" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" into-stream: "npm:^5.1.0" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" languageName: unknown linkType: soft -"@strapi/provider-upload-local@npm:5.0.0-beta.13, @strapi/provider-upload-local@workspace:packages/providers/upload-local": +"@strapi/provider-upload-local@npm:5.0.0-beta.14, @strapi/provider-upload-local@workspace:packages/providers/upload-local": version: 0.0.0-use.local resolution: "@strapi/provider-upload-local@workspace:packages/providers/upload-local" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@types/fs-extra": "npm:11.0.4" "@types/jest": "npm:29.5.2" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" fs-extra: "npm:11.2.0" memfs: "npm:4.6.0" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" languageName: unknown linkType: soft -"@strapi/review-workflows@npm:5.0.0-beta.13, @strapi/review-workflows@workspace:packages/core/review-workflows": +"@strapi/review-workflows@npm:5.0.0-beta.14, @strapi/review-workflows@workspace:packages/core/review-workflows": version: 0.0.0-use.local resolution: "@strapi/review-workflows@workspace:packages/core/review-workflows" dependencies: "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.13" - "@strapi/content-manager": "npm:5.0.0-beta.13" + "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/content-manager": "npm:5.0.0-beta.14" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@testing-library/react": "npm:15.0.7" fractional-indexing: "npm:3.2.0" msw: "npm:1.3.0" @@ -8711,31 +8711,31 @@ __metadata: languageName: node linkType: hard -"@strapi/strapi@npm:5.0.0-beta.13, @strapi/strapi@workspace:packages/core/strapi": +"@strapi/strapi@npm:5.0.0-beta.14, @strapi/strapi@workspace:packages/core/strapi": version: 0.0.0-use.local resolution: "@strapi/strapi@workspace:packages/core/strapi" dependencies: "@pmmmwh/react-refresh-webpack-plugin": "npm:0.5.11" - "@strapi/admin": "npm:5.0.0-beta.13" - "@strapi/content-manager": "npm:5.0.0-beta.13" - "@strapi/content-releases": "npm:5.0.0-beta.13" - "@strapi/content-type-builder": "npm:5.0.0-beta.13" - "@strapi/core": "npm:5.0.0-beta.13" - "@strapi/data-transfer": "npm:5.0.0-beta.13" - "@strapi/database": "npm:5.0.0-beta.13" - "@strapi/email": "npm:5.0.0-beta.13" - "@strapi/generate-new": "npm:5.0.0-beta.13" - "@strapi/generators": "npm:5.0.0-beta.13" - "@strapi/i18n": "npm:5.0.0-beta.13" - "@strapi/logger": "npm:5.0.0-beta.13" + "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/content-manager": "npm:5.0.0-beta.14" + "@strapi/content-releases": "npm:5.0.0-beta.14" + "@strapi/content-type-builder": "npm:5.0.0-beta.14" + "@strapi/core": "npm:5.0.0-beta.14" + "@strapi/data-transfer": "npm:5.0.0-beta.14" + "@strapi/database": "npm:5.0.0-beta.14" + "@strapi/email": "npm:5.0.0-beta.14" + "@strapi/generate-new": "npm:5.0.0-beta.14" + "@strapi/generators": "npm:5.0.0-beta.14" + "@strapi/i18n": "npm:5.0.0-beta.14" + "@strapi/logger": "npm:5.0.0-beta.14" "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.13" - "@strapi/review-workflows": "npm:5.0.0-beta.13" + "@strapi/permissions": "npm:5.0.0-beta.14" + "@strapi/review-workflows": "npm:5.0.0-beta.14" "@strapi/ts-zen": "npm:^0.2.0" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/typescript-utils": "npm:5.0.0-beta.13" - "@strapi/upload": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/typescript-utils": "npm:5.0.0-beta.14" + "@strapi/upload": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@types/fs-extra": "npm:11.0.4" "@types/jest": "npm:29.5.2" "@types/lodash": "npm:^4.14.191" @@ -8758,7 +8758,7 @@ __metadata: esbuild: "npm:0.21.3" esbuild-loader: "npm:^2.21.0" esbuild-register: "npm:3.5.0" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" execa: "npm:5.1.1" fork-ts-checker-webpack-plugin: "npm:8.0.0" fs-extra: "npm:11.2.0" @@ -8780,7 +8780,7 @@ __metadata: resolve-from: "npm:5.0.0" semver: "npm:7.5.4" style-loader: "npm:3.3.4" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" typescript: "npm:5.3.2" vite: "npm:5.1.6" webpack: "npm:^5.90.3" @@ -8809,29 +8809,29 @@ __metadata: languageName: node linkType: hard -"@strapi/types@npm:5.0.0-beta.13, @strapi/types@workspace:*, @strapi/types@workspace:packages/core/types": +"@strapi/types@npm:5.0.0-beta.14, @strapi/types@workspace:*, @strapi/types@workspace:packages/core/types": version: 0.0.0-use.local resolution: "@strapi/types@workspace:packages/core/types" dependencies: "@casl/ability": "npm:6.5.0" "@koa/cors": "npm:5.0.0" "@koa/router": "npm:12.0.1" - "@strapi/database": "npm:5.0.0-beta.13" - "@strapi/logger": "npm:5.0.0-beta.13" + "@strapi/database": "npm:5.0.0-beta.14" + "@strapi/logger": "npm:5.0.0-beta.14" "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.13" + "@strapi/permissions": "npm:5.0.0-beta.14" "@strapi/ts-zen": "npm:^0.2.0" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/utils": "npm:5.0.0-beta.14" "@types/jest": "npm:29.5.2" "@types/koa": "npm:2.13.4" "@types/koa__router": "npm:12.0.0" "@types/node-schedule": "npm:2.1.0" commander: "npm:8.3.0" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" koa: "npm:2.15.2" lodash: "npm:4.17.21" node-schedule: "npm:2.1.0" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" typedoc: "npm:0.25.10" typedoc-github-wiki-theme: "npm:1.1.0" typedoc-plugin-markdown: "npm:3.17.1" @@ -8840,7 +8840,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/typescript-utils@npm:5.0.0-beta.13, @strapi/typescript-utils@workspace:packages/utils/typescript": +"@strapi/typescript-utils@npm:5.0.0-beta.14, @strapi/typescript-utils@workspace:packages/utils/typescript": version: 0.0.0-use.local resolution: "@strapi/typescript-utils@workspace:packages/utils/typescript" dependencies: @@ -8891,8 +8891,8 @@ __metadata: resolution: "@strapi/upgrade@workspace:packages/utils/upgrade" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@types/fs-extra": "npm:11.0.4" "@types/jscodeshift": "npm:0.11.10" chalk: "npm:4.1.2" @@ -8915,17 +8915,17 @@ __metadata: languageName: unknown linkType: soft -"@strapi/upload@npm:5.0.0-beta.13, @strapi/upload@workspace:packages/core/upload": +"@strapi/upload@npm:5.0.0-beta.14, @strapi/upload@workspace:packages/core/upload": version: 0.0.0-use.local resolution: "@strapi/upload@workspace:packages/core/upload" dependencies: - "@strapi/admin": "npm:5.0.0-beta.13" + "@strapi/admin": "npm:5.0.0-beta.14" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/provider-upload-local": "npm:5.0.0-beta.13" - "@strapi/types": "npm:5.0.0-beta.13" - "@strapi/utils": "npm:5.0.0-beta.13" + "@strapi/provider-upload-local": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.14" "@testing-library/dom": "npm:10.1.0" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" @@ -8969,7 +8969,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/utils@npm:5.0.0-beta.13, @strapi/utils@workspace:packages/core/utils": +"@strapi/utils@npm:5.0.0-beta.14, @strapi/utils@workspace:packages/core/utils": version: 0.0.0-use.local resolution: "@strapi/utils@workspace:packages/core/utils" dependencies: @@ -8979,7 +8979,7 @@ __metadata: "@types/koa": "npm:2.13.4" "@types/node": "npm:18.19.24" date-fns: "npm:2.30.0" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" execa: "npm:5.1.1" http-errors: "npm:2.0.0" koa: "npm:2.15.2" @@ -8988,7 +8988,7 @@ __metadata: node-machine-id: "npm:1.1.12" p-map: "npm:4.0.0" preferred-pm: "npm:3.1.2" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" yup: "npm:0.32.9" zod: "npm:^3.22.4" languageName: unknown @@ -14135,17 +14135,17 @@ __metadata: languageName: node linkType: hard -"create-strapi-app@npm:5.0.0-beta.13, create-strapi-app@workspace:packages/cli/create-strapi-app": +"create-strapi-app@npm:5.0.0-beta.14, create-strapi-app@workspace:packages/cli/create-strapi-app": version: 0.0.0-use.local resolution: "create-strapi-app@workspace:packages/cli/create-strapi-app" dependencies: - "@strapi/generate-new": "npm:5.0.0-beta.13" + "@strapi/generate-new": "npm:5.0.0-beta.14" "@strapi/pack-up": "npm:5.0.0" "@types/inquirer": "npm:8.2.5" commander: "npm:8.3.0" - eslint-config-custom: "npm:5.0.0-beta.13" + eslint-config-custom: "npm:5.0.0-beta.14" inquirer: "npm:8.2.5" - tsconfig: "npm:5.0.0-beta.13" + tsconfig: "npm:5.0.0-beta.14" bin: create-strapi-app: ./bin/index.js languageName: unknown @@ -14155,7 +14155,7 @@ __metadata: version: 0.0.0-use.local resolution: "create-strapi@workspace:packages/cli/create-strapi" dependencies: - create-strapi-app: "npm:5.0.0-beta.13" + create-strapi-app: "npm:5.0.0-beta.14" bin: create-strapi: ./bin/index.js languageName: unknown @@ -16030,7 +16030,7 @@ __metadata: languageName: node linkType: hard -"eslint-config-custom@npm:5.0.0-beta.13, eslint-config-custom@workspace:*, eslint-config-custom@workspace:packages/utils/eslint-config-custom": +"eslint-config-custom@npm:5.0.0-beta.14, eslint-config-custom@workspace:*, eslint-config-custom@workspace:packages/utils/eslint-config-custom": version: 0.0.0-use.local resolution: "eslint-config-custom@workspace:packages/utils/eslint-config-custom" languageName: unknown @@ -16748,8 +16748,8 @@ __metadata: version: 0.0.0-use.local resolution: "experimental-dev@workspace:examples/experimental-dev" dependencies: - "@strapi/plugin-users-permissions": "npm:5.0.0-beta.13" - "@strapi/strapi": "npm:5.0.0-beta.13" + "@strapi/plugin-users-permissions": "npm:5.0.0-beta.14" + "@strapi/strapi": "npm:5.0.0-beta.14" "@vitejs/plugin-react": "npm:4.2.1" babel-plugin-react-compiler: "npm:0.0.0-experimental-c23de8d-20240515" better-sqlite3: "npm:9.4.3" @@ -17838,15 +17838,15 @@ __metadata: resolution: "getstarted@workspace:examples/getstarted" dependencies: "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/plugin-color-picker": "npm:5.0.0-beta.13" - "@strapi/plugin-documentation": "npm:5.0.0-beta.13" - "@strapi/plugin-graphql": "npm:5.0.0-beta.13" - "@strapi/plugin-sentry": "npm:5.0.0-beta.13" - "@strapi/plugin-users-permissions": "npm:5.0.0-beta.13" - "@strapi/provider-email-mailgun": "npm:5.0.0-beta.13" - "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.13" - "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.13" - "@strapi/strapi": "npm:5.0.0-beta.13" + "@strapi/plugin-color-picker": "npm:5.0.0-beta.14" + "@strapi/plugin-documentation": "npm:5.0.0-beta.14" + "@strapi/plugin-graphql": "npm:5.0.0-beta.14" + "@strapi/plugin-sentry": "npm:5.0.0-beta.14" + "@strapi/plugin-users-permissions": "npm:5.0.0-beta.14" + "@strapi/provider-email-mailgun": "npm:5.0.0-beta.14" + "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.14" + "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.14" + "@strapi/strapi": "npm:5.0.0-beta.14" better-sqlite3: "npm:9.4.3" lodash: "npm:4.17.21" mysql2: "npm:3.9.4" @@ -21162,8 +21162,8 @@ __metadata: version: 0.0.0-use.local resolution: "kitchensink-ts@workspace:examples/kitchensink-ts" dependencies: - "@strapi/plugin-users-permissions": "npm:5.0.0-beta.13" - "@strapi/strapi": "npm:5.0.0-beta.13" + "@strapi/plugin-users-permissions": "npm:5.0.0-beta.14" + "@strapi/strapi": "npm:5.0.0-beta.14" better-sqlite3: "npm:9.4.3" react: "npm:18.3.1" react-dom: "npm:18.3.1" @@ -21176,10 +21176,10 @@ __metadata: version: 0.0.0-use.local resolution: "kitchensink@workspace:examples/kitchensink" dependencies: - "@strapi/provider-email-mailgun": "npm:5.0.0-beta.13" - "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.13" - "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.13" - "@strapi/strapi": "npm:5.0.0-beta.13" + "@strapi/provider-email-mailgun": "npm:5.0.0-beta.14" + "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.14" + "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.14" + "@strapi/strapi": "npm:5.0.0-beta.14" better-sqlite3: "npm:9.4.3" lodash: "npm:4.17.21" mysql2: "npm:3.9.4" @@ -29304,7 +29304,7 @@ __metadata: languageName: node linkType: hard -"tsconfig@npm:5.0.0-beta.13, tsconfig@workspace:packages/utils/tsconfig": +"tsconfig@npm:5.0.0-beta.14, tsconfig@workspace:packages/utils/tsconfig": version: 0.0.0-use.local resolution: "tsconfig@workspace:packages/utils/tsconfig" dependencies: From cae1130e53a60455092678a51bfa6b982ab01b36 Mon Sep 17 00:00:00 2001 From: Alexandre Bodin Date: Thu, 6 Jun 2024 11:13:21 +0200 Subject: [PATCH 21/78] chore: only delete tables,columns,idx,fks we track --- .../transform-content-types-to-models.ts | 2 + packages/core/database/src/schema/diff.ts | 166 ++++++++++++------ packages/core/database/src/schema/index.ts | 26 ++- packages/core/database/src/schema/storage.ts | 7 +- packages/core/types/src/struct/schema.ts | 7 + 5 files changed, 152 insertions(+), 56 deletions(-) diff --git a/packages/core/core/src/utils/transform-content-types-to-models.ts b/packages/core/core/src/utils/transform-content-types-to-models.ts index 7ad5b4184c..b216e909dc 100644 --- a/packages/core/core/src/utils/transform-content-types-to-models.ts +++ b/packages/core/core/src/utils/transform-content-types-to-models.ts @@ -315,6 +315,8 @@ export const transformContentTypesToModels = ( ...documentIdAttribute, ...transformAttributes(contentType, identifiers), }, + indexes: contentType.indexes as Model['indexes'], + foreignKeys: contentType.foreignKeys as Model['foreignKeys'], }; // Add indexes to model diff --git a/packages/core/database/src/schema/diff.ts b/packages/core/database/src/schema/diff.ts index 4df83eaa98..7f2692fe6e 100644 --- a/packages/core/database/src/schema/diff.ts +++ b/packages/core/database/src/schema/diff.ts @@ -16,6 +16,23 @@ import type { } from './types'; import type { Database } from '..'; +type PersistedTable = { + name: string; + dependsOn?: Array<{ name: string }>; +}; + +type TableDiffContext = { + previousTable?: Table; + databaseTable: Table; + userSchemaTable: Table; +}; + +type SchemaDiffContext = { + previousSchema: Schema; + databaseSchema: Schema; + userSchema: Schema; +}; + // TODO: get that list dynamically instead const RESERVED_TABLE_NAMES = [ 'strapi_migrations', @@ -194,30 +211,37 @@ export default (db: Database) => { }; }; - const diffTableColumns = (srcTable: Table, destTable: Table): ColumnsDiff => { + const diffTableColumns = (diffCtx: TableDiffContext): ColumnsDiff => { + const { databaseTable, userSchemaTable, previousTable } = diffCtx; + const addedColumns: Column[] = []; const updatedColumns: ColumnDiff['diff'][] = []; const unchangedColumns: Column[] = []; const removedColumns: Column[] = []; - for (const destColumn of destTable.columns) { - const srcColumn = helpers.findColumn(srcTable, destColumn.name); - if (srcColumn) { - const { status, diff } = diffColumns(srcColumn, destColumn); + for (const userSchemaColumn of userSchemaTable.columns) { + const databaseColumn = helpers.findColumn(databaseTable, userSchemaColumn.name); + + if (databaseColumn) { + const { status, diff } = diffColumns(databaseColumn, userSchemaColumn); if (status === statuses.CHANGED) { updatedColumns.push(diff); } else { - unchangedColumns.push(srcColumn); + unchangedColumns.push(databaseColumn); } } else { - addedColumns.push(destColumn); + addedColumns.push(userSchemaColumn); } } - for (const srcColumn of srcTable.columns) { - if (!helpers.hasColumn(destTable, srcColumn.name)) { - removedColumns.push(srcColumn); + for (const databaseColumn of databaseTable.columns) { + if ( + !helpers.hasColumn(userSchemaTable, databaseColumn.name) && + previousTable && + helpers.hasColumn(previousTable, databaseColumn.name) + ) { + removedColumns.push(databaseColumn); } } @@ -234,30 +258,36 @@ export default (db: Database) => { }; }; - const diffTableIndexes = (srcTable: Table, destTable: Table): IndexesDiff => { + const diffTableIndexes = (diffCtx: TableDiffContext): IndexesDiff => { + const { databaseTable, userSchemaTable, previousTable } = diffCtx; + const addedIndexes: Index[] = []; const updatedIndexes: IndexDiff['diff'][] = []; const unchangedIndexes: Index[] = []; const removedIndexes: Index[] = []; - for (const destIndex of destTable.indexes) { - const srcIndex = helpers.findIndex(srcTable, destIndex.name); - if (srcIndex) { - const { status, diff } = diffIndexes(srcIndex, destIndex); + for (const userSchemaIndex of userSchemaTable.indexes) { + const databaseIndex = helpers.findIndex(databaseTable, userSchemaIndex.name); + if (databaseIndex) { + const { status, diff } = diffIndexes(databaseIndex, userSchemaIndex); if (status === statuses.CHANGED) { updatedIndexes.push(diff); } else { - unchangedIndexes.push(srcIndex); + unchangedIndexes.push(databaseIndex); } } else { - addedIndexes.push(destIndex); + addedIndexes.push(userSchemaIndex); } } - for (const srcIndex of srcTable.indexes) { - if (!helpers.hasIndex(destTable, srcIndex.name)) { - removedIndexes.push(srcIndex); + for (const databaseIndex of databaseTable.indexes) { + if ( + !helpers.hasIndex(userSchemaTable, databaseIndex.name) && + previousTable && + helpers.hasIndex(previousTable, databaseIndex.name) + ) { + removedIndexes.push(databaseIndex); } } @@ -274,7 +304,9 @@ export default (db: Database) => { }; }; - const diffTableForeignKeys = (srcTable: Table, destTable: Table): ForeignKeysDiff => { + const diffTableForeignKeys = (diffCtx: TableDiffContext): ForeignKeysDiff => { + const { databaseTable, userSchemaTable, previousTable } = diffCtx; + const addedForeignKeys: ForeignKey[] = []; const updatedForeignKeys: ForeignKeyDiff['diff'][] = []; const unchangedForeignKeys: ForeignKey[] = []; @@ -292,24 +324,28 @@ export default (db: Database) => { }; } - for (const destForeignKey of destTable.foreignKeys) { - const srcForeignKey = helpers.findForeignKey(srcTable, destForeignKey.name); - if (srcForeignKey) { - const { status, diff } = diffForeignKeys(srcForeignKey, destForeignKey); + for (const userSchemaForeignKeys of userSchemaTable.foreignKeys) { + const databaseForeignKeys = helpers.findForeignKey(databaseTable, userSchemaForeignKeys.name); + if (databaseForeignKeys) { + const { status, diff } = diffForeignKeys(databaseForeignKeys, userSchemaForeignKeys); if (status === statuses.CHANGED) { updatedForeignKeys.push(diff); } else { - unchangedForeignKeys.push(srcForeignKey); + unchangedForeignKeys.push(databaseForeignKeys); } } else { - addedForeignKeys.push(destForeignKey); + addedForeignKeys.push(userSchemaForeignKeys); } } - for (const srcForeignKey of srcTable.foreignKeys) { - if (!helpers.hasForeignKey(destTable, srcForeignKey.name)) { - removedForeignKeys.push(srcForeignKey); + for (const databaseForeignKeys of databaseTable.foreignKeys) { + if ( + !helpers.hasForeignKey(userSchemaTable, databaseForeignKeys.name) && + previousTable && + helpers.hasForeignKey(previousTable, databaseForeignKeys.name) + ) { + removedForeignKeys.push(databaseForeignKeys); } } @@ -328,17 +364,19 @@ export default (db: Database) => { }; }; - const diffTables = (srcTable: Table, destTable: Table): TableDiff => { - const columnsDiff = diffTableColumns(srcTable, destTable); - const indexesDiff = diffTableIndexes(srcTable, destTable); - const foreignKeysDiff = diffTableForeignKeys(srcTable, destTable); + const diffTables = (diffCtx: TableDiffContext): TableDiff => { + const { databaseTable } = diffCtx; + + const columnsDiff = diffTableColumns(diffCtx); + const indexesDiff = diffTableIndexes(diffCtx); + const foreignKeysDiff = diffTableForeignKeys(diffCtx); const hasChanged = [columnsDiff, indexesDiff, foreignKeysDiff].some(hasChangedStatus); return { status: hasChanged ? statuses.CHANGED : statuses.UNCHANGED, diff: { - name: srcTable.name, + name: databaseTable.name, indexes: indexesDiff.diff, foreignKeys: foreignKeysDiff.diff, columns: columnsDiff.diff, @@ -346,27 +384,37 @@ export default (db: Database) => { }; }; - const diffSchemas = async (srcSchema: Schema, destSchema: Schema): Promise => { + const diffSchemas = async (schemaDiffCtx: SchemaDiffContext): Promise => { + const { previousSchema, databaseSchema, userSchema } = schemaDiffCtx; + const addedTables: Table[] = []; const updatedTables: TableDiff['diff'][] = []; const unchangedTables: Table[] = []; const removedTables: Table[] = []; - for (const destTable of destSchema.tables) { - const srcTable = helpers.findTable(srcSchema, destTable.name); - if (srcTable) { - const { status, diff } = diffTables(srcTable, destTable); + // for each table in the user schema, check if it already exists in the database schema + for (const userSchemaTable of userSchema.tables) { + const databaseTable = helpers.findTable(databaseSchema, userSchemaTable.name); + const previousTable = helpers.findTable(previousSchema, userSchemaTable.name); + + if (databaseTable) { + const { status, diff } = diffTables({ + previousTable, + databaseTable, + userSchemaTable, + }); if (status === statuses.CHANGED) { updatedTables.push(diff); } else { - unchangedTables.push(srcTable); + unchangedTables.push(databaseTable); } } else { - addedTables.push(destTable); + addedTables.push(userSchemaTable); } } + // maintain audit logs table from EE -> CE const parsePersistedTable = (persistedTable: string | Table) => { if (typeof persistedTable === 'string') { return persistedTable; @@ -374,8 +422,9 @@ export default (db: Database) => { return persistedTable.name; }; - const persistedTables = helpers.hasTable(srcSchema, 'strapi_core_store_settings') - ? (await strapi.store.get({ + const persistedTables = helpers.hasTable(databaseSchema, 'strapi_core_store_settings') + ? // TODO: replace with low level db query instead + (await strapi.store.get({ type: 'core', key: 'persisted_tables', })) ?? [] @@ -383,13 +432,22 @@ export default (db: Database) => { const reservedTables = [...RESERVED_TABLE_NAMES, ...persistedTables.map(parsePersistedTable)]; - type PersistedTable = { - name: string; - dependsOn?: Array<{ name: string }>; - }; + // for all tables in the database schema, check if they are not in the user schema + for (const databaseTable of databaseSchema.tables) { + // NOTE: if db table is not in the user schema and is not in the previous stored schema leave it alone. it is a user custom table that we should not touch + if ( + !helpers.hasTable(userSchema, databaseTable.name) && + !helpers.hasTable(previousSchema, databaseTable.name) + ) { + continue; + } - for (const srcTable of srcSchema.tables) { - if (!helpers.hasTable(destSchema, srcTable.name) && !reservedTables.includes(srcTable.name)) { + // if a db table is not in the user schema I want to delete it + if ( + !helpers.hasTable(userSchema, databaseTable.name) && + helpers.hasTable(previousSchema, databaseTable.name) && + !reservedTables.includes(databaseTable.name) + ) { const dependencies = persistedTables .filter((table: PersistedTable) => { const dependsOn = table?.dependsOn; @@ -398,15 +456,17 @@ export default (db: Database) => { return; } - return dependsOn.some((table) => table.name === srcTable.name); + return dependsOn.some((table) => table.name === databaseTable.name); }) .map((dependsOnTable: PersistedTable) => { - return srcSchema.tables.find((srcTable) => srcTable.name === dependsOnTable.name); + return databaseSchema.tables.find( + (databaseTable) => databaseTable.name === dependsOnTable.name + ); }) // In case the table is not found, filter undefined values .filter((table: PersistedTable) => !_.isNil(table)); - removedTables.push(srcTable, ...dependencies); + removedTables.push(databaseTable, ...dependencies); } } diff --git a/packages/core/database/src/schema/index.ts b/packages/core/database/src/schema/index.ts index 4d208b2960..08918530f6 100644 --- a/packages/core/database/src/schema/index.ts +++ b/packages/core/database/src/schema/index.ts @@ -74,9 +74,31 @@ export const createSchemaProvider = (db: Database): SchemaProvider => { async syncSchema() { debug('Synchronizing database schema'); - const DBSchema = await db.dialect.schemaInspector.getSchema(); + const databaseSchema = await db.dialect.schemaInspector.getSchema(); + const storedSchema = await this.schemaStorage.read(); + let previousSchema: Schema; - const { status, diff } = await this.schemaDiff.diff(DBSchema, this.schema); + if (!storedSchema) { + previousSchema = this.schema; + } else { + previousSchema = storedSchema.schema; + } + + /* + 3way diff - DB schema / previous metadataSchema / new metadataSchema + + - When something doesn't exist in the previous metadataSchema -> It's not tracked by us and should be ignored + - If no previous metadataSchema => use new metadataSchema so we start tracking them and ignore everything else + - Apply this logic to Tables / Columns / Indexes / FKs ... + - Handle errors (indexes or fks on incompatible stuff ...) + + */ + + const { status, diff } = await this.schemaDiff.diff({ + previousSchema, + databaseSchema, + userSchema: this.schema, + }); if (status === 'CHANGED') { await this.builder.updateSchema(diff); diff --git a/packages/core/database/src/schema/storage.ts b/packages/core/database/src/schema/storage.ts index 133ef25953..70a8a5f42d 100644 --- a/packages/core/database/src/schema/storage.ts +++ b/packages/core/database/src/schema/storage.ts @@ -24,7 +24,12 @@ export default (db: Database) => { }; return { - async read() { + async read(): Promise<{ + id: number; + time: Date; + hash: string; + schema: Schema; + } | null> { await checkTableExists(); const res = await db diff --git a/packages/core/types/src/struct/schema.ts b/packages/core/types/src/struct/schema.ts index 8e9a4a799c..ad00feb226 100644 --- a/packages/core/types/src/struct/schema.ts +++ b/packages/core/types/src/struct/schema.ts @@ -211,6 +211,13 @@ export interface ContentTypeSchema extends BaseSchema { * @internal */ indexes?: unknown[]; + + /** + * Optional attribute to indicate the foreignKeys to be created on the database for this content type. + * + * @internal + */ + foreignKeys?: unknown[]; } /** From bc6069db81837d95cbacd69b9ac929a94d3629e0 Mon Sep 17 00:00:00 2001 From: Alexandre Bodin Date: Fri, 21 Jun 2024 11:31:07 +0200 Subject: [PATCH 22/78] chore: disable --templates while we rework them --- .../src/create-strapi-app.ts | 22 ++++++++--------- packages/cli/create-strapi-app/src/types.ts | 2 +- packages/generators/app/src/create-project.ts | 24 +++++++++---------- packages/generators/app/src/index.ts | 1 - packages/generators/app/src/types.ts | 1 - 5 files changed, 24 insertions(+), 26 deletions(-) diff --git a/packages/cli/create-strapi-app/src/create-strapi-app.ts b/packages/cli/create-strapi-app/src/create-strapi-app.ts index 3a6e580f67..755be801f9 100644 --- a/packages/cli/create-strapi-app/src/create-strapi-app.ts +++ b/packages/cli/create-strapi-app/src/create-strapi-app.ts @@ -39,7 +39,7 @@ command .option('--dbfile ', 'Database file path for sqlite') // templates - .option('--template ', 'Specify a Strapi template') + // .option('--template ', 'Specify a Strapi template') .description('create a new application') .action((directory, options) => { createStrapiApp(directory, options); @@ -60,7 +60,7 @@ async function createStrapiApp(directory: string | undefined, options: Options) directory: appDirectory, useTypescript: true, packageManager: 'npm', - template: options.template, + // template: options.template, isQuickstart: options.quickstart, } as GenerateNewAppOptions; @@ -101,16 +101,16 @@ async function createStrapiApp(directory: string | undefined, options: Options) } async function validateOptions(options: Options) { - const programFlags = command - .createHelp() - .visibleOptions(command) - .reduce>((acc, { short, long }) => [...acc, short, long], []) - .filter(Boolean); + // const programFlags = command + // .createHelp() + // .visibleOptions(command) + // .reduce>((acc, { short, long }) => [...acc, short, long], []) + // .filter(Boolean); - if (options.template && programFlags.includes(options.template)) { - console.error(`${options.template} is not a valid template`); - process.exit(1); - } + // if (options.template && programFlags.includes(options.template)) { + // console.error(`${options.template} is not a valid template`); + // process.exit(1); + // } if (options.javascript === true && options.typescript === true) { console.error('You cannot use both --typescript (--ts) and --javascript (--js) flags together'); diff --git a/packages/cli/create-strapi-app/src/types.ts b/packages/cli/create-strapi-app/src/types.ts index 9da23b0959..a51c744149 100644 --- a/packages/cli/create-strapi-app/src/types.ts +++ b/packages/cli/create-strapi-app/src/types.ts @@ -12,7 +12,7 @@ export interface Options { dbpassword?: string; dbssl?: string; dbfile?: string; - template?: string; + // template?: string; typescript?: boolean; javascript?: boolean; } diff --git a/packages/generators/app/src/create-project.ts b/packages/generators/app/src/create-project.ts index 7b34354158..e28cff94dc 100644 --- a/packages/generators/app/src/create-project.ts +++ b/packages/generators/app/src/create-project.ts @@ -6,7 +6,7 @@ import execa from 'execa'; import stopProcess from './utils/stop-process'; import { trackUsage } from './utils/usage'; -import mergeTemplate from './utils/merge-template.js'; +// import mergeTemplate from './utils/merge-template.js'; import tryGitInit from './utils/git'; import createPackageJSON from './resources/json/common/package.json'; @@ -92,18 +92,18 @@ export default async function createProject(scope: Scope) { await trackUsage({ event: 'didCopyConfigurationFiles', scope }); // merge template files if a template is specified - const hasTemplate = Boolean(scope.template); - if (hasTemplate) { - try { - await mergeTemplate(scope, rootPath); - } catch (error) { - if (error instanceof Error) { - throw new Error(`⛔️ Template installation failed: ${error.message}`); - } + // const hasTemplate = Boolean(scope.template); + // if (hasTemplate) { + // try { + // await mergeTemplate(scope, rootPath); + // } catch (error) { + // if (error instanceof Error) { + // throw new Error(`⛔️ Template installation failed: ${error.message}`); + // } - throw error; - } - } + // throw error; + // } + // } } catch (err) { await fse.remove(scope.rootPath); throw err; diff --git a/packages/generators/app/src/index.ts b/packages/generators/app/src/index.ts index 5aa74dd3da..e2861c6c8f 100644 --- a/packages/generators/app/src/index.ts +++ b/packages/generators/app/src/index.ts @@ -37,7 +37,6 @@ export const generateNewApp = async (options: Options) => { template: options.template, packageJsonStrapi: { template: options.template, - starter: options.starter, }, uuid: (process.env.STRAPI_UUID_PREFIX || '') + crypto.randomUUID(), docker: process.env.DOCKER === 'true', diff --git a/packages/generators/app/src/types.ts b/packages/generators/app/src/types.ts index df0e3db1f6..652be23b76 100644 --- a/packages/generators/app/src/types.ts +++ b/packages/generators/app/src/types.ts @@ -27,7 +27,6 @@ export interface Options { runApp?: boolean; template?: string; - starter?: string; isQuickstart?: boolean; From 099cbbec8eb6db01243dae18860debe66e60541a Mon Sep 17 00:00:00 2001 From: Marc Roig Date: Fri, 21 Jun 2024 13:38:56 +0200 Subject: [PATCH 23/78] Merge branch 'develop' into v5/main (#20566) * Merge branch 'develop' into v5/main * fix: missing dependency * fix: yarn lock * fix: prettier * fix(cloud-cli): update types and structure for v5 (#20567) * chore: skip cloud deployment until ready * fix: webhook tests * chore: revert schema changes * fix: versions --------- Co-authored-by: Nathan Pichon --- .gitignore | 2 +- package.json | 3 +- packages/cli/cloud/.eslintignore | 4 + packages/cli/cloud/.eslintrc.js | 4 + packages/cli/cloud/LICENSE | 22 + packages/cli/cloud/README.md | 3 + packages/cli/cloud/bin/index.js | 7 + packages/cli/cloud/package.json | 79 ++ packages/cli/cloud/packup.config.ts | 20 + packages/cli/cloud/src/bin.ts | 34 + packages/cli/cloud/src/config/api.ts | 6 + packages/cli/cloud/src/config/local.ts | 57 ++ .../cli/cloud/src/create-project/action.ts | 73 ++ .../cli/cloud/src/create-project/command.ts | 17 + .../cli/cloud/src/create-project/index.ts | 12 + .../cli/cloud/src/deploy-project/action.ts | 196 ++++ .../cli/cloud/src/deploy-project/command.ts | 18 + .../cli/cloud/src/deploy-project/index.ts | 12 + packages/cli/cloud/src/index.ts | 56 ++ packages/cli/cloud/src/login/action.ts | 187 ++++ packages/cli/cloud/src/login/command.ts | 22 + packages/cli/cloud/src/login/index.ts | 12 + packages/cli/cloud/src/logout/action.ts | 29 + packages/cli/cloud/src/logout/command.ts | 18 + packages/cli/cloud/src/logout/index.ts | 11 + packages/cli/cloud/src/services/build-logs.ts | 75 ++ packages/cli/cloud/src/services/cli-api.ts | 129 +++ packages/cli/cloud/src/services/index.ts | 4 + packages/cli/cloud/src/services/logger.ts | 168 ++++ .../cli/cloud/src/services/notification.ts | 47 + .../cloud/src/services/strapi-info-save.ts | 30 + packages/cli/cloud/src/services/token.ts | 146 +++ packages/cli/cloud/src/types.ts | 49 + .../cli/cloud/src/utils/compress-files.ts | 89 ++ packages/cli/cloud/src/utils/helpers.ts | 45 + packages/cli/cloud/src/utils/pkg.ts | 131 +++ .../src/utils/tests/compress-files.test.ts | 37 + packages/cli/cloud/tsconfig.build.json | 8 + packages/cli/cloud/tsconfig.eslint.json | 3 + packages/cli/cloud/tsconfig.json | 5 + packages/cli/create-strapi-app/package.json | 2 + packages/cli/create-strapi-app/src/cloud.ts | 107 +++ .../src/create-strapi-app.ts | 10 + packages/cli/create-strapi-app/src/types.ts | 1 + .../src/utils/parse-to-chalk.ts | 24 + .../admin/admin/src/components/NpsSurvey.tsx | 4 +- .../src/components/tests/NpsSurvey.test.tsx | 4 +- .../Settings/pages/Webhooks/EditPage.tsx | 11 +- .../pages/Webhooks/hooks/useWebhooks.ts | 7 +- packages/core/admin/package.json | 3 + .../admin/server/src/controllers/webhooks.ts | 28 +- packages/core/strapi/package.json | 3 + .../core/strapi/src/cli/commands/index.ts | 7 + packages/core/strapi/src/cli/index.ts | 6 +- packages/core/strapi/src/cli/types.ts | 2 +- packages/core/strapi/src/cli/utils/logger.ts | 79 +- packages/generators/app/src/create-project.ts | 3 + packages/generators/app/src/index.ts | 4 +- .../src/resources/dot-files/common/gitignore | 1 + .../src/resources/json/common/package.json.ts | 1 + .../api/core/admin/admin-webhooks.test.api.ts | 139 +++ yarn.lock | 905 +++++++++++++++++- 62 files changed, 3153 insertions(+), 68 deletions(-) create mode 100644 packages/cli/cloud/.eslintignore create mode 100644 packages/cli/cloud/.eslintrc.js create mode 100644 packages/cli/cloud/LICENSE create mode 100644 packages/cli/cloud/README.md create mode 100755 packages/cli/cloud/bin/index.js create mode 100644 packages/cli/cloud/package.json create mode 100644 packages/cli/cloud/packup.config.ts create mode 100644 packages/cli/cloud/src/bin.ts create mode 100644 packages/cli/cloud/src/config/api.ts create mode 100644 packages/cli/cloud/src/config/local.ts create mode 100644 packages/cli/cloud/src/create-project/action.ts create mode 100644 packages/cli/cloud/src/create-project/command.ts create mode 100644 packages/cli/cloud/src/create-project/index.ts create mode 100644 packages/cli/cloud/src/deploy-project/action.ts create mode 100644 packages/cli/cloud/src/deploy-project/command.ts create mode 100644 packages/cli/cloud/src/deploy-project/index.ts create mode 100644 packages/cli/cloud/src/index.ts create mode 100644 packages/cli/cloud/src/login/action.ts create mode 100644 packages/cli/cloud/src/login/command.ts create mode 100644 packages/cli/cloud/src/login/index.ts create mode 100644 packages/cli/cloud/src/logout/action.ts create mode 100644 packages/cli/cloud/src/logout/command.ts create mode 100644 packages/cli/cloud/src/logout/index.ts create mode 100644 packages/cli/cloud/src/services/build-logs.ts create mode 100644 packages/cli/cloud/src/services/cli-api.ts create mode 100644 packages/cli/cloud/src/services/index.ts create mode 100644 packages/cli/cloud/src/services/logger.ts create mode 100644 packages/cli/cloud/src/services/notification.ts create mode 100644 packages/cli/cloud/src/services/strapi-info-save.ts create mode 100644 packages/cli/cloud/src/services/token.ts create mode 100644 packages/cli/cloud/src/types.ts create mode 100644 packages/cli/cloud/src/utils/compress-files.ts create mode 100644 packages/cli/cloud/src/utils/helpers.ts create mode 100644 packages/cli/cloud/src/utils/pkg.ts create mode 100644 packages/cli/cloud/src/utils/tests/compress-files.test.ts create mode 100644 packages/cli/cloud/tsconfig.build.json create mode 100644 packages/cli/cloud/tsconfig.eslint.json create mode 100644 packages/cli/cloud/tsconfig.json create mode 100644 packages/cli/create-strapi-app/src/cloud.ts create mode 100644 packages/cli/create-strapi-app/src/utils/parse-to-chalk.ts create mode 100644 tests/api/core/admin/admin-webhooks.test.api.ts diff --git a/.gitignore b/.gitignore index c3fbe1ae7d..a59af4f94f 100644 --- a/.gitignore +++ b/.gitignore @@ -156,4 +156,4 @@ tests/cli/.env # Strapi ############################ examples/**/types/generated -.nx/cache \ No newline at end of file +.nx/cache diff --git a/package.json b/package.json index 3f08ef031c..efcf583f30 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,8 @@ "prettier:write": "prettier --write \"**/*.{js,ts,jsx,tsx,json,md,mdx,css,scss,yaml,yml}\"", "setup": "yarn && yarn clean && yarn build --skip-nx-cache", "test:api": "node tests/scripts/run-api-tests.js", - "test:clean": "rimraf ./coverage", + "test:api:clean": "rimraf ./coverage", + "test:clean": "yarn test:api:clean && yarn test:e2e:clean", "test:cli": "node tests/scripts/run-cli-tests.js", "test:cli:clean": "node tests/scripts/run-cli-tests.js clean", "test:cli:debug": "node tests/scripts/run-cli-tests.js --debug", diff --git a/packages/cli/cloud/.eslintignore b/packages/cli/cloud/.eslintignore new file mode 100644 index 0000000000..3933753720 --- /dev/null +++ b/packages/cli/cloud/.eslintignore @@ -0,0 +1,4 @@ +node_modules/ +.eslintrc.js +dist/ +bin/ diff --git a/packages/cli/cloud/.eslintrc.js b/packages/cli/cloud/.eslintrc.js new file mode 100644 index 0000000000..a165f57061 --- /dev/null +++ b/packages/cli/cloud/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: ['custom/back/typescript'], +}; diff --git a/packages/cli/cloud/LICENSE b/packages/cli/cloud/LICENSE new file mode 100644 index 0000000000..db018546b5 --- /dev/null +++ b/packages/cli/cloud/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2015-present Strapi Solutions SAS + +Portions of the Strapi software are licensed as follows: + +* All software that resides under an "ee/" directory (the “EE Software”), if that directory exists, is licensed under the license defined in "ee/LICENSE". + +* All software outside of the above-mentioned directories or restrictions above is available under the "MIT Expat" license as set forth below. + +MIT Expat License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/cli/cloud/README.md b/packages/cli/cloud/README.md new file mode 100644 index 0000000000..7175098087 --- /dev/null +++ b/packages/cli/cloud/README.md @@ -0,0 +1,3 @@ +# Cloud CLI + +This package includes the `cloud` CLI to manage Strapi projects on the cloud. diff --git a/packages/cli/cloud/bin/index.js b/packages/cli/cloud/bin/index.js new file mode 100755 index 0000000000..a88ceaa195 --- /dev/null +++ b/packages/cli/cloud/bin/index.js @@ -0,0 +1,7 @@ +#!/usr/bin/env node + +'use strict'; + +const { runStrapiCloudCommand } = require('../dist/bin'); + +runStrapiCloudCommand(process.argv); diff --git a/packages/cli/cloud/package.json b/packages/cli/cloud/package.json new file mode 100644 index 0000000000..1f4fd94e07 --- /dev/null +++ b/packages/cli/cloud/package.json @@ -0,0 +1,79 @@ +{ + "name": "@strapi/cloud-cli", + "version": "5.0.0-beta.14", + "description": "Commands to interact with the Strapi Cloud", + "keywords": [ + "strapi", + "cloud", + "cli" + ], + "homepage": "https://strapi.io", + "bugs": { + "url": "https://github.com/strapi/strapi/issues" + }, + "repository": { + "type": "git", + "url": "git://github.com/strapi/strapi.git" + }, + "license": "SEE LICENSE IN LICENSE", + "author": { + "name": "Strapi Solutions SAS", + "email": "hi@strapi.io", + "url": "https://strapi.io" + }, + "maintainers": [ + { + "name": "Strapi Solutions SAS", + "email": "hi@strapi.io", + "url": "https://strapi.io" + } + ], + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "source": "./src/index.ts", + "types": "./dist/src/index.d.ts", + "bin": "./bin/index.js", + "files": [ + "./dist", + "./bin" + ], + "scripts": { + "build": "pack-up build", + "clean": "run -T rimraf ./dist", + "lint": "run -T eslint .", + "watch": "pack-up watch" + }, + "dependencies": { + "@strapi/utils": "5.0.0-beta.14", + "axios": "1.6.0", + "chalk": "4.1.2", + "cli-progress": "3.12.0", + "commander": "8.3.0", + "eventsource": "2.0.2", + "fast-safe-stringify": "2.1.1", + "fs-extra": "10.0.0", + "inquirer": "8.2.5", + "jsonwebtoken": "9.0.0", + "jwks-rsa": "3.1.0", + "lodash": "4.17.21", + "minimatch": "9.0.3", + "open": "8.4.0", + "ora": "5.4.1", + "pkg-up": "3.1.0", + "tar": "6.1.13", + "xdg-app-paths": "8.3.0", + "yup": "0.32.9" + }, + "devDependencies": { + "@strapi/pack-up": "4.23.0", + "@types/cli-progress": "3.11.5", + "@types/eventsource": "1.1.15", + "@types/lodash": "^4.14.191", + "eslint-config-custom": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.14" + }, + "engines": { + "node": ">=18.0.0 <=20.x.x", + "npm": ">=6.0.0" + } +} diff --git a/packages/cli/cloud/packup.config.ts b/packages/cli/cloud/packup.config.ts new file mode 100644 index 0000000000..d676ac372c --- /dev/null +++ b/packages/cli/cloud/packup.config.ts @@ -0,0 +1,20 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { defineConfig } from '@strapi/pack-up'; + +export default defineConfig({ + bundles: [ + { + source: './src/index.ts', + import: './dist/index.js', + require: './dist/index.js', + types: './dist/index.d.ts', + runtime: 'node', + }, + { + source: './src/bin.ts', + require: './dist/bin.js', + runtime: 'node', + }, + ], + dist: './dist', +}); diff --git a/packages/cli/cloud/src/bin.ts b/packages/cli/cloud/src/bin.ts new file mode 100644 index 0000000000..d064fe48d9 --- /dev/null +++ b/packages/cli/cloud/src/bin.ts @@ -0,0 +1,34 @@ +import { Command } from 'commander'; +import { createLogger } from './services'; +import { CLIContext } from './types'; +import { buildStrapiCloudCommands } from './index'; + +function loadStrapiCloudCommand(argv = process.argv, command = new Command()) { + // Initial program setup + command.storeOptionsAsProperties(false).allowUnknownOption(true); + + // Help command + command.helpOption('-h, --help', 'Display help for command'); + command.addHelpCommand('help [command]', 'Display help for command'); + + const cwd = process.cwd(); + + const hasDebug = argv.includes('--debug'); + const hasSilent = argv.includes('--silent'); + + const logger = createLogger({ debug: hasDebug, silent: hasSilent, timestamp: false }); + + const ctx = { + cwd, + logger, + } satisfies CLIContext; + + buildStrapiCloudCommands({ command, ctx, argv }); +} + +function runStrapiCloudCommand(argv = process.argv, command = new Command()) { + loadStrapiCloudCommand(argv, command); + command.parse(argv); +} + +export { runStrapiCloudCommand }; diff --git a/packages/cli/cloud/src/config/api.ts b/packages/cli/cloud/src/config/api.ts new file mode 100644 index 0000000000..018ca578d1 --- /dev/null +++ b/packages/cli/cloud/src/config/api.ts @@ -0,0 +1,6 @@ +import { env } from '@strapi/utils'; + +export const apiConfig = { + apiBaseUrl: env('STRAPI_CLI_CLOUD_API', 'https://cloud-cli-api.strapi.io'), + dashboardBaseUrl: env('STRAPI_CLI_CLOUD_DASHBOARD', 'https://cloud.strapi.io'), +}; diff --git a/packages/cli/cloud/src/config/local.ts b/packages/cli/cloud/src/config/local.ts new file mode 100644 index 0000000000..5ccb524210 --- /dev/null +++ b/packages/cli/cloud/src/config/local.ts @@ -0,0 +1,57 @@ +import path from 'path'; +import os from 'os'; +import fse from 'fs-extra'; +import XDGAppPaths from 'xdg-app-paths'; + +const APP_FOLDER_NAME = 'com.strapi.cli'; + +export const CONFIG_FILENAME = 'config.json'; + +export type LocalConfig = { + token?: string; + deviceId?: string; +}; + +async function checkDirectoryExists(directoryPath: string) { + try { + const fsStat = await fse.lstat(directoryPath); + return fsStat.isDirectory(); + } catch (e) { + return false; + } +} + +// Determine storage path based on the operating system +export async function getTmpStoragePath() { + const storagePath = path.join(os.tmpdir(), APP_FOLDER_NAME); + await fse.ensureDir(storagePath); + return storagePath; +} + +async function getConfigPath() { + const configDirs = XDGAppPaths(APP_FOLDER_NAME).configDirs(); + const configPath = configDirs.find(checkDirectoryExists); + + if (!configPath) { + await fse.ensureDir(configDirs[0]); + return configDirs[0]; + } + return configPath; +} + +export async function getLocalConfig(): Promise { + const configPath = await getConfigPath(); + const configFilePath = path.join(configPath, CONFIG_FILENAME); + await fse.ensureFile(configFilePath); + try { + return await fse.readJSON(configFilePath, { encoding: 'utf8', throws: true }); + } catch (e) { + return {}; + } +} + +export async function saveLocalConfig(data: LocalConfig) { + const configPath = await getConfigPath(); + const configFilePath = path.join(configPath, CONFIG_FILENAME); + await fse.writeJson(configFilePath, data, { encoding: 'utf8', spaces: 2, mode: 0o600 }); +} diff --git a/packages/cli/cloud/src/create-project/action.ts b/packages/cli/cloud/src/create-project/action.ts new file mode 100644 index 0000000000..61253b13a0 --- /dev/null +++ b/packages/cli/cloud/src/create-project/action.ts @@ -0,0 +1,73 @@ +import inquirer from 'inquirer'; +import { AxiosError } from 'axios'; +import { defaults } from 'lodash/fp'; +import type { CLIContext, ProjectAnswers, ProjectInput } from '../types'; +import { tokenServiceFactory, cloudApiFactory, local } from '../services'; + +async function handleError(ctx: CLIContext, error: Error) { + const tokenService = await tokenServiceFactory(ctx); + const { logger } = ctx; + + logger.debug(error); + if (error instanceof AxiosError) { + const errorMessage = typeof error.response?.data === 'string' ? error.response.data : null; + switch (error.response?.status) { + case 401: + logger.error('Your session has expired. Please log in again.'); + await tokenService.eraseToken(); + return; + case 403: + logger.error( + errorMessage || + 'You do not have permission to create a project. Please contact support for assistance.' + ); + return; + case 400: + logger.error(errorMessage || 'Invalid input. Please check your inputs and try again.'); + return; + case 503: + logger.error( + 'Strapi Cloud project creation is currently unavailable. Please try again later.' + ); + return; + default: + if (errorMessage) { + logger.error(errorMessage); + return; + } + break; + } + } + logger.error( + 'We encountered an issue while creating your project. Please try again in a moment. If the problem persists, contact support for assistance.' + ); +} + +export default async (ctx: CLIContext) => { + const { logger } = ctx; + const { getValidToken } = await tokenServiceFactory(ctx); + + const token = await getValidToken(); + if (!token) { + return; + } + const cloudApi = await cloudApiFactory(token); + const { data: config } = await cloudApi.config(); + const { questions, defaults: defaultValues } = config.projectCreation; + + const projectAnswersDefaulted = defaults(defaultValues); + const projectAnswers = await inquirer.prompt(questions); + + const projectInput: ProjectInput = projectAnswersDefaulted(projectAnswers); + + const spinner = logger.spinner('Setting up your project...').start(); + try { + const { data } = await cloudApi.createProject(projectInput); + await local.save({ project: data }); + spinner.succeed('Project created successfully!'); + return data; + } catch (e: Error | unknown) { + spinner.fail('Failed to create project on Strapi Cloud.'); + await handleError(ctx, e as Error); + } +}; diff --git a/packages/cli/cloud/src/create-project/command.ts b/packages/cli/cloud/src/create-project/command.ts new file mode 100644 index 0000000000..e084eb971c --- /dev/null +++ b/packages/cli/cloud/src/create-project/command.ts @@ -0,0 +1,17 @@ +import { createCommand } from 'commander'; +import { type StrapiCloudCommand } from '../types'; +import { runAction } from '../utils/helpers'; +import action from './action'; + +/** + * `$ create project in Strapi cloud` + */ +const command: StrapiCloudCommand = ({ ctx }) => { + return createCommand('cloud:create-project') + .description('Create a Strapi Cloud project') + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('cloud:create-project', action)(ctx)); +}; + +export default command; diff --git a/packages/cli/cloud/src/create-project/index.ts b/packages/cli/cloud/src/create-project/index.ts new file mode 100644 index 0000000000..4b8e5bc83b --- /dev/null +++ b/packages/cli/cloud/src/create-project/index.ts @@ -0,0 +1,12 @@ +import action from './action'; +import command from './command'; +import type { StrapiCloudCommandInfo } from '../types'; + +export { action, command }; + +export default { + name: 'create-project', + description: 'Create a new project', + action, + command, +} as StrapiCloudCommandInfo; diff --git a/packages/cli/cloud/src/deploy-project/action.ts b/packages/cli/cloud/src/deploy-project/action.ts new file mode 100644 index 0000000000..5bbe48cadf --- /dev/null +++ b/packages/cli/cloud/src/deploy-project/action.ts @@ -0,0 +1,196 @@ +import fse from 'fs-extra'; +import path from 'path'; +import chalk from 'chalk'; +import { AxiosError } from 'axios'; +import * as crypto from 'node:crypto'; +import { apiConfig } from '../config/api'; +import { compressFilesToTar } from '../utils/compress-files'; +import createProjectAction from '../create-project/action'; +import type { CLIContext, ProjectInfos } from '../types'; +import { getTmpStoragePath } from '../config/local'; +import { cloudApiFactory, tokenServiceFactory, local } from '../services'; +import { notificationServiceFactory } from '../services/notification'; +import { loadPkg } from '../utils/pkg'; +import { buildLogsServiceFactory } from '../services/build-logs'; + +type PackageJson = { + name: string; + strapi?: { + uuid: string; + }; +}; + +async function upload( + ctx: CLIContext, + project: ProjectInfos, + token: string, + maxProjectFileSize: number +) { + const cloudApi = await cloudApiFactory(token); + // * Upload project + try { + const storagePath = await getTmpStoragePath(); + const projectFolder = path.resolve(process.cwd()); + const packageJson = (await loadPkg(ctx)) as PackageJson; + + if (!packageJson) { + ctx.logger.error( + 'Unable to deploy the project. Please make sure the package.json file is correctly formatted.' + ); + return; + } + + ctx.logger.log('📦 Compressing project...'); + // hash packageJson.name to avoid conflicts + const hashname = crypto.createHash('sha512').update(packageJson.name).digest('hex'); + const compressedFilename = `${hashname}.tar.gz`; + try { + ctx.logger.debug( + 'Compression parameters\n', + `Storage path: ${storagePath}\n`, + `Project folder: ${projectFolder}\n`, + `Compressed filename: ${compressedFilename}` + ); + await compressFilesToTar(storagePath, projectFolder, compressedFilename); + ctx.logger.log('📦 Project compressed successfully!'); + } catch (e: unknown) { + ctx.logger.error( + '⚠️ Project compression failed. Try again later or check for large/incompatible files.' + ); + ctx.logger.debug(e); + process.exit(1); + } + + const tarFilePath = path.resolve(storagePath, compressedFilename); + const fileStats = await fse.stat(tarFilePath); + + if (fileStats.size > maxProjectFileSize) { + ctx.logger.log( + 'Unable to proceed: Your project is too big to be transferred, please use a git repo instead.' + ); + try { + await fse.remove(tarFilePath); + } catch (e: any) { + ctx.logger.log('Unable to remove file: ', tarFilePath); + ctx.logger.debug(e); + } + return; + } + + ctx.logger.info('🚀 Uploading project...'); + const progressBar = ctx.logger.progressBar(100, 'Upload Progress'); + + try { + const { data } = await cloudApi.deploy( + { filePath: tarFilePath, project }, + { + onUploadProgress(progressEvent) { + const total = progressEvent.total || fileStats.size; + const percentage = Math.round((progressEvent.loaded * 100) / total); + progressBar.update(percentage); + }, + } + ); + + progressBar.update(100); + progressBar.stop(); + ctx.logger.success('✨ Upload finished!'); + return data.build_id; + } catch (e: any) { + progressBar.stop(); + if (e instanceof AxiosError && e.response?.data) { + if (e.response.status === 404) { + ctx.logger.error( + `The project does not exist. Remove the ${local.LOCAL_SAVE_FILENAME} file and try again.` + ); + } else { + ctx.logger.error(e.response.data); + } + } else { + ctx.logger.error('An error occurred while deploying the project. Please try again later.'); + } + + ctx.logger.debug(e); + } finally { + await fse.remove(tarFilePath); + } + process.exit(0); + } catch (e: any) { + ctx.logger.error('An error occurred while deploying the project. Please try again later.'); + ctx.logger.debug(e); + process.exit(1); + } +} + +async function getProject(ctx: CLIContext) { + const { project } = await local.retrieve(); + if (!project) { + try { + return await createProjectAction(ctx); + } catch (e: any) { + ctx.logger.error('An error occurred while deploying the project. Please try again later.'); + ctx.logger.debug(e); + process.exit(1); + } + } + return project; +} + +export default async (ctx: CLIContext) => { + const { getValidToken } = await tokenServiceFactory(ctx); + const cloudApiService = await cloudApiFactory(); + const token = await getValidToken(); + + if (!token) { + return; + } + + const project = await getProject(ctx); + + if (!project) { + return; + } + + try { + await cloudApiService.track('willDeployWithCLI', { projectInternalName: project.name }); + } catch (e) { + ctx.logger.debug('Failed to track willDeploy', e); + } + + const notificationService = notificationServiceFactory(ctx); + const buildLogsService = buildLogsServiceFactory(ctx); + + const { data: cliConfig } = await cloudApiService.config(); + + let maxSize: number = parseInt(cliConfig.maxProjectFileSize, 10); + if (Number.isNaN(maxSize)) { + ctx.logger.debug( + 'An error occurred while parsing the maxProjectFileSize. Using default value.' + ); + maxSize = 100000000; + } + + const buildId = await upload(ctx, project, token, maxSize); + + if (!buildId) { + return; + } + + try { + notificationService(`${apiConfig.apiBaseUrl}/notifications`, token, cliConfig); + await buildLogsService(`${apiConfig.apiBaseUrl}/v1/logs/${buildId}`, token, cliConfig); + + ctx.logger.log( + 'Visit the following URL for deployment logs. Your deployment will be available here shortly.' + ); + ctx.logger.log( + chalk.underline(`${apiConfig.dashboardBaseUrl}/projects/${project.name}/deployments`) + ); + } catch (e: Error | unknown) { + if (e instanceof Error) { + ctx.logger.error(e.message); + } else { + throw e; + } + } +}; diff --git a/packages/cli/cloud/src/deploy-project/command.ts b/packages/cli/cloud/src/deploy-project/command.ts new file mode 100644 index 0000000000..ee767593dc --- /dev/null +++ b/packages/cli/cloud/src/deploy-project/command.ts @@ -0,0 +1,18 @@ +import { createCommand } from 'commander'; +import { type StrapiCloudCommand } from '../types'; +import { runAction } from '../utils/helpers'; +import action from './action'; + +/** + * `$ deploy project to the cloud` + */ +const command: StrapiCloudCommand = ({ ctx }) => { + return createCommand('cloud:deploy') + .alias('deploy') + .description('Deploy a Strapi Cloud project') + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('deploy', action)(ctx)); +}; + +export default command; diff --git a/packages/cli/cloud/src/deploy-project/index.ts b/packages/cli/cloud/src/deploy-project/index.ts new file mode 100644 index 0000000000..91df9ab4ae --- /dev/null +++ b/packages/cli/cloud/src/deploy-project/index.ts @@ -0,0 +1,12 @@ +import action from './action'; +import command from './command'; +import type { StrapiCloudCommandInfo } from '../types'; + +export { action, command }; + +export default { + name: 'deploy-project', + description: 'Deploy a Strapi Cloud project', + action, + command, +} as StrapiCloudCommandInfo; diff --git a/packages/cli/cloud/src/index.ts b/packages/cli/cloud/src/index.ts new file mode 100644 index 0000000000..06e12a9d6b --- /dev/null +++ b/packages/cli/cloud/src/index.ts @@ -0,0 +1,56 @@ +import { Command } from 'commander'; +import crypto from 'crypto'; +import deployProject from './deploy-project'; +import login from './login'; +import logout from './logout'; +import createProject from './create-project'; +import { CLIContext } from './types'; +import { getLocalConfig, saveLocalConfig } from './config/local'; + +export const cli = { + deployProject, + login, + logout, + createProject, +}; + +const cloudCommands = [deployProject, login, logout]; + +async function initCloudCLIConfig() { + const localConfig = await getLocalConfig(); + + if (!localConfig.deviceId) { + localConfig.deviceId = crypto.randomUUID(); + } + + await saveLocalConfig(localConfig); +} + +export async function buildStrapiCloudCommands({ + command, + ctx, + argv, +}: { + command: Command; + ctx: CLIContext; + argv: string[]; +}) { + await initCloudCLIConfig(); + // Load all commands + for (const cloudCommand of cloudCommands) { + try { + // Add this command to the Commander command object + const subCommand = await cloudCommand.command({ command, ctx, argv }); + + if (subCommand) { + command.addCommand(subCommand); + } + } catch (e) { + console.error(`Failed to load command ${cloudCommand.name}`, e); + } + } +} + +export * as services from './services'; + +export * from './types'; diff --git a/packages/cli/cloud/src/login/action.ts b/packages/cli/cloud/src/login/action.ts new file mode 100644 index 0000000000..dcc5555f73 --- /dev/null +++ b/packages/cli/cloud/src/login/action.ts @@ -0,0 +1,187 @@ +import axios, { AxiosResponse, AxiosError } from 'axios'; +import chalk from 'chalk'; +import { tokenServiceFactory, cloudApiFactory } from '../services'; +import type { CloudCliConfig, CLIContext } from '../types'; +import { apiConfig } from '../config/api'; + +const openModule = import('open'); + +export default async (ctx: CLIContext): Promise => { + const { logger } = ctx; + const tokenService = await tokenServiceFactory(ctx); + const existingToken = await tokenService.retrieveToken(); + const cloudApiService = await cloudApiFactory(existingToken || undefined); + + const trackFailedLogin = async () => { + try { + await cloudApiService.track('didNotLogin', { loginMethod: 'cli' }); + } catch (e) { + logger.debug('Failed to track failed login', e); + } + }; + + if (existingToken) { + const isTokenValid = await tokenService.isTokenValid(existingToken); + if (isTokenValid) { + try { + const userInfo = await cloudApiService.getUserInfo(); + const { email } = userInfo.data.data; + if (email) { + logger.log(`You are already logged into your account (${email}).`); + } else { + logger.log('You are already logged in.'); + } + logger.log( + 'To access your dashboard, please copy and paste the following URL into your web browser:' + ); + logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`)); + return true; + } catch (e) { + logger.debug('Failed to fetch user info', e); + // If the token is invalid and request failed, we should proceed with the login process + } + } + } + + let cliConfig: CloudCliConfig; + try { + logger.info('🔌 Connecting to the Strapi Cloud API...'); + const config = await cloudApiService.config(); + cliConfig = config.data; + } catch (e: unknown) { + logger.error('🥲 Oops! Something went wrong while logging you in. Please try again.'); + logger.debug(e); + return false; + } + + try { + await cloudApiService.track('willLoginAttempt', {}); + } catch (e) { + logger.debug('Failed to track login attempt', e); + } + + logger.debug('🔐 Creating device authentication request...', { + client_id: cliConfig.clientId, + scope: cliConfig.scope, + audience: cliConfig.audience, + }); + const deviceAuthResponse = (await axios + .post(cliConfig.deviceCodeAuthUrl, { + client_id: cliConfig.clientId, + scope: cliConfig.scope, + audience: cliConfig.audience, + }) + .catch((e: AxiosError) => { + logger.error('There was an issue with the authentication process. Please try again.'); + if (e.message) { + logger.debug(e.message, e); + } else { + logger.debug(e); + } + })) as AxiosResponse; + + openModule.then((open) => { + open.default(deviceAuthResponse.data.verification_uri_complete).catch((e: Error) => { + logger.error('We encountered an issue opening the browser. Please try again later.'); + logger.debug(e.message, e); + }); + }); + + logger.log('If a browser tab does not open automatically, please follow the next steps:'); + logger.log( + `1. Open this url in your device: ${deviceAuthResponse.data.verification_uri_complete}` + ); + logger.log( + `2. Enter the following code: ${deviceAuthResponse.data.user_code} and confirm to login.\n` + ); + + const tokenPayload = { + grant_type: 'urn:ietf:params:oauth:grant-type:device_code', + device_code: deviceAuthResponse.data.device_code, + client_id: cliConfig.clientId, + }; + + let isAuthenticated = false; + + const authenticate = async () => { + const spinner = logger.spinner('Waiting for authentication'); + spinner.start(); + const spinnerFail = () => spinner.fail('Authentication failed!'); + + while (!isAuthenticated) { + try { + const tokenResponse = await axios.post(cliConfig.tokenUrl, tokenPayload); + const authTokenData = tokenResponse.data; + + if (tokenResponse.status === 200) { + // Token validation + try { + logger.debug('🔐 Validating token...'); + await tokenService.validateToken(authTokenData.id_token, cliConfig.jwksUrl); + logger.debug('🔐 Token validation successful!'); + } catch (e: any) { + logger.debug(e); + spinnerFail(); + throw new Error('Unable to proceed: Token validation failed'); + } + + logger.debug('🔍 Fetching user information...'); + const cloudApiServiceWithToken = await cloudApiFactory(authTokenData.access_token); + // Call to get user info to create the user in DB if not exists + await cloudApiServiceWithToken.getUserInfo(); + logger.debug('🔍 User information fetched successfully!'); + + try { + logger.debug('📝 Saving login information...'); + await tokenService.saveToken(authTokenData.access_token); + logger.debug('📝 Login information saved successfully!'); + isAuthenticated = true; + } catch (e) { + logger.error( + 'There was a problem saving your login information. Please try logging in again.' + ); + logger.debug(e); + spinnerFail(); + return false; + } + } + } catch (e: any) { + if (e.message === 'Unable to proceed: Token validation failed') { + logger.error( + 'There seems to be a problem with your login information. Please try logging in again.' + ); + spinnerFail(); + await trackFailedLogin(); + return false; + } + if ( + e.response?.data.error && + !['authorization_pending', 'slow_down'].includes(e!.response.data.error) + ) { + logger.debug(e); + spinnerFail(); + await trackFailedLogin(); + return false; + } + // Await interval before retrying + await new Promise((resolve) => { + setTimeout(resolve, deviceAuthResponse.data.interval * 1000); + }); + } + } + spinner.succeed('Authentication successful!'); + logger.log('You are now logged into Strapi Cloud.'); + logger.log( + 'To access your dashboard, please copy and paste the following URL into your web browser:' + ); + logger.log(chalk.underline(`${apiConfig.dashboardBaseUrl}/projects`)); + try { + await cloudApiService.track('didLogin', { loginMethod: 'cli' }); + } catch (e) { + logger.debug('Failed to track login', e); + } + }; + + await authenticate(); + return isAuthenticated; +}; diff --git a/packages/cli/cloud/src/login/command.ts b/packages/cli/cloud/src/login/command.ts new file mode 100644 index 0000000000..fab1a54fd3 --- /dev/null +++ b/packages/cli/cloud/src/login/command.ts @@ -0,0 +1,22 @@ +import { createCommand } from 'commander'; +import type { StrapiCloudCommand } from '../types'; +import { runAction } from '../utils/helpers'; +import action from './action'; + +/** + * `$ cloud device flow login` + */ +const command: StrapiCloudCommand = ({ ctx }) => { + return createCommand('cloud:login') + .alias('login') + .description('Strapi Cloud Login') + .addHelpText( + 'after', + '\nAfter running this command, you will be prompted to enter your authentication information.' + ) + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('login', action)(ctx)); +}; + +export default command; diff --git a/packages/cli/cloud/src/login/index.ts b/packages/cli/cloud/src/login/index.ts new file mode 100644 index 0000000000..ee2c46650a --- /dev/null +++ b/packages/cli/cloud/src/login/index.ts @@ -0,0 +1,12 @@ +import action from './action'; +import command from './command'; +import type { StrapiCloudCommandInfo } from '../types'; + +export { action, command }; + +export default { + name: 'login', + description: 'Strapi Cloud Login', + action, + command, +} as StrapiCloudCommandInfo; diff --git a/packages/cli/cloud/src/logout/action.ts b/packages/cli/cloud/src/logout/action.ts new file mode 100644 index 0000000000..b387e0ca0c --- /dev/null +++ b/packages/cli/cloud/src/logout/action.ts @@ -0,0 +1,29 @@ +import type { CLIContext } from '../types'; +import { tokenServiceFactory, cloudApiFactory } from '../services'; + +export default async (ctx: CLIContext) => { + const { logger } = ctx; + const { retrieveToken, eraseToken } = await tokenServiceFactory(ctx); + + const token = await retrieveToken(); + if (!token) { + logger.log("You're already logged out."); + return; + } + const cloudApiService = await cloudApiFactory(token); + try { + // we might want also to perform extra actions like logging out from the auth0 tenant + await eraseToken(); + logger.log( + '🔌 You have been logged out from the CLI. If you are on a shared computer, please make sure to log out from the Strapi Cloud Dashboard as well.' + ); + } catch (e) { + logger.error('🥲 Oops! Something went wrong while logging you out. Please try again.'); + logger.debug(e); + } + try { + await cloudApiService.track('didLogout', { loginMethod: 'cli' }); + } catch (e) { + logger.debug('Failed to track logout event', e); + } +}; diff --git a/packages/cli/cloud/src/logout/command.ts b/packages/cli/cloud/src/logout/command.ts new file mode 100644 index 0000000000..33576fc80c --- /dev/null +++ b/packages/cli/cloud/src/logout/command.ts @@ -0,0 +1,18 @@ +import { createCommand } from 'commander'; +import type { StrapiCloudCommand } from '../types'; +import { runAction } from '../utils/helpers'; +import action from './action'; + +/** + * `$ cloud device flow logout` + */ +const command: StrapiCloudCommand = ({ ctx }) => { + return createCommand('cloud:logout') + .alias('logout') + .description('Strapi Cloud Logout') + .option('-d, --debug', 'Enable debugging mode with verbose logs') + .option('-s, --silent', "Don't log anything") + .action(() => runAction('logout', action)(ctx)); +}; + +export default command; diff --git a/packages/cli/cloud/src/logout/index.ts b/packages/cli/cloud/src/logout/index.ts new file mode 100644 index 0000000000..70308703aa --- /dev/null +++ b/packages/cli/cloud/src/logout/index.ts @@ -0,0 +1,11 @@ +import action from './action'; +import command from './command'; + +export { action, command }; + +export default { + name: 'logout', + description: 'Strapi Cloud Logout', + action, + command, +}; diff --git a/packages/cli/cloud/src/services/build-logs.ts b/packages/cli/cloud/src/services/build-logs.ts new file mode 100644 index 0000000000..922e54127c --- /dev/null +++ b/packages/cli/cloud/src/services/build-logs.ts @@ -0,0 +1,75 @@ +import EventSource from 'eventsource'; +import { CLIContext, type CloudCliConfig } from '../types'; + +const buildLogsServiceFactory = ({ logger }: CLIContext) => { + return async (url: string, token: string, cliConfig: CloudCliConfig) => { + const CONN_TIMEOUT = Number(cliConfig.buildLogsConnectionTimeout); + const MAX_RETRIES = Number(cliConfig.buildLogsMaxRetries); + + return new Promise((resolve, reject) => { + let timeoutId: NodeJS.Timeout | null = null; + let retries = 0; + + const connect = (url: string) => { + const spinner = logger.spinner('Connecting to server to get build logs'); + spinner.start(); + const es = new EventSource(`${url}`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + + const clearExistingTimeout = () => { + if (timeoutId) { + clearTimeout(timeoutId); + } + }; + + const resetTimeout = () => { + clearExistingTimeout(); + timeoutId = setTimeout(() => { + if (spinner.isSpinning) { + spinner.fail( + 'We were unable to connect to the server to get build logs at this time. This could be due to a temporary issue.' + ); + } + es.close(); + reject(new Error('Connection timed out')); + }, CONN_TIMEOUT); + }; + + es.onopen = resetTimeout; + + es.addEventListener('finished', (event) => { + const data = JSON.parse(event.data); + logger.log(data.msg); + es.close(); + clearExistingTimeout(); + resolve(null); + }); + + es.addEventListener('log', (event) => { + if (spinner.isSpinning) { + spinner.succeed(); + } + resetTimeout(); + const data = JSON.parse(event.data); + logger.log(data.msg); + }); + + es.onerror = async () => { + retries += 1; + if (retries > MAX_RETRIES) { + spinner.fail('We were unable to connect to the server to get build logs at this time.'); + es.close(); + reject(new Error('Max retries reached')); + } + }; + }; + + connect(url); + }); + }; +}; + +export { buildLogsServiceFactory }; diff --git a/packages/cli/cloud/src/services/cli-api.ts b/packages/cli/cloud/src/services/cli-api.ts new file mode 100644 index 0000000000..68e6e5c308 --- /dev/null +++ b/packages/cli/cloud/src/services/cli-api.ts @@ -0,0 +1,129 @@ +import axios, { type AxiosResponse } from 'axios'; +import fse from 'fs-extra'; +import os from 'os'; +import { apiConfig } from '../config/api'; +import type { CloudCliConfig } from '../types'; +import { getLocalConfig } from '../config/local'; + +import packageJson from '../../package.json'; + +export const VERSION = 'v1'; + +export type ProjectInfos = { + name: string; + nodeVersion: string; + region: string; + plan?: string; + url?: string; +}; +export type ProjectInput = Omit; + +export type DeployResponse = { + build_id: string; + image: string; +}; + +export type TrackPayload = Record; + +export interface CloudApiService { + deploy( + deployInput: { + filePath: string; + project: { name: string }; + }, + { + onUploadProgress, + }: { + onUploadProgress: (progressEvent: { loaded: number; total?: number }) => void; + } + ): Promise>; + + createProject(projectInput: ProjectInput): Promise<{ + data: ProjectInfos; + status: number; + }>; + + getUserInfo(): Promise; + + config(): Promise>; + + listProjects(): Promise>; + + track(event: string, payload?: TrackPayload): Promise>; +} + +export async function cloudApiFactory(token?: string): Promise { + const localConfig = await getLocalConfig(); + const customHeaders = { + 'x-device-id': localConfig.deviceId, + 'x-app-version': packageJson.version, + 'x-os-name': os.type(), + 'x-os-version': os.version(), + 'x-language': Intl.DateTimeFormat().resolvedOptions().locale, + 'x-node-version': process.versions.node, + }; + const axiosCloudAPI = axios.create({ + baseURL: `${apiConfig.apiBaseUrl}/${VERSION}`, + headers: { + 'Content-Type': 'application/json', + ...customHeaders, + }, + }); + + if (token) { + axiosCloudAPI.defaults.headers.Authorization = `Bearer ${token}`; + } + + return { + deploy({ filePath, project }, { onUploadProgress }) { + return axiosCloudAPI.post( + `/deploy/${project.name}`, + { file: fse.createReadStream(filePath) }, + { + headers: { + 'Content-Type': 'multipart/form-data', + }, + onUploadProgress, + } + ); + }, + + async createProject({ name, nodeVersion, region, plan }) { + const response = await axiosCloudAPI.post('/project', { + projectName: name, + region, + nodeVersion, + plan, + }); + + return { + data: { + id: response.data.id, + name: response.data.name, + nodeVersion: response.data.nodeVersion, + region: response.data.region, + }, + status: response.status, + }; + }, + + getUserInfo() { + return axiosCloudAPI.get('/user'); + }, + + config(): Promise> { + return axiosCloudAPI.get('/config'); + }, + + listProjects() { + return axiosCloudAPI.get('/projects'); + }, + + track(event, payload = {}) { + return axiosCloudAPI.post('/track', { + event, + payload, + }); + }, + }; +} diff --git a/packages/cli/cloud/src/services/index.ts b/packages/cli/cloud/src/services/index.ts new file mode 100644 index 0000000000..24e9edc020 --- /dev/null +++ b/packages/cli/cloud/src/services/index.ts @@ -0,0 +1,4 @@ +export { cloudApiFactory } from './cli-api'; +export * as local from './strapi-info-save'; +export { tokenServiceFactory } from './token'; +export { createLogger } from './logger'; diff --git a/packages/cli/cloud/src/services/logger.ts b/packages/cli/cloud/src/services/logger.ts new file mode 100644 index 0000000000..25d459ca63 --- /dev/null +++ b/packages/cli/cloud/src/services/logger.ts @@ -0,0 +1,168 @@ +import chalk from 'chalk'; +import stringify from 'fast-safe-stringify'; + +import ora from 'ora'; +import * as cliProgress from 'cli-progress'; + +export interface LoggerOptions { + silent?: boolean; + debug?: boolean; + timestamp?: boolean; +} + +export interface Logger { + warnings: number; + errors: number; + debug: (...args: unknown[]) => void; + info: (...args: unknown[]) => void; + success: (...args: unknown[]) => void; + warn: (...args: unknown[]) => void; + error: (...args: unknown[]) => void; + log: (...args: unknown[]) => void; + spinner: (text: string) => Pick; + progressBar: ( + totalSize: number, + text: string + ) => Pick; +} + +const stringifyArg = (arg: unknown) => { + return typeof arg === 'object' ? stringify(arg) : arg; +}; + +const createLogger = (options: LoggerOptions = {}): Logger => { + const { silent = false, debug = false, timestamp = true } = options; + + const state = { errors: 0, warning: 0 }; + + return { + get warnings() { + return state.warning; + }, + + get errors() { + return state.errors; + }, + + async debug(...args) { + if (silent || !debug) { + return; + } + + console.log( + chalk.cyan(`[DEBUG]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + info(...args) { + if (silent) { + return; + } + + console.info( + chalk.blue(`[INFO]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + log(...args) { + if (silent) { + return; + } + + console.info( + chalk.blue(`${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + success(...args) { + if (silent) { + return; + } + + console.info( + chalk.green(`[SUCCESS]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + warn(...args) { + state.warning += 1; + + if (silent) { + return; + } + + console.warn( + chalk.yellow(`[WARN]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + error(...args) { + state.errors += 1; + + if (silent) { + return; + } + + console.error( + chalk.red(`[ERROR]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args.map(stringifyArg) + ); + }, + + // @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what. + spinner(text: string) { + if (silent) { + return { + succeed() { + return this; + }, + fail() { + return this; + }, + start() { + return this; + }, + text: '', + isSpinning: false, + }; + } + + return ora(text); + }, + + progressBar(totalSize: number, text: string) { + if (silent) { + return { + start() { + return this; + }, + stop() { + return this; + }, + update() { + return this; + }, + }; + } + + const progressBar = new cliProgress.SingleBar({ + format: `${text ? `${text} |` : ''}${chalk.green('{bar}')}| {percentage}%`, + barCompleteChar: '\u2588', + barIncompleteChar: '\u2591', + hideCursor: true, + forceRedraw: true, + }); + + progressBar.start(totalSize, 0); + + return progressBar; + }, + }; +}; + +export { createLogger }; diff --git a/packages/cli/cloud/src/services/notification.ts b/packages/cli/cloud/src/services/notification.ts new file mode 100644 index 0000000000..6567f06049 --- /dev/null +++ b/packages/cli/cloud/src/services/notification.ts @@ -0,0 +1,47 @@ +import EventSource from 'eventsource'; +import type { CLIContext, CloudCliConfig } from '../types'; + +type Event = { + type: string; + data: string; + lastEventId: string; + origin: string; +}; + +export function notificationServiceFactory({ logger }: CLIContext) { + return (url: string, token: string, cliConfig: CloudCliConfig) => { + const CONN_TIMEOUT = Number(cliConfig.notificationsConnectionTimeout); + + const es = new EventSource(url, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + let timeoutId: NodeJS.Timeout; + + const resetTimeout = () => { + clearTimeout(timeoutId); + timeoutId = setTimeout(() => { + logger.log( + 'We were unable to connect to the server at this time. This could be due to a temporary issue. Please try again in a moment.' + ); + es.close(); + }, CONN_TIMEOUT); // 5 minutes + }; + + es.onopen = resetTimeout; + es.onmessage = (event: Event) => { + resetTimeout(); + const data = JSON.parse(event.data); + + if (data.message) { + logger.log(data.message); + } + + // Close connection when a specific event is received + if (data.event === 'deploymentFinished' || data.event === 'deploymentFailed') { + es.close(); + } + }; + }; +} diff --git a/packages/cli/cloud/src/services/strapi-info-save.ts b/packages/cli/cloud/src/services/strapi-info-save.ts new file mode 100644 index 0000000000..253fdaf7d2 --- /dev/null +++ b/packages/cli/cloud/src/services/strapi-info-save.ts @@ -0,0 +1,30 @@ +import fse from 'fs-extra'; +import path from 'path'; +import type { ProjectInfos } from './cli-api'; + +export const LOCAL_SAVE_FILENAME = '.strapi-cloud.json'; + +export type LocalSave = { + project?: ProjectInfos; +}; + +export async function save(data: LocalSave, { directoryPath }: { directoryPath?: string } = {}) { + const alreadyInFileData = await retrieve({ directoryPath }); + const storedData = { ...alreadyInFileData, ...data }; + const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME); + // Ensure the directory exists + await fse.ensureDir(path.dirname(pathToFile)); + await fse.writeJson(pathToFile, storedData, { encoding: 'utf8' }); +} + +export async function retrieve({ + directoryPath, +}: { directoryPath?: string } = {}): Promise { + const pathToFile = path.join(directoryPath || process.cwd(), LOCAL_SAVE_FILENAME); + const pathExists = await fse.pathExists(pathToFile); + if (!pathExists) { + return {}; + } + + return fse.readJSON(pathToFile, { encoding: 'utf8' }); +} diff --git a/packages/cli/cloud/src/services/token.ts b/packages/cli/cloud/src/services/token.ts new file mode 100644 index 0000000000..54447676f3 --- /dev/null +++ b/packages/cli/cloud/src/services/token.ts @@ -0,0 +1,146 @@ +import jwksClient, { type JwksClient, type SigningKey } from 'jwks-rsa'; +import type { JwtHeader, VerifyErrors } from 'jsonwebtoken'; +import jwt from 'jsonwebtoken'; +import { getLocalConfig, saveLocalConfig } from '../config/local'; +import type { CloudCliConfig, CLIContext } from '../types'; +import { cloudApiFactory } from './cli-api'; + +let cliConfig: CloudCliConfig; + +interface DecodedToken { + [key: string]: any; +} + +export async function tokenServiceFactory({ logger }: { logger: CLIContext['logger'] }) { + const cloudApiService = await cloudApiFactory(); + + async function saveToken(str: string) { + const appConfig = await getLocalConfig(); + + if (!appConfig) { + logger.error('There was a problem saving your token. Please try again.'); + return; + } + + appConfig.token = str; + + try { + await saveLocalConfig(appConfig); + } catch (e: Error | unknown) { + logger.debug(e); + logger.error('There was a problem saving your token. Please try again.'); + } + } + + async function retrieveToken() { + const appConfig = await getLocalConfig(); + if (appConfig.token) { + // check if token is still valid + if (await isTokenValid(appConfig.token)) { + return appConfig.token; + } + } + return undefined; + } + + async function validateToken(idToken: string, jwksUrl: string): Promise { + const client: JwksClient = jwksClient({ + jwksUri: jwksUrl, + }); + + // Get the Key from the JWKS using the token header's Key ID (kid) + const getKey = (header: JwtHeader, callback: (e: Error | null, key?: string) => void) => { + client.getSigningKey(header.kid, (e: Error | null, key?: SigningKey) => { + if (e) { + callback(e); + } else if (key) { + const publicKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey; + callback(null, publicKey); + } else { + callback(new Error('Key not found')); + } + }); + }; + + // Decode the JWT token to get the header and payload + const decodedToken = jwt.decode(idToken, { complete: true }) as DecodedToken; + if (!decodedToken) { + if (typeof idToken === 'undefined' || idToken === '') { + logger.warn('You need to be logged in to use this feature. Please log in and try again.'); + } else { + logger.error( + 'There seems to be a problem with your login information. Please try logging in again.' + ); + } + } + + // Verify the JWT token signature using the JWKS Key + return new Promise((resolve, reject) => { + jwt.verify(idToken, getKey, (err: VerifyErrors | null) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } + + async function isTokenValid(token: string) { + try { + const config = await cloudApiService.config(); + + cliConfig = config.data; + if (token) { + await validateToken(token, cliConfig.jwksUrl); + return true; + } + return false; + } catch (e) { + logger.debug(e); + return false; + } + } + + async function eraseToken() { + const appConfig = await getLocalConfig(); + if (!appConfig) { + return; + } + + delete appConfig.token; + + try { + await saveLocalConfig(appConfig); + } catch (e: Error | unknown) { + logger.debug(e); + logger.error( + 'There was an issue removing your login information. Please try logging out again.' + ); + throw e; + } + } + + async function getValidToken() { + const token = await retrieveToken(); + if (!token) { + logger.log('No token found. Please login first.'); + return null; + } + + if (!(await isTokenValid(token))) { + logger.log('Unable to proceed: Token is expired or not valid. Please login again.'); + return null; + } + return token; + } + + return { + saveToken, + retrieveToken, + validateToken, + isTokenValid, + eraseToken, + getValidToken, + }; +} diff --git a/packages/cli/cloud/src/types.ts b/packages/cli/cloud/src/types.ts new file mode 100644 index 0000000000..0e61489eb6 --- /dev/null +++ b/packages/cli/cloud/src/types.ts @@ -0,0 +1,49 @@ +import type { Command } from 'commander'; +import type { DistinctQuestion } from 'inquirer'; +import { Logger } from './services/logger'; + +export type ProjectAnswers = { + name: string; + nodeVersion: string; + region: string; + plan: string; +}; + +export type CloudCliConfig = { + clientId: string; + baseUrl: string; + deviceCodeAuthUrl: string; + audience: string; + scope: string; + tokenUrl: string; + jwksUrl: string; + projectCreation: { + questions: ReadonlyArray>; + defaults: Partial; + introText: string; + }; + buildLogsConnectionTimeout: string; + buildLogsMaxRetries: string; + notificationsConnectionTimeout: string; + maxProjectFileSize: string; +}; + +export interface CLIContext { + cwd: string; + logger: Logger; +} + +export type StrapiCloudCommand = (params: { + command: Command; + argv: string[]; + ctx: CLIContext; +}) => void | Command | Promise; + +export type StrapiCloudCommandInfo = { + name: string; + description: string; + command: StrapiCloudCommand; + action: (ctx: CLIContext) => Promise; +}; + +export type * from './services/cli-api'; diff --git a/packages/cli/cloud/src/utils/compress-files.ts b/packages/cli/cloud/src/utils/compress-files.ts new file mode 100644 index 0000000000..a08592951e --- /dev/null +++ b/packages/cli/cloud/src/utils/compress-files.ts @@ -0,0 +1,89 @@ +// TODO Migrate to fs-extra +import * as fs from 'fs'; +import * as tar from 'tar'; +import * as path from 'path'; +import { minimatch } from 'minimatch'; + +const IGNORED_PATTERNS = [ + '**/.git/**', + '**/node_modules/**', + '**/build/**', + '**/dist/**', + '**/.cache/**', + '**/.circleci/**', + '**/.github/**', + '**/.gitignore', + '**/.gitkeep', + '**/.gitlab-ci.yml', + '**/.idea/**', + '**/.vscode/**', +]; + +const getFiles = ( + dirPath: string, + ignorePatterns: string[] = [], + arrayOfFiles: string[] = [], + subfolder: string = '' +): string[] => { + const entries = fs.readdirSync(path.join(dirPath, subfolder)); + entries.forEach((entry) => { + const entryPathFromRoot = path.join(subfolder, entry); + const entryPath = path.relative(dirPath, entryPathFromRoot); + const isIgnored = isIgnoredFile(dirPath, entryPathFromRoot, ignorePatterns); + if (isIgnored) { + return; + } + if (fs.statSync(entryPath).isDirectory()) { + getFiles(dirPath, ignorePatterns, arrayOfFiles, entryPathFromRoot); + } else { + arrayOfFiles.push(entryPath); + } + }); + return arrayOfFiles; +}; + +const isIgnoredFile = (folderPath: string, file: string, ignorePatterns: string[]): boolean => { + ignorePatterns.push(...IGNORED_PATTERNS); + const relativeFilePath = path.join(folderPath, file); + let isIgnored = false; + for (const pattern of ignorePatterns) { + if (pattern.startsWith('!')) { + if (minimatch(relativeFilePath, pattern.slice(1), { matchBase: true, dot: true })) { + return false; + } + } else if (minimatch(relativeFilePath, pattern, { matchBase: true, dot: true })) { + if (path.basename(file) !== '.gitkeep') { + isIgnored = true; + } + } + } + return isIgnored; +}; + +const readGitignore = (folderPath: string): string[] => { + const gitignorePath = path.resolve(folderPath, '.gitignore'); + if (!fs.existsSync(gitignorePath)) return []; + const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8'); + return gitignoreContent + .split(/\r?\n/) + .filter((line) => Boolean(line.trim()) && !line.startsWith('#')); +}; + +const compressFilesToTar = async ( + storagePath: string, + folderToCompress: string, + filename: string +): Promise => { + const ignorePatterns = readGitignore(folderToCompress); + const filesToCompress = getFiles(folderToCompress, ignorePatterns); + + return tar.c( + { + gzip: true, + file: path.resolve(storagePath, filename), + }, + filesToCompress + ); +}; + +export { compressFilesToTar, isIgnoredFile }; diff --git a/packages/cli/cloud/src/utils/helpers.ts b/packages/cli/cloud/src/utils/helpers.ts new file mode 100644 index 0000000000..2fb4042599 --- /dev/null +++ b/packages/cli/cloud/src/utils/helpers.ts @@ -0,0 +1,45 @@ +import chalk from 'chalk'; +import { has } from 'lodash/fp'; + +// TODO: Remove duplicated code by extracting to a shared package + +const assertCwdContainsStrapiProject = (name: string) => { + const logErrorAndExit = () => { + console.log( + `You need to run ${chalk.yellow( + `strapi ${name}` + )} in a Strapi project. Make sure you are in the right directory.` + ); + process.exit(1); + }; + + try { + // eslint-disable-next-line @typescript-eslint/no-var-requires + const pkgJSON = require(`${process.cwd()}/package.json`); + if ( + !has('dependencies.@strapi/strapi', pkgJSON) && + !has('devDependencies.@strapi/strapi', pkgJSON) + ) { + logErrorAndExit(); + } + } catch (err) { + logErrorAndExit(); + } +}; + +const runAction = + (name: string, action: (...args: any[]) => Promise) => + (...args: unknown[]) => { + assertCwdContainsStrapiProject(name); + + Promise.resolve() + .then(() => { + return action(...args); + }) + .catch((error) => { + console.error(error); + process.exit(1); + }); + }; + +export { runAction }; diff --git a/packages/cli/cloud/src/utils/pkg.ts b/packages/cli/cloud/src/utils/pkg.ts new file mode 100644 index 0000000000..5deb2308e5 --- /dev/null +++ b/packages/cli/cloud/src/utils/pkg.ts @@ -0,0 +1,131 @@ +// TODO Migrate to fs-extra +import fs from 'fs/promises'; +import os from 'os'; +import pkgUp from 'pkg-up'; +import * as yup from 'yup'; +import chalk from 'chalk'; +import { Logger } from '../services/logger'; + +interface Export { + types?: string; + source: string; + module?: string; + import?: string; + require?: string; + default: string; +} + +const packageJsonSchema = yup.object({ + name: yup.string().required(), + exports: yup.lazy((value) => + yup + .object( + typeof value === 'object' + ? Object.entries(value).reduce( + (acc, [key, value]) => { + if (typeof value === 'object') { + acc[key] = yup + .object({ + types: yup.string().optional(), + source: yup.string().required(), + module: yup.string().optional(), + import: yup.string().required(), + require: yup.string().required(), + default: yup.string().required(), + }) + .noUnknown(true); + } else { + acc[key] = yup + .string() + .matches(/^\.\/.*\.json$/) + .required(); + } + + return acc; + }, + {} as Record | yup.SchemaOf> + ) + : undefined + ) + .optional() + ), +}); + +type PackageJson = yup.Asserts; + +/** + * @description being a task to load the package.json starting from the current working directory + * using a shallow find for the package.json and `fs` to read the file. If no package.json is found, + * the process will throw with an appropriate error message. + */ +const loadPkg = async ({ cwd, logger }: { cwd: string; logger: Logger }): Promise => { + const pkgPath = await pkgUp({ cwd }); + + if (!pkgPath) { + throw new Error('Could not find a package.json in the current directory'); + } + + const buffer = await fs.readFile(pkgPath); + + const pkg = JSON.parse(buffer.toString()); + + logger.debug('Loaded package.json:', os.EOL, pkg); + + return pkg; +}; + +/** + * @description validate the package.json against a standardised schema using `yup`. + * If the validation fails, the process will throw with an appropriate error message. + */ +const validatePkg = async ({ pkg }: { pkg: object }): Promise => { + try { + const validatedPkg = await packageJsonSchema.validate(pkg, { + strict: true, + }); + + return validatedPkg; + } catch (err) { + if (err instanceof yup.ValidationError) { + switch (err.type) { + case 'required': + if (err.path) { + throw new Error( + `'${err.path}' in 'package.json' is required as type '${chalk.magenta( + yup.reach(packageJsonSchema, err.path).type + )}'` + ); + } + break; + /** + * This will only be thrown if there are keys in the export map + * that we don't expect so we can therefore make some assumptions + */ + case 'noUnknown': + if (err.path && err.params && 'unknown' in err.params) { + throw new Error( + `'${err.path}' in 'package.json' contains the unknown key ${chalk.magenta( + err.params.unknown + )}, for compatability only the following keys are allowed: ${chalk.magenta( + "['types', 'source', 'import', 'require', 'default']" + )}` + ); + } + break; + default: + if (err.path && err.params && 'type' in err.params && 'value' in err.params) { + throw new Error( + `'${err.path}' in 'package.json' must be of type '${chalk.magenta( + err.params.type + )}' (recieved '${chalk.magenta(typeof err.params.value)}')` + ); + } + } + } + + throw err; + } +}; + +export type { PackageJson, Export }; +export { loadPkg, validatePkg }; diff --git a/packages/cli/cloud/src/utils/tests/compress-files.test.ts b/packages/cli/cloud/src/utils/tests/compress-files.test.ts new file mode 100644 index 0000000000..3023e72131 --- /dev/null +++ b/packages/cli/cloud/src/utils/tests/compress-files.test.ts @@ -0,0 +1,37 @@ +import path from 'path'; +import os from 'os'; +import { isIgnoredFile } from '../compress-files'; + +describe('isIgnoredFile', () => { + const folderPath = os.tmpdir(); // We are using the system's directory path for simulating a real path + it('should correctly handle various ignore patterns', () => { + const allFiles = [ + path.join(folderPath, 'file1.txt'), + path.join(folderPath, 'file2.txt'), + path.join(folderPath, 'node_modules', 'file3.js'), + path.join(folderPath, '.git', 'file4.js'), + path.join(folderPath, 'dist', 'file5.js'), + path.join(folderPath, 'public', 'uploads', '.gitkeep'), + path.join(folderPath, 'src', 'secret', 'file6.js'), + path.join(folderPath, 'src', 'secret', 'keep.me'), + path.join(folderPath, 'test', 'file7.test.ts'), + ]; + const ignorePatterns = [ + '**/node_modules/**', + '**/.git/**', + '**/dist/**', + '!public/uploads/.gitkeep', + '!**/*.test.ts', + '**/src/secret/**', + '!**/src/secret/keep.me', + ]; + const result = allFiles.filter((file) => !isIgnoredFile(folderPath, file, ignorePatterns)); + expect(result).toEqual([ + path.join(folderPath, 'file1.txt'), + path.join(folderPath, 'file2.txt'), + path.join(folderPath, 'public', 'uploads', '.gitkeep'), + path.join(folderPath, 'src', 'secret', 'keep.me'), + path.join(folderPath, 'test', 'file7.test.ts'), + ]); + }); +}); diff --git a/packages/cli/cloud/tsconfig.build.json b/packages/cli/cloud/tsconfig.build.json new file mode 100644 index 0000000000..c80c96eb9b --- /dev/null +++ b/packages/cli/cloud/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": ["src"], + "exclude": ["node_modules", "**/__tests__/**"] +} diff --git a/packages/cli/cloud/tsconfig.eslint.json b/packages/cli/cloud/tsconfig.eslint.json new file mode 100644 index 0000000000..fc8520e737 --- /dev/null +++ b/packages/cli/cloud/tsconfig.eslint.json @@ -0,0 +1,3 @@ +{ + "extends": "./tsconfig.json" +} diff --git a/packages/cli/cloud/tsconfig.json b/packages/cli/cloud/tsconfig.json new file mode 100644 index 0000000000..327ffb9a92 --- /dev/null +++ b/packages/cli/cloud/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "tsconfig/base.json", + "include": ["src", "packup.config.ts"], + "exclude": ["node_modules"] +} diff --git a/packages/cli/create-strapi-app/package.json b/packages/cli/create-strapi-app/package.json index e80e3ad108..dac9557a65 100644 --- a/packages/cli/create-strapi-app/package.json +++ b/packages/cli/create-strapi-app/package.json @@ -43,7 +43,9 @@ "watch": "pack-up watch" }, "dependencies": { + "@strapi/cloud-cli": "5.0.0-beta.14", "@strapi/generate-new": "5.0.0-beta.14", + "chalk": "4.1.2", "commander": "8.3.0", "inquirer": "8.2.5" }, diff --git a/packages/cli/create-strapi-app/src/cloud.ts b/packages/cli/create-strapi-app/src/cloud.ts new file mode 100644 index 0000000000..287f3446e6 --- /dev/null +++ b/packages/cli/create-strapi-app/src/cloud.ts @@ -0,0 +1,107 @@ +import inquirer from 'inquirer'; +import { resolve } from 'node:path'; +import { cli as cloudCli, services as cloudServices } from '@strapi/cloud-cli'; +import parseToChalk from './utils/parse-to-chalk'; + +interface CloudError { + response: { + status: number; + data: string | object; + }; +} + +function assertCloudError(e: unknown): asserts e is CloudError { + if ((e as CloudError).response === undefined) { + throw Error('Expected CloudError'); + } +} + +export async function handleCloudProject(projectName: string): Promise { + const logger = cloudServices.createLogger({ + silent: false, + debug: process.argv.includes('--debug'), + timestamp: false, + }); + let cloudApiService = await cloudServices.cloudApiFactory(); + const defaultErrorMessage = + 'An error occurred while trying to interact with Strapi Cloud. Use strapi deploy command once the project is generated.'; + + try { + const { data: config } = await cloudApiService.config(); + logger.log(parseToChalk(config.projectCreation.introText)); + } catch (e: unknown) { + logger.debug(e); + logger.error(defaultErrorMessage); + return; + } + const { userChoice } = await inquirer.prompt<{ userChoice: string }>([ + { + type: 'list', + name: 'userChoice', + message: `Please log in or sign up.`, + choices: ['Login/Sign up', 'Skip'], + }, + ]); + + if (userChoice !== 'Skip') { + const cliContext = { + logger, + cwd: process.cwd(), + }; + const projectCreationSpinner = logger.spinner('Creating project on Strapi Cloud'); + + try { + const tokenService = await cloudServices.tokenServiceFactory(cliContext); + const loginSuccess = await cloudCli.login.action(cliContext); + if (!loginSuccess) { + return; + } + logger.debug('Retrieving token'); + const token = await tokenService.retrieveToken(); + + cloudApiService = await cloudServices.cloudApiFactory(token); + + logger.debug('Retrieving config'); + const { data: config } = await cloudApiService.config(); + logger.debug('config', config); + const defaultProjectValues = config.projectCreation?.defaults || {}; + logger.debug('default project values', defaultProjectValues); + projectCreationSpinner.start(); + const { data: project } = await cloudApiService.createProject({ + nodeVersion: process.versions?.node?.slice(1, 3) || '20', + region: 'NYC', + plan: 'trial', + ...defaultProjectValues, + name: projectName, + }); + projectCreationSpinner.succeed('Project created on Strapi Cloud'); + const projectPath = resolve(projectName); + logger.debug(project, projectPath); + await cloudServices.local.save({ project }, { directoryPath: projectPath }); + } catch (e: Error | CloudError | unknown) { + logger.debug(e); + try { + assertCloudError(e); + if (e.response.status === 403) { + const message = + typeof e.response.data === 'string' + ? e.response.data + : 'We are sorry, but we are not able to create a Strapi Cloud project for you at the moment.'; + if (projectCreationSpinner.isSpinning) { + projectCreationSpinner.fail(message); + } else { + logger.warn(message); + } + return; + } + } catch (e) { + /* empty */ + } + if (projectCreationSpinner.isSpinning) { + projectCreationSpinner.fail(defaultErrorMessage); + } else { + logger.error(defaultErrorMessage); + } + } + } +} diff --git a/packages/cli/create-strapi-app/src/create-strapi-app.ts b/packages/cli/create-strapi-app/src/create-strapi-app.ts index 3a6e580f67..b825d9ec84 100644 --- a/packages/cli/create-strapi-app/src/create-strapi-app.ts +++ b/packages/cli/create-strapi-app/src/create-strapi-app.ts @@ -1,12 +1,14 @@ import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; import commander from 'commander'; + import { generateNewApp, type Options as GenerateNewAppOptions } from '@strapi/generate-new'; import * as prompts from './prompts'; import type { Options } from './types'; import { detectPackageManager } from './package-manager'; import * as database from './database'; +// import { handleCloudProject } from './cloud'; const packageJson = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf8')); @@ -29,6 +31,8 @@ command .option('--use-pnpm', 'Use pnpm as the project package manager') // Database options + // TODO V5: Uncomment when cloud-cli is ready + // .option('--skip-cloud', 'Skip cloud login and project creation') .option('--dbclient ', 'Database client') .option('--dbhost ', 'Database host') .option('--dbport ', 'Database port') @@ -56,6 +60,12 @@ async function createStrapiApp(directory: string | undefined, options: Options) const appDirectory = directory || (await prompts.directory()); + // TODO V5: Uncomment when cloud-cli is ready + // if (!options.skipCloud) { + // checkRequirements(); + // await handleCloudProject(projectName); + // } + const appOptions = { directory: appDirectory, useTypescript: true, diff --git a/packages/cli/create-strapi-app/src/types.ts b/packages/cli/create-strapi-app/src/types.ts index 9da23b0959..d9c230b4f2 100644 --- a/packages/cli/create-strapi-app/src/types.ts +++ b/packages/cli/create-strapi-app/src/types.ts @@ -5,6 +5,7 @@ export interface Options { quickstart?: boolean; run?: boolean; dbclient?: DBClient; + skipCloud?: boolean; dbhost?: string; dbport?: string; dbname?: string; diff --git a/packages/cli/create-strapi-app/src/utils/parse-to-chalk.ts b/packages/cli/create-strapi-app/src/utils/parse-to-chalk.ts new file mode 100644 index 0000000000..a785ca93f0 --- /dev/null +++ b/packages/cli/create-strapi-app/src/utils/parse-to-chalk.ts @@ -0,0 +1,24 @@ +import chalk from 'chalk'; + +// TODO: move styles to API + +const supportedStyles = { + magentaBright: chalk.magentaBright, + blueBright: chalk.blueBright, + yellowBright: chalk.yellowBright, + green: chalk.green, + red: chalk.red, + bold: chalk.bold, + italic: chalk.italic, +}; + +export default function parseToChalk(template: string) { + let result = template; + + for (const [color, chalkFunction] of Object.entries(supportedStyles)) { + const regex = new RegExp(`{${color}}(.*?){/${color}}`, 'g'); + result = result.replace(regex, (_, p1) => chalkFunction(p1.trim())); + } + + return result; +} diff --git a/packages/core/admin/admin/src/components/NpsSurvey.tsx b/packages/core/admin/admin/src/components/NpsSurvey.tsx index c170d54b0d..b392bc45f6 100644 --- a/packages/core/admin/admin/src/components/NpsSurvey.tsx +++ b/packages/core/admin/admin/src/components/NpsSurvey.tsx @@ -59,9 +59,9 @@ const FieldWrapper = styled(Field.Root)` const delays = { postResponse: 90 * 24 * 60 * 60 * 1000, // 90 days in ms - postFirstDismissal: 7 * 24 * 60 * 60 * 1000, // 7 days in ms + postFirstDismissal: 14 * 24 * 60 * 60 * 1000, // 14 days in ms postSubsequentDismissal: 90 * 24 * 60 * 60 * 1000, // 90 days in ms - display: 5 * 60 * 1000, // 5 minutes in ms + display: 30 * 60 * 1000, // 30 minutes in ms }; const ratingArray = [...Array(11).keys()]; diff --git a/packages/core/admin/admin/src/components/tests/NpsSurvey.test.tsx b/packages/core/admin/admin/src/components/tests/NpsSurvey.test.tsx index da1b4fa663..e92a81b809 100644 --- a/packages/core/admin/admin/src/components/tests/NpsSurvey.test.tsx +++ b/packages/core/admin/admin/src/components/tests/NpsSurvey.test.tsx @@ -239,8 +239,8 @@ describe('NPS survey', () => { it('respects the delay after first user dismissal', async () => { const initialDate = new Date('2020-01-01'); - const withinDelay = new Date('2020-01-04'); - const beyondDelay = new Date('2020-01-08'); + const withinDelay = new Date('2020-01-08'); + const beyondDelay = new Date('2020-01-15'); localStorageMock.getItem.mockImplementation((key) => { if (key === NPS_KEY) { diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.tsx index 54ed0c4ae8..8d3f53d0bf 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.tsx @@ -45,6 +45,13 @@ const EditPage = () => { _unstableFormatAPIError: formatAPIError, _unstableFormatValidationErrors: formatValidationErrors, } = useAPIErrorHandler(); + + /** + * Prevents the notifications from showing up twice because the function identity + * coming from the helper plugin is not stable + */ + // eslint-disable-next-line react-hooks/exhaustive-deps + const stableFormatAPIError = React.useCallback(formatAPIError, []); const [isTriggering, setIsTriggering] = React.useState(false); const [triggerResponse, setTriggerResponse] = React.useState(); @@ -59,10 +66,10 @@ const EditPage = () => { if (error) { toggleNotification({ type: 'danger', - message: formatAPIError(error), + message: stableFormatAPIError(error), }); } - }, [error, toggleNotification, formatAPIError]); + }, [error, toggleNotification, stableFormatAPIError]); const handleTriggerWebhook = async () => { try { diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.ts b/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.ts index b28e53e6f2..d8110c0777 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.ts +++ b/packages/core/admin/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.ts @@ -15,15 +15,16 @@ const useWebhooks = ( queryArgs?: Parameters[1] ) => { const { data: webhooks, isLoading, error } = useGetWebhooksQuery(args, queryArgs); - const [createWebhook] = useCreateWebhookMutation(); - const [updateWebhook] = useUpdateWebhookMutation(); + const [createWebhook, { error: createError }] = useCreateWebhookMutation(); + const [updateWebhook, { error: updateError }] = useUpdateWebhookMutation(); + const [triggerWebhook] = useTriggerWebhookMutation(); const [deleteManyWebhooks] = useDeleteManyWebhooksMutation(); return { webhooks: webhooks as GetWebhooks.Response['data'] | undefined, isLoading: isLoading as boolean, - error: error as BaseQueryError | SerializedError, + error: (error || createError || updateError) as BaseQueryError | SerializedError, createWebhook, updateWebhook, triggerWebhook, diff --git a/packages/core/admin/package.json b/packages/core/admin/package.json index 44afc154c0..1b74c036bd 100644 --- a/packages/core/admin/package.json +++ b/packages/core/admin/package.json @@ -104,6 +104,7 @@ "immer": "9.0.21", "inquirer": "8.2.5", "invariant": "^2.2.4", + "is-localhost-ip": "2.0.0", "jsonwebtoken": "9.0.0", "koa": "2.15.2", "koa-compose": "4.1.0", @@ -117,6 +118,7 @@ "p-map": "4.0.0", "passport-local": "1.0.0", "pluralize": "8.0.0", + "punycode": "2.3.1", "qs": "6.11.1", "react-dnd": "16.0.1", "react-dnd-html5-backend": "16.0.1", @@ -152,6 +154,7 @@ "@types/markdown-it-footnote": "3.0.3", "@types/passport-local": "1.0.36", "@types/pluralize": "0.0.32", + "@types/punycode": "2.1.4", "@types/react-window": "1.8.8", "@types/sanitize-html": "2.11.0", "@vitejs/plugin-react-swc": "3.6.0", diff --git a/packages/core/admin/server/src/controllers/webhooks.ts b/packages/core/admin/server/src/controllers/webhooks.ts index 5e74facd3c..e37e056db1 100644 --- a/packages/core/admin/server/src/controllers/webhooks.ts +++ b/packages/core/admin/server/src/controllers/webhooks.ts @@ -1,6 +1,10 @@ +import isLocalhostIp from 'is-localhost-ip'; +// Regular import references a deprecated node module, +// See https://www.npmjs.com/package/punycode.js#installation +import punycode from 'punycode/'; import type { Context } from 'koa'; - import _ from 'lodash'; + import { yup, validateYupSchema } from '@strapi/utils'; import type { Modules } from '@strapi/types'; @@ -21,7 +25,27 @@ const urlRegex = const webhookValidator = yup .object({ name: yup.string().required(), - url: yup.string().matches(urlRegex, 'url must be a valid URL').required(), + url: yup + .string() + .matches(urlRegex, 'url must be a valid URL') + .required() + .test( + 'is-public-url', + "Url is not supported because it isn't reachable over the public internet", + async (url) => { + if (process.env.NODE_ENV !== 'production') { + return true; + } + + try { + const parsedUrl = new URL(punycode.toASCII(url!)); + const isLocalUrl = await isLocalhostIp(parsedUrl.hostname); + return !isLocalUrl; + } catch { + return false; + } + } + ), headers: yup.lazy((data) => { if (typeof data !== 'object') { return yup.object().required(); diff --git a/packages/core/strapi/package.json b/packages/core/strapi/package.json index 364615459d..fc35ac6cbe 100644 --- a/packages/core/strapi/package.json +++ b/packages/core/strapi/package.json @@ -110,6 +110,7 @@ "dependencies": { "@pmmmwh/react-refresh-webpack-plugin": "0.5.11", "@strapi/admin": "5.0.0-beta.14", + "@strapi/cloud-cli": "5.0.0-beta.14", "@strapi/content-manager": "5.0.0-beta.14", "@strapi/content-releases": "5.0.0-beta.14", "@strapi/content-type-builder": "5.0.0-beta.14", @@ -135,6 +136,8 @@ "browserslist-to-esbuild": "1.2.0", "chalk": "4.1.2", "chokidar": "3.5.3", + "ci-info": "3.8.0", + "cli-progress": "3.12.0", "cli-table3": "0.6.2", "commander": "8.3.0", "concurrently": "8.2.2", diff --git a/packages/core/strapi/src/cli/commands/index.ts b/packages/core/strapi/src/cli/commands/index.ts index 47db2b0c7a..e9bb753e2b 100644 --- a/packages/core/strapi/src/cli/commands/index.ts +++ b/packages/core/strapi/src/cli/commands/index.ts @@ -1,3 +1,5 @@ +// import { buildStrapiCloudCommands as cloudCommands } from '@strapi/cloud-cli'; + import { command as createAdminUser } from './admin/create-user'; import { command as resetAdminUserPassword } from './admin/reset-user-password'; import { command as listComponents } from './components/list'; @@ -54,4 +56,9 @@ export const commands: StrapiCommand[] = [ exportCommand, importCommand, transferCommand, + /** + * Cloud + */ + // TODO V5: Uncomment when cloud-cli is ready + // cloudCommands, ]; diff --git a/packages/core/strapi/src/cli/index.ts b/packages/core/strapi/src/cli/index.ts index 91a8461e34..a07223d03c 100644 --- a/packages/core/strapi/src/cli/index.ts +++ b/packages/core/strapi/src/cli/index.ts @@ -41,9 +41,9 @@ const createCLI = async (argv: string[], command = new Command()) => { } satisfies CLIContext; // Load all commands - strapiCommands.forEach((commandFactory) => { + for (const commandFactory of strapiCommands) { try { - const subCommand = commandFactory({ command, argv, ctx }); + const subCommand = await commandFactory({ command, argv, ctx }); // Add this command to the Commander command object if (subCommand) { @@ -52,7 +52,7 @@ const createCLI = async (argv: string[], command = new Command()) => { } catch (e) { console.error(`Failed to load command`, e); } - }); + } // TODO v6: remove these deprecation notices const deprecatedCommands = [ diff --git a/packages/core/strapi/src/cli/types.ts b/packages/core/strapi/src/cli/types.ts index 37c3fa0818..5defdedb78 100644 --- a/packages/core/strapi/src/cli/types.ts +++ b/packages/core/strapi/src/cli/types.ts @@ -12,4 +12,4 @@ export type StrapiCommand = (params: { command: Command; argv: string[]; ctx: CLIContext; -}) => void | Command; +}) => void | Command | Promise; diff --git a/packages/core/strapi/src/cli/utils/logger.ts b/packages/core/strapi/src/cli/utils/logger.ts index ddfee2cde3..690fb4ae32 100644 --- a/packages/core/strapi/src/cli/utils/logger.ts +++ b/packages/core/strapi/src/cli/utils/logger.ts @@ -1,5 +1,6 @@ import chalk from 'chalk'; -import ora from 'ora'; +import ora, { Ora } from 'ora'; +import * as cliProgress from 'cli-progress'; export interface LoggerOptions { silent?: boolean; @@ -12,12 +13,43 @@ export interface Logger { errors: number; debug: (...args: unknown[]) => void; info: (...args: unknown[]) => void; + success: (...args: unknown[]) => void; warn: (...args: unknown[]) => void; error: (...args: unknown[]) => void; log: (...args: unknown[]) => void; - spinner: (text: string) => Pick; + spinner: (text: string) => Pick; + progressBar: ( + totalSize: number, + text: string + ) => Pick; } +const silentSpinner = { + succeed() { + return this; + }, + fail() { + return this; + }, + start() { + return this; + }, + text: '', + isSpinning: false, +} as Ora; + +const silentProgressBar = { + start() { + return this; + }, + stop() { + return this; + }, + update() { + return this; + }, +} as unknown as cliProgress.SingleBar; + const createLogger = (options: LoggerOptions = {}): Logger => { const { silent = false, debug = false, timestamp = true } = options; @@ -62,6 +94,17 @@ const createLogger = (options: LoggerOptions = {}): Logger => { console.info(chalk.blue(`${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), ...args); }, + success(...args) { + if (silent) { + return; + } + + console.info( + chalk.green(`[SUCCESS]${timestamp ? `\t[${new Date().toISOString()}]` : ''}`), + ...args + ); + }, + warn(...args) { state.warning += 1; @@ -88,25 +131,31 @@ const createLogger = (options: LoggerOptions = {}): Logger => { ); }, - // @ts-expect-error – returning a subpart of ora is fine because the types tell us what is what. spinner(text: string) { if (silent) { - return { - succeed() { - return this; - }, - fail() { - return this; - }, - start() { - return this; - }, - text: '', - }; + return silentSpinner; } return ora(text); }, + + progressBar(totalSize: number, text: string) { + if (silent) { + return silentProgressBar; + } + + const progressBar = new cliProgress.SingleBar({ + format: `${text ? `${text} |` : ''}${chalk.green('{bar}')}| {percentage}%`, + barCompleteChar: '\u2588', + barIncompleteChar: '\u2591', + hideCursor: true, + forceRedraw: true, + }); + + progressBar.start(totalSize, 0); + + return progressBar; + }, }; }; diff --git a/packages/generators/app/src/create-project.ts b/packages/generators/app/src/create-project.ts index 7b34354158..da91acdb23 100644 --- a/packages/generators/app/src/create-project.ts +++ b/packages/generators/app/src/create-project.ts @@ -172,6 +172,9 @@ export default async function createProject(scope: Scope) { console.log(` ${cmd} build`); console.log(' Build Strapi admin panel.'); console.log(); + console.log(` ${cmd} deploy`); + console.log(' Deploy Strapi project.'); + console.log(); console.log(` ${cmd} strapi`); console.log(` Display all available commands.`); console.log(); diff --git a/packages/generators/app/src/index.ts b/packages/generators/app/src/index.ts index 5aa74dd3da..2898643ea6 100644 --- a/packages/generators/app/src/index.ts +++ b/packages/generators/app/src/index.ts @@ -14,6 +14,8 @@ import createProject from './create-project'; import { addDatabaseDependencies } from './utils/database'; export type { Options }; +export { default as checkInstallPath } from './utils/check-install-path'; +export { default as checkRequirements } from './utils/check-requirements'; const packageJson = JSON.parse(readFileSync(resolve(__dirname, '../package.json'), 'utf8')); @@ -32,7 +34,7 @@ export const generateNewApp = async (options: Options) => { database: options.database, runApp: options.runApp ?? false, isQuickstart: options.isQuickstart, - // use pacakge version as strapiVersion (all packages have the same version); + // use package version as strapiVersion (all packages have the same version); strapiVersion: packageJson.version, template: options.template, packageJsonStrapi: { diff --git a/packages/generators/app/src/resources/dot-files/common/gitignore b/packages/generators/app/src/resources/dot-files/common/gitignore index 2236173e8c..bf2d489dc5 100644 --- a/packages/generators/app/src/resources/dot-files/common/gitignore +++ b/packages/generators/app/src/resources/dot-files/common/gitignore @@ -128,3 +128,4 @@ exports dist build .strapi-updater.json +.strapi-cloud.json diff --git a/packages/generators/app/src/resources/json/common/package.json.ts b/packages/generators/app/src/resources/json/common/package.json.ts index f1a68da288..bbf97b513c 100644 --- a/packages/generators/app/src/resources/json/common/package.json.ts +++ b/packages/generators/app/src/resources/json/common/package.json.ts @@ -16,6 +16,7 @@ export default async (scope: Scope) => { start: 'strapi start', build: 'strapi build', strapi: 'strapi', + deploy: 'strapi deploy', }, devDependencies: scope.devDependencies, dependencies: scope.dependencies, diff --git a/tests/api/core/admin/admin-webhooks.test.api.ts b/tests/api/core/admin/admin-webhooks.test.api.ts new file mode 100644 index 0000000000..59d2539efb --- /dev/null +++ b/tests/api/core/admin/admin-webhooks.test.api.ts @@ -0,0 +1,139 @@ +import { omit } from 'lodash'; +import type { Webhook, LoadedStrapi } from '@strapi/types'; + +import { createStrapiInstance } from 'api-tests/strapi'; +import { createAuthRequest } from 'api-tests/request'; + +let rq; +let strapi: LoadedStrapi; + +const defaultWebhook = { + name: 'test', + url: 'https://example.com', + headers: {}, + events: [], +} satisfies Omit; + +const createWebhook = async (webhook: Partial) => { + const res = await rq({ + url: '/admin/webhooks', + method: 'POST', + body: { + ...defaultWebhook, + ...webhook, + }, + }); + + return { + status: res.statusCode, + webhook: res.body.data, + }; +}; + +const updateWebhook = async (id: string, webhook: Partial) => { + const res = await rq({ + url: `/admin/webhooks/${id}`, + method: 'PUT', + body: { + ...defaultWebhook, + ...webhook, + }, + }); + + return { + status: res.statusCode, + webhook: res.body.data, + }; +}; + +const deleteWebhook = async (id: string) => { + const res = await rq({ + url: `/admin/webhooks/${id}`, + method: 'DELETE', + }); + + return { + status: res.statusCode, + webhook: res.body.data, + }; +}; + +describe('Admin API Webhooks', () => { + // Initialization Actions + beforeAll(async () => { + strapi = await createStrapiInstance(); + rq = await createAuthRequest({ strapi }); + }); + + // Cleanup actions + afterAll(async () => { + await strapi.destroy(); + }); + + test('Can create a webhook', async () => { + const { webhook, status } = await createWebhook({ + url: 'https://example.com', + }); + + expect(status).toBe(201); + expect(webhook).toMatchObject({ + id: expect.anything(), + ...defaultWebhook, + url: 'https://example.com', + }); + }); + + test('Can not create a webhook with a local url on production', async () => { + // change NODE_ENV to 'production' to test this + const originalNodeEnv = process.env.NODE_ENV; + process.env.NODE_ENV = 'production'; + + const { status } = await createWebhook({ url: 'http://localhost:1337' }); + const { status: statusInt } = await createWebhook({ url: '私の.家' }); + + process.env.NODE_ENV = originalNodeEnv; + + expect(status).toBe(400); + expect(statusInt).toBe(400); + }); + + test('Can not create a webhook with an invalid url', async () => { + const { status } = await createWebhook({ + url: 'invalid-url', + }); + + expect(status).toBe(400); + }); + + test('Can update a webhook', async () => { + const { webhook: createdWebhook } = await createWebhook({ + url: 'https://example.com', + }); + + const { webhook, status } = await updateWebhook(createdWebhook.id, { + url: 'https://example.com/updated', + }); + + expect(status).toBe(200); + expect(webhook).toMatchObject({ + id: createdWebhook.id, + ...defaultWebhook, + url: 'https://example.com/updated', + }); + }); + + test('Can delete a webhook', async () => { + const { webhook: createdWebhook } = await createWebhook({ + url: 'https://example.com', + }); + + const { webhook, status } = await deleteWebhook(createdWebhook.id); + + expect(status).toBe(200); + expect(webhook).toMatchObject({ + id: createdWebhook.id, + url: 'https://example.com', + ...defaultWebhook, + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index b5f0bd951c..afbdd5b3eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3113,6 +3113,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/aix-ppc64@npm:0.19.11" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/aix-ppc64@npm:0.20.2" @@ -3141,6 +3148,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/android-arm64@npm:0.19.11" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-arm64@npm:0.20.2" @@ -3169,6 +3183,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/android-arm@npm:0.19.11" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-arm@npm:0.20.2" @@ -3197,6 +3218,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/android-x64@npm:0.19.11" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-x64@npm:0.20.2" @@ -3225,6 +3253,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/darwin-arm64@npm:0.19.11" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/darwin-arm64@npm:0.20.2" @@ -3253,6 +3288,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/darwin-x64@npm:0.19.11" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/darwin-x64@npm:0.20.2" @@ -3281,6 +3323,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/freebsd-arm64@npm:0.19.11" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/freebsd-arm64@npm:0.20.2" @@ -3309,6 +3358,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/freebsd-x64@npm:0.19.11" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/freebsd-x64@npm:0.20.2" @@ -3337,6 +3393,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-arm64@npm:0.19.11" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-arm64@npm:0.20.2" @@ -3365,6 +3428,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-arm@npm:0.19.11" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-arm@npm:0.20.2" @@ -3393,6 +3463,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-ia32@npm:0.19.11" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-ia32@npm:0.20.2" @@ -3421,6 +3498,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-loong64@npm:0.19.11" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-loong64@npm:0.20.2" @@ -3449,6 +3533,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-mips64el@npm:0.19.11" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-mips64el@npm:0.20.2" @@ -3477,6 +3568,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-ppc64@npm:0.19.11" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-ppc64@npm:0.20.2" @@ -3505,6 +3603,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-riscv64@npm:0.19.11" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-riscv64@npm:0.20.2" @@ -3533,6 +3638,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-s390x@npm:0.19.11" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-s390x@npm:0.20.2" @@ -3561,6 +3673,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/linux-x64@npm:0.19.11" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-x64@npm:0.20.2" @@ -3589,6 +3708,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/netbsd-x64@npm:0.19.11" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/netbsd-x64@npm:0.20.2" @@ -3617,6 +3743,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/openbsd-x64@npm:0.19.11" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/openbsd-x64@npm:0.20.2" @@ -3645,6 +3778,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/sunos-x64@npm:0.19.11" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/sunos-x64@npm:0.20.2" @@ -3673,6 +3813,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/win32-arm64@npm:0.19.11" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-arm64@npm:0.20.2" @@ -3701,6 +3848,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/win32-ia32@npm:0.19.11" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-ia32@npm:0.20.2" @@ -3729,6 +3883,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.19.11": + version: 0.19.11 + resolution: "@esbuild/win32-x64@npm:0.19.11" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-x64@npm:0.20.2" @@ -5445,6 +5606,20 @@ __metadata: languageName: node linkType: hard +"@pkgr/utils@npm:^2.3.1": + version: 2.4.2 + resolution: "@pkgr/utils@npm:2.4.2" + dependencies: + cross-spawn: "npm:^7.0.3" + fast-glob: "npm:^3.3.0" + is-glob: "npm:^4.0.3" + open: "npm:^9.1.0" + picocolors: "npm:^1.0.0" + tslib: "npm:^2.6.0" + checksum: f0b0b305a83bd65fac5637d28ad3e33f19194043e03ceef6b4e13d260bfa2678b73df76dc56ed906469ffe0494d4bd214e6b92ca80684f38547982edf982dd15 + languageName: node + linkType: hard + "@playwright/test@npm:1.42.1": version: 1.42.1 resolution: "@playwright/test@npm:1.42.1" @@ -7697,6 +7872,7 @@ __metadata: "@types/markdown-it-footnote": "npm:3.0.3" "@types/passport-local": "npm:1.0.36" "@types/pluralize": "npm:0.0.32" + "@types/punycode": "npm:2.1.4" "@types/react-window": "npm:1.8.8" "@types/sanitize-html": "npm:2.11.0" "@vitejs/plugin-react-swc": "npm:3.6.0" @@ -7716,6 +7892,7 @@ __metadata: immer: "npm:9.0.21" inquirer: "npm:8.2.5" invariant: "npm:^2.2.4" + is-localhost-ip: "npm:2.0.0" jsonwebtoken: "npm:9.0.0" koa: "npm:2.15.2" koa-body: "npm:6.0.1" @@ -7730,6 +7907,7 @@ __metadata: p-map: "npm:4.0.0" passport-local: "npm:1.0.0" pluralize: "npm:8.0.0" + punycode: "npm:2.3.1" qs: "npm:6.11.1" react: "npm:18.3.1" react-dnd: "npm:16.0.1" @@ -7763,6 +7941,40 @@ __metadata: languageName: unknown linkType: soft +"@strapi/cloud-cli@npm:5.0.0-beta.14, @strapi/cloud-cli@workspace:packages/cli/cloud": + version: 0.0.0-use.local + resolution: "@strapi/cloud-cli@workspace:packages/cli/cloud" + dependencies: + "@strapi/pack-up": "npm:4.23.0" + "@strapi/utils": "npm:5.0.0-beta.14" + "@types/cli-progress": "npm:3.11.5" + "@types/eventsource": "npm:1.1.15" + "@types/lodash": "npm:^4.14.191" + axios: "npm:1.6.0" + chalk: "npm:4.1.2" + cli-progress: "npm:3.12.0" + commander: "npm:8.3.0" + eslint-config-custom: "npm:5.0.0-beta.14" + eventsource: "npm:2.0.2" + fast-safe-stringify: "npm:2.1.1" + fs-extra: "npm:10.0.0" + inquirer: "npm:8.2.5" + jsonwebtoken: "npm:9.0.0" + jwks-rsa: "npm:3.1.0" + lodash: "npm:4.17.21" + minimatch: "npm:9.0.3" + open: "npm:8.4.0" + ora: "npm:5.4.1" + pkg-up: "npm:3.1.0" + tar: "npm:6.1.13" + tsconfig: "npm:5.0.0-beta.14" + xdg-app-paths: "npm:8.3.0" + yup: "npm:0.32.9" + bin: + cloud-cli: ./bin/index.js + languageName: unknown + linkType: soft + "@strapi/content-manager@npm:5.0.0-beta.14, @strapi/content-manager@workspace:packages/core/content-manager": version: 0.0.0-use.local resolution: "@strapi/content-manager@workspace:packages/core/content-manager" @@ -8254,6 +8466,37 @@ __metadata: languageName: unknown linkType: soft +"@strapi/pack-up@npm:4.23.0": + version: 4.23.0 + resolution: "@strapi/pack-up@npm:4.23.0" + dependencies: + "@vitejs/plugin-react-swc": "npm:3.5.0" + boxen: "npm:5.1.2" + browserslist-to-esbuild: "npm:1.2.0" + chalk: "npm:4.1.2" + chokidar: "npm:3.5.3" + commander: "npm:8.3.0" + esbuild: "npm:0.19.11" + esbuild-register: "npm:3.5.0" + get-latest-version: "npm:5.1.0" + git-url-parse: "npm:13.1.0" + ini: "npm:4.1.1" + ora: "npm:5.4.1" + outdent: "npm:0.8.0" + pkg-up: "npm:3.1.0" + prettier: "npm:2.8.4" + prettier-plugin-packagejson: "npm:2.4.5" + prompts: "npm:2.4.2" + rxjs: "npm:7.8.1" + typescript: "npm:5.2.2" + vite: "npm:5.0.13" + yup: "npm:0.32.9" + bin: + pack-up: bin/pack-up.js + checksum: 1440087fdfb23d412ec4dff08b128b7daa62ca2b01e599fdd480d52e3c1bdd820f395a181c945dadcaa127e7f53544e8d61613157e236002d39286e87052f25c + languageName: node + linkType: hard + "@strapi/pack-up@npm:5.0.0": version: 5.0.0 resolution: "@strapi/pack-up@npm:5.0.0" @@ -8717,6 +8960,7 @@ __metadata: dependencies: "@pmmmwh/react-refresh-webpack-plugin": "npm:0.5.11" "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/cloud-cli": "npm:5.0.0-beta.14" "@strapi/content-manager": "npm:5.0.0-beta.14" "@strapi/content-releases": "npm:5.0.0-beta.14" "@strapi/content-type-builder": "npm:5.0.0-beta.14" @@ -8749,6 +8993,8 @@ __metadata: browserslist-to-esbuild: "npm:1.2.0" chalk: "npm:4.1.2" chokidar: "npm:3.5.3" + ci-info: "npm:3.8.0" + cli-progress: "npm:3.12.0" cli-table3: "npm:0.6.2" commander: "npm:8.3.0" concurrently: "npm:8.2.2" @@ -9021,6 +9267,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-arm64@npm:1.3.101": + version: 1.3.101 + resolution: "@swc/core-darwin-arm64@npm:1.3.101" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@swc/core-darwin-arm64@npm:1.4.8": version: 1.4.8 resolution: "@swc/core-darwin-arm64@npm:1.4.8" @@ -9028,6 +9281,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-x64@npm:1.3.101": + version: 1.3.101 + resolution: "@swc/core-darwin-x64@npm:1.3.101" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@swc/core-darwin-x64@npm:1.4.8": version: 1.4.8 resolution: "@swc/core-darwin-x64@npm:1.4.8" @@ -9035,6 +9295,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm-gnueabihf@npm:1.3.101": + version: 1.3.101 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.101" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@swc/core-linux-arm-gnueabihf@npm:1.4.8": version: 1.4.8 resolution: "@swc/core-linux-arm-gnueabihf@npm:1.4.8" @@ -9042,6 +9309,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm64-gnu@npm:1.3.101": + version: 1.3.101 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.101" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@swc/core-linux-arm64-gnu@npm:1.4.8": version: 1.4.8 resolution: "@swc/core-linux-arm64-gnu@npm:1.4.8" @@ -9049,6 +9323,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-arm64-musl@npm:1.3.101": + version: 1.3.101 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.101" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@swc/core-linux-arm64-musl@npm:1.4.8": version: 1.4.8 resolution: "@swc/core-linux-arm64-musl@npm:1.4.8" @@ -9056,6 +9337,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-x64-gnu@npm:1.3.101": + version: 1.3.101 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.101" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@swc/core-linux-x64-gnu@npm:1.4.8": version: 1.4.8 resolution: "@swc/core-linux-x64-gnu@npm:1.4.8" @@ -9063,6 +9351,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-linux-x64-musl@npm:1.3.101": + version: 1.3.101 + resolution: "@swc/core-linux-x64-musl@npm:1.3.101" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@swc/core-linux-x64-musl@npm:1.4.8": version: 1.4.8 resolution: "@swc/core-linux-x64-musl@npm:1.4.8" @@ -9070,6 +9365,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-arm64-msvc@npm:1.3.101": + version: 1.3.101 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.101" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@swc/core-win32-arm64-msvc@npm:1.4.8": version: 1.4.8 resolution: "@swc/core-win32-arm64-msvc@npm:1.4.8" @@ -9077,6 +9379,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-ia32-msvc@npm:1.3.101": + version: 1.3.101 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.101" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@swc/core-win32-ia32-msvc@npm:1.4.8": version: 1.4.8 resolution: "@swc/core-win32-ia32-msvc@npm:1.4.8" @@ -9084,6 +9393,13 @@ __metadata: languageName: node linkType: hard +"@swc/core-win32-x64-msvc@npm:1.3.101": + version: 1.3.101 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.101" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@swc/core-win32-x64-msvc@npm:1.4.8": version: 1.4.8 resolution: "@swc/core-win32-x64-msvc@npm:1.4.8" @@ -9137,6 +9453,59 @@ __metadata: languageName: node linkType: hard +"@swc/core@npm:^1.3.96": + version: 1.3.101 + resolution: "@swc/core@npm:1.3.101" + dependencies: + "@swc/core-darwin-arm64": "npm:1.3.101" + "@swc/core-darwin-x64": "npm:1.3.101" + "@swc/core-linux-arm-gnueabihf": "npm:1.3.101" + "@swc/core-linux-arm64-gnu": "npm:1.3.101" + "@swc/core-linux-arm64-musl": "npm:1.3.101" + "@swc/core-linux-x64-gnu": "npm:1.3.101" + "@swc/core-linux-x64-musl": "npm:1.3.101" + "@swc/core-win32-arm64-msvc": "npm:1.3.101" + "@swc/core-win32-ia32-msvc": "npm:1.3.101" + "@swc/core-win32-x64-msvc": "npm:1.3.101" + "@swc/counter": "npm:^0.1.1" + "@swc/types": "npm:^0.1.5" + peerDependencies: + "@swc/helpers": ^0.5.0 + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 38a49876c80a9d337823c2abeaf9c2dd89f45a3c72043c9dfffb4bc0da49958643945d7755446f97eed90dbf1e0b141786acdb2419340f1b5ae99eaa53fac4bc + languageName: node + linkType: hard + +"@swc/counter@npm:^0.1.1": + version: 0.1.2 + resolution: "@swc/counter@npm:0.1.2" + checksum: 8427c594f1f0cf44b83885e9c8fe1e370c9db44ae96e07a37c117a6260ee97797d0709483efbcc244e77bac578690215f45b23254c4cd8a70fb25ddbb50bf33e + languageName: node + linkType: hard + "@swc/counter@npm:^0.1.2, @swc/counter@npm:^0.1.3": version: 0.1.3 resolution: "@swc/counter@npm:0.1.3" @@ -9444,6 +9813,15 @@ __metadata: languageName: node linkType: hard +"@types/cli-progress@npm:3.11.5": + version: 3.11.5 + resolution: "@types/cli-progress@npm:3.11.5" + dependencies: + "@types/node": "npm:*" + checksum: cb19187637b0a9b92219eab8d3d42250f1773328c24cb265d1bc677e3017f512e95e834e4846bcf0964efc232a13f86f7ef01843be804daa5433cc655c375bb3 + languageName: node + linkType: hard + "@types/co-body@npm:^6.1.0": version: 6.1.3 resolution: "@types/co-body@npm:6.1.3" @@ -9564,6 +9942,13 @@ __metadata: languageName: node linkType: hard +"@types/eventsource@npm:1.1.15": + version: 1.1.15 + resolution: "@types/eventsource@npm:1.1.15" + checksum: 52e024f5aebfd6bc166f2162d6e408cf788886007e571519c75f8c3623feaa3c5a74681fd3a128de6d21b28ef88dd683421264f10d5c98728959b99b1229b85e + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^4.17.30": version: 4.17.41 resolution: "@types/express-serve-static-core@npm:4.17.41" @@ -9600,7 +9985,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:^4.17.13": +"@types/express@npm:^4.17.13, @types/express@npm:^4.17.17": version: 4.17.21 resolution: "@types/express@npm:4.17.21" dependencies: @@ -9886,6 +10271,15 @@ __metadata: languageName: node linkType: hard +"@types/jsonwebtoken@npm:^9.0.2": + version: 9.0.6 + resolution: "@types/jsonwebtoken@npm:9.0.6" + dependencies: + "@types/node": "npm:*" + checksum: 1f2145222f62da1b3dbfc586160c4f9685782a671f4a4f4a72151c773945fe25807fd88ed1c270536b76f49053ed932c5dbf714ea0ed77f785665abb75beef05 + languageName: node + linkType: hard + "@types/keygrip@npm:*": version: 1.0.2 resolution: "@types/keygrip@npm:1.0.2" @@ -10281,6 +10675,13 @@ __metadata: languageName: node linkType: hard +"@types/punycode@npm:2.1.4": + version: 2.1.4 + resolution: "@types/punycode@npm:2.1.4" + checksum: 16637bdd8e4f830243072668125f83b93b728085a05140ccc3e7801528d78c62cce5426b07d5cdc75e4f797e1644807c762777f651d1cd071ad0128835cdce5e + languageName: node + linkType: hard + "@types/qs@npm:*": version: 6.9.7 resolution: "@types/qs@npm:6.9.7" @@ -10943,6 +11344,17 @@ __metadata: languageName: node linkType: hard +"@vitejs/plugin-react-swc@npm:3.5.0": + version: 3.5.0 + resolution: "@vitejs/plugin-react-swc@npm:3.5.0" + dependencies: + "@swc/core": "npm:^1.3.96" + peerDependencies: + vite: ^4 || ^5 + checksum: ca3315e2000303aa6da35b6bedc3a5c57550c5576dfa12e12d097a2f69f8c7bc68e6ce7a068685ae13fcbe121d43c133b47a0d4637ac58e366471dd6645bf8ac + languageName: node + linkType: hard + "@vitejs/plugin-react-swc@npm:3.6.0": version: 3.6.0 resolution: "@vitejs/plugin-react-swc@npm:3.6.0" @@ -11716,7 +12128,7 @@ __metadata: languageName: node linkType: hard -"aria-hidden@npm:1.2.4, aria-hidden@npm:^1.1.1": +"aria-hidden@npm:1.2.4": version: 1.2.4 resolution: "aria-hidden@npm:1.2.4" dependencies: @@ -11725,6 +12137,15 @@ __metadata: languageName: node linkType: hard +"aria-hidden@npm:^1.1.1": + version: 1.2.3 + resolution: "aria-hidden@npm:1.2.3" + dependencies: + tslib: "npm:^2.0.0" + checksum: cd7f8474f1bef2dadce8fc74ef6d0fa8c9a477ee3c9e49fc3698e5e93a62014140c520266ee28969d63b5ab474144fe48b6182d010feb6a223f7a73928e6660a + languageName: node + linkType: hard + "aria-query@npm:5.1.3, aria-query@npm:^5.1.3": version: 5.1.3 resolution: "aria-query@npm:5.1.3" @@ -12091,6 +12512,17 @@ __metadata: languageName: node linkType: hard +"axios@npm:1.6.0": + version: 1.6.0 + resolution: "axios@npm:1.6.0" + dependencies: + follow-redirects: "npm:^1.15.0" + form-data: "npm:^4.0.0" + proxy-from-env: "npm:^1.1.0" + checksum: f069d938a05d2293e27c7cd6f0c08a1cb764f7cc43a1e637572f8d5928837ecd735890ad67a867d696094ee4b8b4dfdb3727a57aae600845e4c295581cb32f9a + languageName: node + linkType: hard + "axios@npm:1.6.8, axios@npm:^1.6.0": version: 1.6.8 resolution: "axios@npm:1.6.8" @@ -12342,7 +12774,7 @@ __metadata: languageName: node linkType: hard -"big-integer@npm:^1.6.16": +"big-integer@npm:^1.6.16, big-integer@npm:^1.6.44": version: 1.6.51 resolution: "big-integer@npm:1.6.51" checksum: c7a12640901906d6f6b6bdb42a4eaba9578397b6d9a0dd090cf001ec813ff2bfcd441e364068ea0416db6175d2615f8ed19cff7d1a795115bf7c92d44993f991 @@ -12478,6 +12910,15 @@ __metadata: languageName: node linkType: hard +"bplist-parser@npm:^0.2.0": + version: 0.2.0 + resolution: "bplist-parser@npm:0.2.0" + dependencies: + big-integer: "npm:^1.6.44" + checksum: 15d31c1b0c7e0fb384e96349453879a33609d92d91b55a9ccee04b4be4b0645f1c823253d73326a1a23104521fbc45c2dd97fb05adf61863841b68cbb2ca7a3d + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -12722,6 +13163,15 @@ __metadata: languageName: node linkType: hard +"bundle-name@npm:^3.0.0": + version: 3.0.0 + resolution: "bundle-name@npm:3.0.0" + dependencies: + run-applescript: "npm:^5.0.0" + checksum: edf2b1fbe6096ed32e7566947ace2ea937ee427391744d7510a2880c4b9a5b3543d3f6c551236a29e5c87d3195f8e2912516290e638c15bcbede7b37cc375615 + languageName: node + linkType: hard + "byte-size@npm:8.1.1": version: 8.1.1 resolution: "byte-size@npm:8.1.1" @@ -13188,6 +13638,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:3.8.0, ci-info@npm:^3.2.0, ci-info@npm:^3.6.1": + version: 3.8.0 + resolution: "ci-info@npm:3.8.0" + checksum: b00e9313c1f7042ca8b1297c157c920d6d69f0fbad7b867910235676df228c4b4f4df33d06cacae37f9efba7a160b0a167c6be85492b419ef71d85660e60606b + languageName: node + linkType: hard + "ci-info@npm:4.0.0": version: 4.0.0 resolution: "ci-info@npm:4.0.0" @@ -13195,13 +13652,6 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^3.2.0, ci-info@npm:^3.6.1": - version: 3.8.0 - resolution: "ci-info@npm:3.8.0" - checksum: b00e9313c1f7042ca8b1297c157c920d6d69f0fbad7b867910235676df228c4b4f4df33d06cacae37f9efba7a160b0a167c6be85492b419ef71d85660e60606b - languageName: node - linkType: hard - "cjs-module-lexer@npm:^1.0.0": version: 1.2.2 resolution: "cjs-module-lexer@npm:1.2.2" @@ -13271,6 +13721,15 @@ __metadata: languageName: node linkType: hard +"cli-progress@npm:3.12.0": + version: 3.12.0 + resolution: "cli-progress@npm:3.12.0" + dependencies: + string-width: "npm:^4.2.3" + checksum: a6a549919a7461f5e798b18a4a19f83154bab145d3ec73d7f3463a8db8e311388c545ace1105557760a058cc4999b7f28c9d8d24d9783ee2912befb32544d4b8 + languageName: node + linkType: hard + "cli-spinners@npm:2.6.1": version: 2.6.1 resolution: "cli-spinners@npm:2.6.1" @@ -14139,9 +14598,11 @@ __metadata: version: 0.0.0-use.local resolution: "create-strapi-app@workspace:packages/cli/create-strapi-app" dependencies: + "@strapi/cloud-cli": "npm:5.0.0-beta.14" "@strapi/generate-new": "npm:5.0.0-beta.14" "@strapi/pack-up": "npm:5.0.0" "@types/inquirer": "npm:8.2.5" + chalk: "npm:4.1.2" commander: "npm:8.3.0" eslint-config-custom: "npm:5.0.0-beta.14" inquirer: "npm:8.2.5" @@ -14616,6 +15077,28 @@ __metadata: languageName: node linkType: hard +"default-browser-id@npm:^3.0.0": + version: 3.0.0 + resolution: "default-browser-id@npm:3.0.0" + dependencies: + bplist-parser: "npm:^0.2.0" + untildify: "npm:^4.0.0" + checksum: 279c7ad492542e5556336b6c254a4eaf31b2c63a5433265655ae6e47301197b6cfb15c595a6fdc6463b2ff8e1a1a1ed3cba56038a60e1527ba4ab1628c6b9941 + languageName: node + linkType: hard + +"default-browser@npm:^4.0.0": + version: 4.0.0 + resolution: "default-browser@npm:4.0.0" + dependencies: + bundle-name: "npm:^3.0.0" + default-browser-id: "npm:^3.0.0" + execa: "npm:^7.1.1" + titleize: "npm:^3.0.0" + checksum: 40c5af984799042b140300be5639c9742599bda76dc9eba5ac9ad5943c83dd36cebc4471eafcfddf8e0ec817166d5ba89d56f08e66a126c7c7908a179cead1a7 + languageName: node + linkType: hard + "defaults@npm:^1.0.3": version: 1.0.3 resolution: "defaults@npm:1.0.3" @@ -14661,6 +15144,13 @@ __metadata: languageName: node linkType: hard +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: f28421cf9ee86eecaf5f3b8fe875f13d7009c2625e97645bfff7a2a49aca678270b86c39f9c32939e5ca7ab96b551377ed4139558c795e076774287ad3af1aa4 + languageName: node + linkType: hard + "define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" @@ -15607,6 +16097,86 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:0.19.11": + version: 0.19.11 + resolution: "esbuild@npm:0.19.11" + dependencies: + "@esbuild/aix-ppc64": "npm:0.19.11" + "@esbuild/android-arm": "npm:0.19.11" + "@esbuild/android-arm64": "npm:0.19.11" + "@esbuild/android-x64": "npm:0.19.11" + "@esbuild/darwin-arm64": "npm:0.19.11" + "@esbuild/darwin-x64": "npm:0.19.11" + "@esbuild/freebsd-arm64": "npm:0.19.11" + "@esbuild/freebsd-x64": "npm:0.19.11" + "@esbuild/linux-arm": "npm:0.19.11" + "@esbuild/linux-arm64": "npm:0.19.11" + "@esbuild/linux-ia32": "npm:0.19.11" + "@esbuild/linux-loong64": "npm:0.19.11" + "@esbuild/linux-mips64el": "npm:0.19.11" + "@esbuild/linux-ppc64": "npm:0.19.11" + "@esbuild/linux-riscv64": "npm:0.19.11" + "@esbuild/linux-s390x": "npm:0.19.11" + "@esbuild/linux-x64": "npm:0.19.11" + "@esbuild/netbsd-x64": "npm:0.19.11" + "@esbuild/openbsd-x64": "npm:0.19.11" + "@esbuild/sunos-x64": "npm:0.19.11" + "@esbuild/win32-arm64": "npm:0.19.11" + "@esbuild/win32-ia32": "npm:0.19.11" + "@esbuild/win32-x64": "npm:0.19.11" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: a40b3858c29618c8c893389372f469245a6b2d1319782af75d33d8ba5dcadfe181fcc935f8e1a907be667946384950a4cf482ebe1e79c99c932d2b8eb35a09d0 + languageName: node + linkType: hard + "esbuild@npm:0.20.2, esbuild@npm:^0.20.1": version: 0.20.2 resolution: "esbuild@npm:0.20.2" @@ -16600,6 +17170,13 @@ __metadata: languageName: node linkType: hard +"eventsource@npm:2.0.2": + version: 2.0.2 + resolution: "eventsource@npm:2.0.2" + checksum: e1c4c3664cebf9efdd55c90818ef847099f298bf521768d479cf22d8a681e666b3042de85327711ba6a8414ac6a04c70d2aeb4f405bba8239a8c36e06a019374 + languageName: node + linkType: hard + "execa@npm:5.0.0": version: 5.0.0 resolution: "execa@npm:5.0.0" @@ -16634,7 +17211,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:7.2.0": +"execa@npm:7.2.0, execa@npm:^7.1.1": version: 7.2.0 resolution: "execa@npm:7.2.0" dependencies: @@ -16954,7 +17531,7 @@ __metadata: languageName: node linkType: hard -"fast-safe-stringify@npm:^2.1.1": +"fast-safe-stringify@npm:2.1.1, fast-safe-stringify@npm:^2.1.1": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" checksum: dc1f063c2c6ac9533aee14d406441f86783a8984b2ca09b19c2fe281f9ff59d315298bc7bc22fd1f83d26fe19ef2f20e2ddb68e96b15040292e555c5ced0c1e4 @@ -17254,7 +17831,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.15.2": +"follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.15.0, follow-redirects@npm:^1.15.2": version: 1.15.3 resolution: "follow-redirects@npm:1.15.3" peerDependenciesMeta: @@ -17449,6 +18026,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:10.0.0": + version: 10.0.0 + resolution: "fs-extra@npm:10.0.0" + dependencies: + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: c333973ece06655bf9a4566c65e648d64d7ab3a36e52011b05263e8f4664d2cc85cf9d98ddd4672857105561d759ef63828cf49428c78470a788a3751094a1a4 + languageName: node + linkType: hard + "fs-extra@npm:11.2.0, fs-extra@npm:^11.1.1": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -17536,6 +18124,16 @@ __metadata: languageName: node linkType: hard +"fsevents@npm:*, fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 4c1ade961ded57cdbfbb5cac5106ec17bc8bccd62e16343c569a0ceeca83b9dfef87550b4dc5cbb89642da412b20c5071f304c8c464b80415446e8e155a038c0 + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@npm:2.3.2, fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" @@ -17546,12 +18144,11 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.3": +"fsevents@patch:fsevents@npm%3A*#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 - resolution: "fsevents@npm:2.3.3" + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: node-gyp: "npm:latest" - checksum: 4c1ade961ded57cdbfbb5cac5106ec17bc8bccd62e16343c569a0ceeca83b9dfef87550b4dc5cbb89642da412b20c5071f304c8c464b80415446e8e155a038c0 conditions: os=darwin languageName: node linkType: hard @@ -17565,15 +18162,6 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - "function-bind@npm:^1.1.1": version: 1.1.1 resolution: "function-bind@npm:1.1.1" @@ -19533,6 +20121,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + "is-extendable@npm:^0.1.0, is-extendable@npm:^0.1.1": version: 0.1.1 resolution: "is-extendable@npm:0.1.1" @@ -19620,6 +20217,17 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 + languageName: node + linkType: hard + "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" @@ -19634,6 +20242,13 @@ __metadata: languageName: node linkType: hard +"is-localhost-ip@npm:2.0.0": + version: 2.0.0 + resolution: "is-localhost-ip@npm:2.0.0" + checksum: ac4c4b0a546d3bd9f40b1545ecb20b968284b1a04531c54e6af18ce4cd596cbdfece3c3e468ce8c8b17fde5c27124057e55121e1c5889e84fcd70df604b5b71b + languageName: node + linkType: hard + "is-lower-case@npm:^1.1.0": version: 1.1.3 resolution: "is-lower-case@npm:1.1.3" @@ -20726,6 +21341,13 @@ __metadata: languageName: node linkType: hard +"jose@npm:^4.14.6": + version: 4.15.5 + resolution: "jose@npm:4.15.5" + checksum: 17944fcc0d9afa07387eef23127c30ecfcc77eafddc4b4f1a349a8eee0536bee9b08ecd745406eaa0af65d531f738b94d2467976479cbfe8b3b60f8fc8082b8d + languageName: node + linkType: hard + "joycon@npm:^3.0.1": version: 3.1.1 resolution: "joycon@npm:3.1.1" @@ -21087,6 +21709,20 @@ __metadata: languageName: node linkType: hard +"jwks-rsa@npm:3.1.0": + version: 3.1.0 + resolution: "jwks-rsa@npm:3.1.0" + dependencies: + "@types/express": "npm:^4.17.17" + "@types/jsonwebtoken": "npm:^9.0.2" + debug: "npm:^4.3.4" + jose: "npm:^4.14.6" + limiter: "npm:^1.1.5" + lru-memoizer: "npm:^2.2.0" + checksum: 004883b3f2c9b12d3dd364acd6be3198343b1ca89fd51c9bc03473a2555282ebb4c374cd391847bbd46eaab19ac19a2e518787683707444c0506fcf7ac4cae97 + languageName: node + linkType: hard + "jws@npm:^3.2.2": version: 3.2.2 resolution: "jws@npm:3.2.2" @@ -21653,6 +22289,13 @@ __metadata: languageName: node linkType: hard +"limiter@npm:^1.1.5": + version: 1.1.5 + resolution: "limiter@npm:1.1.5" + checksum: fa96e9912cf33ec36387e41a09694ccac7aaa8b86e1121333c30a3dfdf6265c849c980abd5f1689021bbab9aadca9d6df58d8db6ce5b999c26dd8cefe94168a9 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -21839,6 +22482,13 @@ __metadata: languageName: node linkType: hard +"lodash.clonedeep@npm:^4.5.0": + version: 4.5.0 + resolution: "lodash.clonedeep@npm:4.5.0" + checksum: 957ed243f84ba6791d4992d5c222ffffca339a3b79dbe81d2eaf0c90504160b500641c5a0f56e27630030b18b8e971ea10b44f928a977d5ced3c8948841b555f + languageName: node + linkType: hard + "lodash.deburr@npm:^4.1.0": version: 4.1.0 resolution: "lodash.deburr@npm:4.1.0" @@ -22061,6 +22711,15 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:6.0.0, lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: fc1fe2ee205f7c8855fa0f34c1ab0bcf14b6229e35579ec1fd1079f31d6fc8ef8eb6fd17f2f4d99788d7e339f50e047555551ebd5e434dda503696e7c6591825 + languageName: node + linkType: hard + "lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": version: 10.2.0 resolution: "lru-cache@npm:10.2.0" @@ -22087,15 +22746,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: "npm:^4.0.0" - checksum: fc1fe2ee205f7c8855fa0f34c1ab0bcf14b6229e35579ec1fd1079f31d6fc8ef8eb6fd17f2f4d99788d7e339f50e047555551ebd5e434dda503696e7c6591825 - languageName: node - linkType: hard - "lru-cache@npm:^7.10.1, lru-cache@npm:^7.5.1, lru-cache@npm:^7.7.1": version: 7.13.1 resolution: "lru-cache@npm:7.13.1" @@ -22124,6 +22774,16 @@ __metadata: languageName: node linkType: hard +"lru-memoizer@npm:^2.2.0": + version: 2.3.0 + resolution: "lru-memoizer@npm:2.3.0" + dependencies: + lodash.clonedeep: "npm:^4.5.0" + lru-cache: "npm:6.0.0" + checksum: 1c00afc28640a2f02116c5907be0543647ad51084c43c3cecc1198efdfb5d3693caad948590f61bce3fc8c9f52ec8f567a64273a947535c2391ee41b675cc5e4 + languageName: node + linkType: hard + "lunr@npm:^2.3.9": version: 2.3.9 resolution: "lunr@npm:2.3.9" @@ -24135,6 +24795,18 @@ __metadata: languageName: node linkType: hard +"open@npm:^9.1.0": + version: 9.1.0 + resolution: "open@npm:9.1.0" + dependencies: + default-browser: "npm:^4.0.0" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + is-wsl: "npm:^2.2.0" + checksum: b45bcc7a6795804a2f560f0ca9f5e5344114bc40754d10c28a811c0c8f7027356979192931a6a7df2ab9e5bab3058988c99ae55f4fb71db2ce9fc77c40f619aa + languageName: node + linkType: hard + "openapi-types@npm:12.1.3": version: 12.1.3 resolution: "openapi-types@npm:12.1.3" @@ -24221,6 +24893,18 @@ __metadata: languageName: node linkType: hard +"os-paths@npm:^7.4.0": + version: 7.4.0 + resolution: "os-paths@npm:7.4.0" + dependencies: + fsevents: "npm:*" + dependenciesMeta: + fsevents: + optional: true + checksum: dc362e76cbe20fa39a19005df7bc8b68a7ccf145b64d2f5aa976ee09e2f8a355d811954df7ffc9668ff083dcddffd23bb0de33e968d49eca15c234bff2fd33d7 + languageName: node + linkType: hard + "os-tmpdir@npm:~1.0.2": version: 1.0.2 resolution: "os-tmpdir@npm:1.0.2" @@ -25169,6 +25853,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.32": + version: 8.4.32 + resolution: "postcss@npm:8.4.32" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.0.0" + source-map-js: "npm:^1.0.2" + checksum: 28084864122f29148e1f632261c408444f5ead0e0b9ea9bd9729d0468818ebe73fe5dc0075acd50c1365dbe639b46a79cba27d355ec857723a24bc9af0f18525 + languageName: node + linkType: hard + "postcss@npm:^8.4.33, postcss@npm:^8.4.35": version: 8.4.36 resolution: "postcss@npm:8.4.36" @@ -25295,6 +25990,30 @@ __metadata: languageName: node linkType: hard +"prettier-plugin-packagejson@npm:2.4.5": + version: 2.4.5 + resolution: "prettier-plugin-packagejson@npm:2.4.5" + dependencies: + sort-package-json: "npm:2.5.1" + synckit: "npm:0.8.5" + peerDependencies: + prettier: ">= 1.16.0" + peerDependenciesMeta: + prettier: + optional: true + checksum: 9d7529e42546c157194c5d490890852c7e97d2c3ae529f83e3caec61ec97b5bc63b28b25836d7de579accde09b6e161cc9145b2d4105822586b589eedb1f2d14 + languageName: node + linkType: hard + +"prettier@npm:2.8.4": + version: 2.8.4 + resolution: "prettier@npm:2.8.4" + bin: + prettier: bin-prettier.js + checksum: 57aedf9eea2ea3a4091c7867c8192d268614c395826c323c1fee7841b3ebab6b299c034b5a083f908d8a995ba7fc5c633ecc4b90c8fd56615c0c054a73d8c6b3 + languageName: node + linkType: hard + "prettier@npm:3.2.5": version: 3.2.5 resolution: "prettier@npm:3.2.5" @@ -25510,6 +26229,13 @@ __metadata: languageName: node linkType: hard +"punycode@npm:2.3.1": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 + languageName: node + linkType: hard + "punycode@npm:^2.1.0, punycode@npm:^2.1.1": version: 2.1.1 resolution: "punycode@npm:2.1.1" @@ -26916,6 +27642,15 @@ __metadata: languageName: node linkType: hard +"run-applescript@npm:^5.0.0": + version: 5.0.0 + resolution: "run-applescript@npm:5.0.0" + dependencies: + execa: "npm:^5.0.0" + checksum: d00c2dbfa5b2d774de7451194b8b125f40f65fc183de7d9dcae97f57f59433586d3c39b9001e111c38bfa24c3436c99df1bb4066a2a0c90d39a8c4cd6889af77 + languageName: node + linkType: hard + "run-async@npm:^2.4.0": version: 2.4.1 resolution: "run-async@npm:2.4.1" @@ -27819,6 +28554,23 @@ __metadata: languageName: node linkType: hard +"sort-package-json@npm:2.5.1": + version: 2.5.1 + resolution: "sort-package-json@npm:2.5.1" + dependencies: + detect-indent: "npm:^7.0.1" + detect-newline: "npm:^4.0.0" + get-stdin: "npm:^9.0.0" + git-hooks-list: "npm:^3.0.0" + globby: "npm:^13.1.2" + is-plain-obj: "npm:^4.1.0" + sort-object-keys: "npm:^1.1.3" + bin: + sort-package-json: cli.js + checksum: d2767a5b5c219fbf0704c7c947a938aac7a0d16069e4f2cda8a187d476e59e56188f67fe1e3e46cf71cae281746d411715c8954fc8f72437a3030a3d5743129b + languageName: node + linkType: hard + "sorted-array-functions@npm:^1.3.0": version: 1.3.0 resolution: "sorted-array-functions@npm:1.3.0" @@ -28724,6 +29476,16 @@ __metadata: languageName: node linkType: hard +"synckit@npm:0.8.5": + version: 0.8.5 + resolution: "synckit@npm:0.8.5" + dependencies: + "@pkgr/utils": "npm:^2.3.1" + tslib: "npm:^2.5.0" + checksum: fb6798a2db2650ca3a2435ad32d4fc14842da807993a1a350b64d267e0e770aa7f26492b119aa7500892d3d07a5af1eec7bfbd6e23a619451558be0f226a6094 + languageName: node + linkType: hard + "synckit@npm:0.9.0": version: 0.9.0 resolution: "synckit@npm:0.9.0" @@ -29049,6 +29811,13 @@ __metadata: languageName: node linkType: hard +"titleize@npm:^3.0.0": + version: 3.0.0 + resolution: "titleize@npm:3.0.0" + checksum: 71fbbeabbfb36ccd840559f67f21e356e1d03da2915b32d2ae1a60ddcc13a124be2739f696d2feb884983441d159a18649e8d956648d591bdad35c430a6b6d28 + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -29333,7 +30102,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.3.1, tslib@npm:^2.6.2": +"tslib@npm:^2.3.1, tslib@npm:^2.6.0, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca @@ -30267,6 +31036,46 @@ __metadata: languageName: node linkType: hard +"vite@npm:5.0.13": + version: 5.0.13 + resolution: "vite@npm:5.0.13" + dependencies: + esbuild: "npm:^0.19.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.32" + rollup: "npm:^4.2.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: e0da15142ecbe3e88dbb2682c86c7e468927ea35a04c6a57dae623c575d632f3150a1098905af2da5a598b604a5762bdf45f904d00a2ecc6e93042d904b01077 + languageName: node + linkType: hard + "vite@npm:5.1.6": version: 5.1.6 resolution: "vite@npm:5.1.6" @@ -30974,6 +31783,19 @@ __metadata: languageName: node linkType: hard +"xdg-app-paths@npm:8.3.0": + version: 8.3.0 + resolution: "xdg-app-paths@npm:8.3.0" + dependencies: + fsevents: "npm:*" + xdg-portable: "npm:^10.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 9309fde27cf175d52ed119f53dbd6a2c7afde5f2b7170d381c579f10536e7101ea8076bd5da627209c7b6ba23c73386da7d8f26055400ce4debb284d636f9f9d + languageName: node + linkType: hard + "xdg-basedir@npm:^4.0.0": version: 4.0.0 resolution: "xdg-basedir@npm:4.0.0" @@ -30981,6 +31803,19 @@ __metadata: languageName: node linkType: hard +"xdg-portable@npm:^10.6.0": + version: 10.6.0 + resolution: "xdg-portable@npm:10.6.0" + dependencies: + fsevents: "npm:*" + os-paths: "npm:^7.4.0" + dependenciesMeta: + fsevents: + optional: true + checksum: c73463ff4329de4874322dd843d70ba12311de02bcc65cae6cbd58a24c56ad402e15561b5a7ee0aa6ba26bb0ec440d316adc475abee1bbdf82755f3588fc83f1 + languageName: node + linkType: hard + "xml-name-validator@npm:^4.0.0": version: 4.0.0 resolution: "xml-name-validator@npm:4.0.0" From ab398552fe82a7909028edd38f34c9ae3a40948a Mon Sep 17 00:00:00 2001 From: Alexandre Bodin Date: Fri, 21 Jun 2024 11:47:09 +0200 Subject: [PATCH 24/78] chore: update & add tests --- .../src/schema/__tests__/schema-diff.test.ts | 77 +++++++++++++++---- packages/core/database/src/schema/diff.ts | 20 +++-- packages/core/database/src/schema/index.ts | 9 +-- 3 files changed, 72 insertions(+), 34 deletions(-) diff --git a/packages/core/database/src/schema/__tests__/schema-diff.test.ts b/packages/core/database/src/schema/__tests__/schema-diff.test.ts index ad1c45f237..58f7590088 100644 --- a/packages/core/database/src/schema/__tests__/schema-diff.test.ts +++ b/packages/core/database/src/schema/__tests__/schema-diff.test.ts @@ -31,15 +31,17 @@ describe('diffSchemas', () => { foreignKeys: [], }; - const srcSchema: Schema = { + const databaseSchema: Schema = { tables: [], }; - const destSchema: Schema = { + const userSchema: Schema = { tables: [testTable], }; - expect(await diffSchemas(srcSchema, destSchema)).toStrictEqual({ + expect( + await diffSchemas({ databaseSchema, userSchema, previousSchema: userSchema }) + ).toStrictEqual({ status: 'CHANGED', diff: { tables: { @@ -60,15 +62,19 @@ describe('diffSchemas', () => { foreignKeys: [], }; - const srcSchema = { + const databaseSchema = { tables: [testTable], }; - const destSchema = { + const userSchema = { tables: [], }; - expect(await diffSchemas(srcSchema, destSchema)).toStrictEqual({ + const previousSchema = { + tables: [testTable], + }; + + expect(await diffSchemas({ databaseSchema, userSchema, previousSchema })).toStrictEqual({ status: 'CHANGED', diff: { tables: { @@ -89,15 +95,17 @@ describe('diffSchemas', () => { foreignKeys: [], }; - const srcSchema = { + const databaseSchema = { tables: [testTable], }; - const destSchema = { + const userSchema = { tables: [testTable], }; - expect(await diffSchemas(srcSchema, destSchema)).toStrictEqual({ + expect( + await diffSchemas({ databaseSchema, userSchema, previousSchema: userSchema }) + ).toStrictEqual({ status: 'UNCHANGED', diff: { tables: { @@ -110,9 +118,42 @@ describe('diffSchemas', () => { }); }); + test('UnTracked Table', async () => { + const testTable = { + name: 'my_table', + columns: [], + indexes: [], + foreignKeys: [], + }; + + const databaseSchema = { + tables: [testTable], + }; + + const userSchema = { + tables: [], + }; + + const previousSchema = { + tables: [], + }; + + expect(await diffSchemas({ databaseSchema, userSchema, previousSchema })).toStrictEqual({ + status: 'UNCHANGED', + diff: { + tables: { + added: [], + updated: [], + unchanged: [], + removed: [], + }, + }, + }); + }); + describe('Changed table', () => { test('added column', async () => { - const srcSchema: Schema = { + const databaseSchema: Schema = { tables: [ { name: 'my_table', @@ -123,7 +164,7 @@ describe('diffSchemas', () => { ], }; - const destSchema: Schema = { + const userSchema: Schema = { tables: [ { name: 'my_table', @@ -140,7 +181,9 @@ describe('diffSchemas', () => { ], }; - expect(await diffSchemas(srcSchema, destSchema)).toStrictEqual({ + expect( + await diffSchemas({ databaseSchema, userSchema, previousSchema: userSchema }) + ).toStrictEqual({ status: 'CHANGED', diff: { tables: { @@ -225,15 +268,19 @@ describe('diffSchemas', () => { }, } as any; - const srcSchema: Schema = { + const databaseSchema: Schema = { tables: [...testTables, coreStoreTable], }; - const destSchema = { + const userSchema = { tables: [coreStoreTable], }; - expect(await diffSchemas(srcSchema, destSchema)).toStrictEqual({ + const previousSchema = { + tables: [coreStoreTable, testTables[1]], + }; + + expect(await diffSchemas({ databaseSchema, userSchema, previousSchema })).toStrictEqual({ status: 'CHANGED', diff: { tables: { diff --git a/packages/core/database/src/schema/diff.ts b/packages/core/database/src/schema/diff.ts index 7f2692fe6e..097605ff38 100644 --- a/packages/core/database/src/schema/diff.ts +++ b/packages/core/database/src/schema/diff.ts @@ -28,7 +28,7 @@ type TableDiffContext = { }; type SchemaDiffContext = { - previousSchema: Schema; + previousSchema?: Schema; databaseSchema: Schema; userSchema: Schema; }; @@ -395,7 +395,8 @@ export default (db: Database) => { // for each table in the user schema, check if it already exists in the database schema for (const userSchemaTable of userSchema.tables) { const databaseTable = helpers.findTable(databaseSchema, userSchemaTable.name); - const previousTable = helpers.findTable(previousSchema, userSchemaTable.name); + const previousTable = + previousSchema && helpers.findTable(previousSchema, userSchemaTable.name); if (databaseTable) { const { status, diff } = diffTables({ @@ -434,20 +435,17 @@ export default (db: Database) => { // for all tables in the database schema, check if they are not in the user schema for (const databaseTable of databaseSchema.tables) { + const isInUserSchema = helpers.hasTable(userSchema, databaseTable.name); + const wasTracked = previousSchema && helpers.hasTable(previousSchema, databaseTable.name); + const isReserved = reservedTables.includes(databaseTable.name); + // NOTE: if db table is not in the user schema and is not in the previous stored schema leave it alone. it is a user custom table that we should not touch - if ( - !helpers.hasTable(userSchema, databaseTable.name) && - !helpers.hasTable(previousSchema, databaseTable.name) - ) { + if (!isInUserSchema && !wasTracked) { continue; } // if a db table is not in the user schema I want to delete it - if ( - !helpers.hasTable(userSchema, databaseTable.name) && - helpers.hasTable(previousSchema, databaseTable.name) && - !reservedTables.includes(databaseTable.name) - ) { + if (!isInUserSchema && wasTracked && !isReserved) { const dependencies = persistedTables .filter((table: PersistedTable) => { const dependsOn = table?.dependsOn; diff --git a/packages/core/database/src/schema/index.ts b/packages/core/database/src/schema/index.ts index 08918530f6..1d9454a689 100644 --- a/packages/core/database/src/schema/index.ts +++ b/packages/core/database/src/schema/index.ts @@ -76,13 +76,6 @@ export const createSchemaProvider = (db: Database): SchemaProvider => { const databaseSchema = await db.dialect.schemaInspector.getSchema(); const storedSchema = await this.schemaStorage.read(); - let previousSchema: Schema; - - if (!storedSchema) { - previousSchema = this.schema; - } else { - previousSchema = storedSchema.schema; - } /* 3way diff - DB schema / previous metadataSchema / new metadataSchema @@ -95,7 +88,7 @@ export const createSchemaProvider = (db: Database): SchemaProvider => { */ const { status, diff } = await this.schemaDiff.diff({ - previousSchema, + previousSchema: storedSchema?.schema, databaseSchema, userSchema: this.schema, }); From d4d66d1fc007b01e2c3208c7fe56645faf7b018b Mon Sep 17 00:00:00 2001 From: Marc Roig Date: Fri, 21 Jun 2024 15:11:48 +0200 Subject: [PATCH 25/78] fix: incorrect populate when using morph relations (#20582) --- .../content-manager/server/src/history/services/utils.ts | 6 ++++++ .../core/src/services/document-service/utils/populate.ts | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/packages/core/content-manager/server/src/history/services/utils.ts b/packages/core/content-manager/server/src/history/services/utils.ts index cf17608d50..ee98ebc9b6 100644 --- a/packages/core/content-manager/server/src/history/services/utils.ts +++ b/packages/core/content-manager/server/src/history/services/utils.ts @@ -187,6 +187,12 @@ export const createServiceUtils = ({ strapi }: { strapi: Core.Strapi }) => { return attributes.reduce((acc: any, [attributeName, attribute]) => { switch (attribute.type) { case 'relation': { + // TODO: Support polymorphic relations + const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph'); + if (isMorphRelation) { + break; + } + const isVisible = contentTypes.isVisibleAttribute(model, attributeName); if (isVisible) { acc[attributeName] = { fields: ['documentId', 'locale', 'publishedAt'] }; diff --git a/packages/core/core/src/services/document-service/utils/populate.ts b/packages/core/core/src/services/document-service/utils/populate.ts index 45a8266c50..5702748b53 100644 --- a/packages/core/core/src/services/document-service/utils/populate.ts +++ b/packages/core/core/src/services/document-service/utils/populate.ts @@ -16,6 +16,12 @@ export const getDeepPopulate = (uid: UID.Schema, opts: Options = {}) => { return attributes.reduce((acc: any, [attributeName, attribute]) => { switch (attribute.type) { case 'relation': { + // TODO: Support polymorphic relations + const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph'); + if (isMorphRelation) { + break; + } + // TODO: Should this just be a plain list? // Ignore createdBy, updatedBy, ... const isVisible = contentTypes.isVisibleAttribute(model, attributeName); From d262f42cc526be35c9e8a634a4d04d179d3030d1 Mon Sep 17 00:00:00 2001 From: Simone Date: Fri, 21 Jun 2024 15:41:13 +0200 Subject: [PATCH 26/78] V5 fix: wrong date saved (#20571) * fix(admin): convert the date to utc on change * fix(admin): fix the delete date problem * fix(date): change field type --- .../core/admin/admin/src/components/FormInputs/Date.tsx | 6 +++--- .../core/admin/admin/src/components/FormInputs/DateTime.tsx | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/admin/admin/src/components/FormInputs/Date.tsx b/packages/core/admin/admin/src/components/FormInputs/Date.tsx index 266d1eee9f..239211650f 100644 --- a/packages/core/admin/admin/src/components/FormInputs/Date.tsx +++ b/packages/core/admin/admin/src/components/FormInputs/Date.tsx @@ -25,10 +25,10 @@ const DateInput = forwardRef( ref={composedRefs} clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })} onChange={(date) => { - field.onChange(name, date); + field.onChange(name, date ? convertLocalDateToUTCDate(date) : null); }} - onClear={() => field.onChange(name, undefined)} - value={value ? convertLocalDateToUTCDate(value) : undefined} + onClear={() => field.onChange(name, null)} + value={value ? convertLocalDateToUTCDate(value) : value} {...props} /> diff --git a/packages/core/admin/admin/src/components/FormInputs/DateTime.tsx b/packages/core/admin/admin/src/components/FormInputs/DateTime.tsx index 3c99eb09ab..d0869aec64 100644 --- a/packages/core/admin/admin/src/components/FormInputs/DateTime.tsx +++ b/packages/core/admin/admin/src/components/FormInputs/DateTime.tsx @@ -11,7 +11,7 @@ import { InputProps } from './types'; const DateTimeInput = forwardRef( ({ name, required, label, hint, labelAction, ...props }, ref) => { const { formatMessage } = useIntl(); - const field = useField(name); + const field = useField(name); const fieldRef = useFocusInputField(name); const composedRefs = useComposedRefs(ref, fieldRef); @@ -24,9 +24,9 @@ const DateTimeInput = forwardRef( ref={composedRefs} clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })} onChange={(date) => { - field.onChange(name, date); + field.onChange(name, date ? date : null); }} - onClear={() => field.onChange(name, undefined)} + onClear={() => field.onChange(name, null)} value={value} {...props} /> From a9112aaf803c1d5bebd316003d91d91a04ade9b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20Herbaux?= Date: Fri, 21 Jun 2024 17:17:37 +0200 Subject: [PATCH 27/78] [Upgrade Tool] Fix JSON Transform Loader (#20593) --- .../src/modules/runner/json/transform.ts | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/utils/upgrade/src/modules/runner/json/transform.ts b/packages/utils/upgrade/src/modules/runner/json/transform.ts index f0dc64b3c9..ecf3ab2bb6 100644 --- a/packages/utils/upgrade/src/modules/runner/json/transform.ts +++ b/packages/utils/upgrade/src/modules/runner/json/transform.ts @@ -27,7 +27,28 @@ export const transformJSON = async ( stats: {}, }; - const esbuildOptions = { extensions: ['.js', '.mjs', '.ts'] }; + /** + * Why do we need to include node_modules (hookIgnoreNodeModules) and specify a matcher (hookMatcher) to esbuild? + * + * When using tools like npx or dlx, the execution context is different from when running the program in a local + * project. npx and dlx run the commands in a temporary installation, which is isolated from local project files. + * + * When hookIgnoreNodeModules is not specified (or set to true), esbuild-register instructs + * Pirates (https://github.com/danez/pirates) to not transpile any files that come from node_modules. + * + * Now, when using npx or dlx to run a script, its location can be seen as "external" because it's not part of + * the temporary environment where npx or dlx execute. Therefore, it's considered to be part of node_modules. + * + * Due to this, if hookIgnoreNodeModules is set to true or left unspecified, + * esbuild-register won't try to compile them upon require. + * + * hookMatcher is added to make sure we're not matching anything else than our codemod in external directories. + */ + const esbuildOptions = { + extensions: ['.js', '.mjs', '.ts'], + hookIgnoreNodeModules: false, + hookMatcher: isEqual(codemodPath), + }; const { unregister } = register(esbuildOptions); const module = require(codemodPath); From c58fb0f79095e1a24d4921a78f820cecf3bf8417 Mon Sep 17 00:00:00 2001 From: Fernando Chavez Date: Fri, 21 Jun 2024 18:15:37 +0200 Subject: [PATCH 28/78] fix(content-manager): blocks issues --- .../FormInputs/BlocksInput/Blocks/Link.tsx | 45 ++++++++++--------- .../FormInputs/BlocksInput/Blocks/List.tsx | 6 +-- .../BlocksInput/Blocks/tests/List.test.tsx | 17 +++++-- .../BlocksInput/tests/BlocksToolbar.test.tsx | 1 + .../BlocksInput/utils/conversions.ts | 32 +++++++------ 5 files changed, 56 insertions(+), 45 deletions(-) diff --git a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.tsx b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.tsx index 85f17c2541..f25615685f 100644 --- a/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.tsx +++ b/packages/core/content-manager/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.tsx @@ -34,22 +34,11 @@ const LinkContent = React.forwardRef( const [linkText, setLinkText] = React.useState(elementText); const [linkUrl, setLinkUrl] = React.useState(link.url); const linkInputRef = React.useRef(null); - const [showRemoveButton, setShowRemoveButton] = React.useState(false); + const showRemoveButton = editor.lastInsertedLinkPath + ? !Path.equals(path, editor.lastInsertedLinkPath) + : true; const [isSaveDisabled, setIsSaveDisabled] = React.useState(false); - const handleOpenChange: Popover.Props['onOpenChange'] = (isOpen) => { - if (isOpen) { - setPopoverOpen(isOpen); - setShowRemoveButton(isOpen); - } else { - setPopoverOpen(isOpen); - if (link.url === '') { - removeLink(editor); - } - ReactEditor.focus(editor); - } - }; - const onLinkChange = (e: React.ChangeEvent) => { setIsSaveDisabled(false); setLinkUrl(e.target.value); @@ -76,6 +65,16 @@ const LinkContent = React.forwardRef( editLink(editor, { url: linkUrl, text: linkText }); setPopoverOpen(false); editor.lastInsertedLinkPath = null; + ReactEditor.focus(editor); + }; + + const handleClose = () => { + if (link.url === '') { + removeLink(editor); + } + + setPopoverOpen(false); + ReactEditor.focus(editor); }; React.useEffect(() => { @@ -89,14 +88,20 @@ const LinkContent = React.forwardRef( (link.url && link.url === linkUrl && elementText && elementText === linkText); return ( - + - + setPopoverOpen(true)} + color="primary600" + > {children} - - + + @@ -150,13 +155,13 @@ const LinkContent = React.forwardRef( })} -
TODO: define the Settings page content (not part of this US)
- + +
+ {({ modified, isSubmitting }: { modified: boolean; isSubmitting: boolean }) => { + return ( + <> + } + type="submit" + > + {formatMessage({ + id: 'global.save', + defaultMessage: 'Save', + })} + + } + title={formatMessage({ + id: 'content-releases.pages.Settings.releases.title', + defaultMessage: 'Releases', + })} + subtitle={formatMessage({ + id: 'content-releases.pages.Settings.releases.description', + defaultMessage: 'Create and manage content updates', + })} + /> + + + + {formatMessage({ + id: 'content-releases.pages.Settings.releases.preferences.title', + defaultMessage: 'Preferences', + })} + + + + + + + + + + ); + }}
); }; + +const TimezoneDropdown = () => { + const { formatMessage } = useIntl(); + const { timezoneList } = getTimezones(new Date()); + const field = useField('defaultTimezone'); + return ( + + + {formatMessage({ + id: 'content-releases.pages.Settings.releases.timezone.label', + defaultMessage: 'Default timezone', + })} + + field.onChange('defaultTimezone', value)} + onTextValueChange={(value) => field.onChange('defaultTimezone', value)} + onClear={() => field.onChange('defaultTimezone', '')} + value={field.value ?? ''} + > + {timezoneList.map((timezone) => ( + + {timezone.value.replace(/&/, ' ')} + + ))} + + + + + ); +}; diff --git a/packages/core/content-releases/admin/src/services/release.ts b/packages/core/content-releases/admin/src/services/release.ts index bb54484a3d..a3139342a1 100644 --- a/packages/core/content-releases/admin/src/services/release.ts +++ b/packages/core/content-releases/admin/src/services/release.ts @@ -21,6 +21,7 @@ import type { PublishRelease, MapEntriesToReleases, } from '../../../shared/contracts/releases'; +import type { GetSettings, UpdateSettings } from '../../../shared/contracts/settings'; import type { EndpointDefinition } from '@reduxjs/toolkit/query'; export interface GetReleasesQueryParams { @@ -78,7 +79,7 @@ const extendInvalidatesTags = ( const releaseApi = adminApi .enhanceEndpoints({ - addTagTypes: ['Release', 'ReleaseAction', 'EntriesInRelease'], + addTagTypes: ['Release', 'ReleaseAction', 'EntriesInRelease', 'ReleaseSettings'], endpoints: { updateDocument(endpoint: AnyEndpointDefinition) { extendInvalidatesTags(endpoint, [ @@ -355,6 +356,20 @@ const releaseApi = adminApi }, providesTags: [{ type: 'EntriesInRelease' }], }), + getReleaseSettings: build.query({ + query: () => '/content-releases/settings', + providesTags: [{ type: 'ReleaseSettings' }], + }), + updateReleaseSettings: build.mutation({ + query(data) { + return { + url: '/content-releases/settings', + method: 'PUT', + data, + }; + }, + invalidatesTags: (result, error, arg) => [{ type: 'ReleaseSettings' }], + }), }; }, }); @@ -373,6 +388,8 @@ const { useDeleteReleaseActionMutation, useDeleteReleaseMutation, useGetMappedEntriesInReleasesQuery, + useGetReleaseSettingsQuery, + useUpdateReleaseSettingsMutation, } = releaseApi; export { @@ -389,5 +406,7 @@ export { useDeleteReleaseActionMutation, useDeleteReleaseMutation, useGetMappedEntriesInReleasesQuery, + useGetReleaseSettingsQuery, + useUpdateReleaseSettingsMutation, releaseApi, }; diff --git a/packages/core/content-releases/admin/src/translations/en.json b/packages/core/content-releases/admin/src/translations/en.json index 08b7644bff..ecd795558e 100644 --- a/packages/core/content-releases/admin/src/translations/en.json +++ b/packages/core/content-releases/admin/src/translations/en.json @@ -79,5 +79,9 @@ "pages.ReleaseDetails.groupBy.option.content-type": "Content-Types", "pages.ReleaseDetails.groupBy.option.locales": "Locales", "pages.ReleaseDetails.groupBy.option.actions": "Actions", - "pages.ReleaseDetails.header-subtitle.scheduled": "Scheduled for {date} at {time} ({offset})" + "pages.ReleaseDetails.header-subtitle.scheduled": "Scheduled for {date} at {time} ({offset})", + "pages.Settings.releases.title": "Releases", + "pages.Settings.releases.description": "Create and manage content updates", + "pages.Settings.releases.timezone.label": "Default timezone", + "pages.Settings.releases.setting.default-timezone-notification-success": "Default timezone updated." } diff --git a/packages/core/content-releases/admin/src/utils/time.ts b/packages/core/content-releases/admin/src/utils/time.ts index 59bf4e586a..7fc62983d1 100644 --- a/packages/core/content-releases/admin/src/utils/time.ts +++ b/packages/core/content-releases/admin/src/utils/time.ts @@ -23,3 +23,25 @@ export const getTimezoneOffset = (timezone: string, date: Date) => { return ''; } }; + +interface ITimezoneOption { + offset: string; + value: string; +} + +export const getTimezones = (selectedDate: Date) => { + const timezoneList: ITimezoneOption[] = Intl.supportedValuesOf('timeZone').map((timezone) => { + // Timezone will be in the format GMT${OFFSET} where offset could be nothing, + // a four digit string e.g. +05:00 or -08:00 + const utcOffset = getTimezoneOffset(timezone, selectedDate); + + // Offset and timezone are concatenated with '&', so to split and save the required timezone in DB + return { offset: utcOffset, value: `${utcOffset}&${timezone}` } satisfies ITimezoneOption; + }); + + const systemTimezone = timezoneList.find( + (timezone) => timezone.value.split('&')[1] === Intl.DateTimeFormat().resolvedOptions().timeZone + ); + + return { timezoneList, systemTimezone }; +}; From c6307584fe2d90797b92af98c716d62f1f20e2f4 Mon Sep 17 00:00:00 2001 From: Alexandre Bodin Date: Fri, 21 Jun 2024 21:21:56 +0200 Subject: [PATCH 30/78] fix: ui --- .../components/CollapsableContentType.tsx | 7 ++-- .../ApplicationInfo/components/LogoInput.tsx | 37 +++++++++++++------ .../components/CollapsePropertyMatrix.tsx | 2 +- .../Roles/components/ConditionsModal.tsx | 19 +++++++--- .../Roles/components/ContentTypeCollapses.tsx | 15 +++++++- .../Roles/components/PluginsAndSettings.tsx | 11 +++++- .../admin/src/routes/settings/:id.tsx | 5 ++- .../PermissionRow/CheckboxWrapper.jsx | 5 ++- .../Permissions/PermissionRow/SubCategory.jsx | 2 +- .../EmailTemplates/components/EmailTable.jsx | 29 +++++++++------ .../pages/ListPage/components/TableBody.jsx | 9 +++-- 11 files changed, 96 insertions(+), 45 deletions(-) diff --git a/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.tsx b/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.tsx index 3d27a7c675..97a86411e7 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.tsx @@ -19,7 +19,8 @@ import { useApiTokenPermissions } from '../apiTokenPermissions'; const activeCheckboxWrapperStyles = css` background: ${(props) => props.theme.colors.primary100}; - svg { + + #cog { opacity: 1; } `; @@ -29,7 +30,7 @@ const CheckboxWrapper = styled(Box)<{ $isActive: boolean }>` justify-content: space-between; align-items: center; - svg { + #cog { opacity: 0; path { fill: ${(props) => props.theme.colors.primary600}; @@ -137,7 +138,7 @@ export const CollapsableContentType = ({ } style={{ display: 'inline-flex', alignItems: 'center' }} > - + diff --git a/packages/core/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.tsx b/packages/core/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.tsx index a54bd752ba..8e3598e010 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.tsx @@ -81,7 +81,14 @@ const LogoInput = ({ }; return ( - + { + if (state === false) { + handleClose(); + } + }} + > { const { setLocalImage, goToStep, onClose } = useLogoInputContext('ComputerForm'); - const handleDragEnter = () => setDragOver(true); - const handleDragLeave = () => setDragOver(false); + const handleDragEnter = () => { + setDragOver(true); + }; + const handleDragLeave = () => { + setDragOver(false); + }; const handleClick: ButtonProps['onClick'] = (e) => { e.preventDefault(); @@ -367,15 +378,17 @@ const ComputerForm = () => { })} - + + + - + diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.jsx b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.jsx index 1fb2776c04..7e6157c8ad 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.jsx +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/components/EmailTable.jsx @@ -10,6 +10,7 @@ import { Tr, Typography, VisuallyHidden, + Box, } from '@strapi/design-system'; import { Check, Pencil, ArrowClockwise as Refresh } from '@strapi/icons'; import PropTypes from 'prop-types'; @@ -53,12 +54,14 @@ const EmailTable = ({ canUpdate, onEditClick }) => { onEditClick('reset_password')}> - + + + @@ -84,12 +87,14 @@ const EmailTable = ({ canUpdate, onEditClick }) => { onEditClick('email_confirmation')}> - + + + diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx b/packages/plugins/users-permissions/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx index 7e91f0061c..ccb176f3f6 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/pages/ListPage/components/TableBody.jsx @@ -4,20 +4,20 @@ import { Flex, IconButton, Link, Tbody, Td, Tr, Typography } from '@strapi/desig import { Pencil, Trash } from '@strapi/icons'; import PropTypes from 'prop-types'; import { useIntl } from 'react-intl'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate, NavLink } from 'react-router-dom'; import { styled } from 'styled-components'; const EditLink = styled(Link)` align-items: center; height: 3.2rem; + width: 3.2rem; display: flex; justify-content: center; padding: ${({ theme }) => `${theme.spaces[2]}}`}; - width: 3.2rem; svg { - height: 1.2rem; - width: 1.2rem; + height: 1.6rem; + width: 1.6rem; path { fill: ${({ theme }) => theme.colors.neutral500}; @@ -72,6 +72,7 @@ const TableBody = ({ sortedRoles, canDelete, canUpdate, setRoleToDelete, onDelet e.stopPropagation()}> {canUpdate ? ( Date: Sat, 22 Jun 2024 15:12:45 +0200 Subject: [PATCH 31/78] fix: rbac property matrix --- .../components/CollapsePropertyMatrix.tsx | 55 +++++++++---------- .../Roles/components/ContentTypeCollapses.tsx | 13 +++-- .../pages/Roles/components/ContentTypes.tsx | 11 +--- .../Roles/components/RowLabelWithCheckbox.tsx | 42 +++++++------- 4 files changed, 58 insertions(+), 63 deletions(-) diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.tsx index 19c100f109..30b42cfb90 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.tsx @@ -225,7 +225,7 @@ const ActionRow = ({ }, }); }} - value={checkboxValue} + checked={checkboxValue} /> ); @@ -322,15 +322,15 @@ const Wrapper = styled(Flex)<{ $isCollapsable?: boolean; $isActiv height: ${rowHeight}; flex: 1; - ${({ $isCollapsable, theme }) => + &:hover { + ${({ $isCollapsable, theme }) => $isCollapsable && activeStyle(theme)} + } + + ${({ $isCollapsable }) => $isCollapsable && ` ${CarretIcon} { - display: block; - color: ${theme.colors.neutral100}; - } - &:hover { - ${activeStyle(theme)} + display: flex; } `} ${({ $isActive, theme }) => $isActive && activeStyle(theme)}; @@ -338,7 +338,15 @@ const Wrapper = styled(Flex)<{ $isCollapsable?: boolean; $isActiv const CarretIcon = styled(CaretDown)<{ $isActive: boolean }>` display: none; - width: 1rem; + + svg { + width: 1.4rem; + } + + path { + fill: ${({ theme }) => theme.colors.neutral200}; + } + transform: rotate(${({ $isActive }) => ($isActive ? '180' : '0')}deg); margin-left: ${({ theme }) => theme.spaces[2]}; `; @@ -485,7 +493,7 @@ const SubActionRow = ({ }, }); }} - value={checkboxValue} + checked={checkboxValue} />
); @@ -566,15 +574,15 @@ const RowStyle = styled(Flex)<{ padding-left: ${({ theme }) => theme.spaces[4]}; width: ${({ $level }) => 145 - $level * 36}px; - ${({ $isCollapsable, theme }) => + &:hover { + ${({ $isCollapsable, theme }) => $isCollapsable && activeStyle(theme)} + } + + ${({ $isCollapsable }) => $isCollapsable && ` ${CarretIcon} { - display: block; - color: ${theme.colors.neutral100}; - } - &:hover { - ${activeStyle(theme)} + display: flex; } `} ${({ $isActive, theme }) => $isActive && activeStyle(theme)}; @@ -658,26 +666,15 @@ const Header = ({ headers = [], label }: HeaderProps) => { ); }; -/* ------------------------------------------------------------------------------------------------- - * activeStyle (util) - * -----------------------------------------------------------------------------------------------*/ - -/** - * @internal - */ const activeStyle = (theme: DefaultTheme) => css` - ${RowLabel} { - color: ${theme.colors.primary600}; - font-weight: ${theme.fontWeights.bold}; - } - ${CarretIcon} { - display: block; + color: ${theme.colors.primary600}; + font-weight: ${theme.fontWeights.bold}; + ${CarretIcon} { path { fill: ${theme.colors.primary600}; } } `; -export { activeStyle as _internalActiveStyle }; export { CollapsePropertyMatrix }; diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.tsx index 0c06b3109b..dab6b51da5 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.tsx @@ -18,7 +18,7 @@ import { createArrayOfValues } from '../utils/createArrayOfValues'; import { ConditionForm } from '../utils/forms'; import { getCheckboxState } from '../utils/getCheckboxState'; -import { CollapsePropertyMatrix, _internalActiveStyle } from './CollapsePropertyMatrix'; +import { CollapsePropertyMatrix } from './CollapsePropertyMatrix'; import { ConditionsButton } from './ConditionsButton'; import { ConditionsModal } from './ConditionsModal'; import { HiddenAction } from './HiddenAction'; @@ -358,16 +358,15 @@ const activeRowStyle = (theme: DefaultTheme, isActive?: boolean): string => ` background-color: ${theme.colors.primary100}; color: ${theme.colors.primary600}; border-radius: ${isActive ? '2px 2px 0 0' : '2px'}; + font-weight: ${theme.fontWeights.bold}; } + ${Chevron} { display: flex; } ${ConditionsButton} { display: block; } - &:hover { - ${_internalActiveStyle(theme)} - } &:focus-within { ${() => activeRowStyle(theme, isActive)} @@ -401,10 +400,12 @@ const Cell = styled(Flex)` const Chevron = styled(Box)` display: none; + svg { - width: 11px; + width: 1.4rem; } - * { + + path { fill: ${({ theme }) => theme.colors.primary600}; } `; diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypes.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypes.tsx index ca15fc09b6..eeeb194598 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypes.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypes.tsx @@ -1,5 +1,4 @@ -import { Box, BoxComponent } from '@strapi/design-system'; -import { styled } from 'styled-components'; +import { Box } from '@strapi/design-system'; import { ContentPermission } from '../../../../../../../shared/contracts/permissions'; @@ -19,7 +18,7 @@ const ContentTypes = ({ const sortedSubjects = [...subjects].sort((a, b) => a.label.localeCompare(b.label)); return ( - + - + ); }; -const StyledBox = styled(Box)` - overflow-x: auto; -`; - export { ContentTypes }; diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RowLabelWithCheckbox.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RowLabelWithCheckbox.tsx index 013df77174..30a67350ca 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RowLabelWithCheckbox.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RowLabelWithCheckbox.tsx @@ -36,6 +36,26 @@ const RowLabelWithCheckbox = ({ }: RowLabelWithCheckboxProps) => { const { formatMessage } = useIntl(); + const collapseLabelProps = { + title: label, + alignItems: 'center', + $isCollapsable: isCollapsable, + }; + + if (isCollapsable) { + Object.assign(collapseLabelProps, { + onClick, + 'aria-expanded': isActive, + onKeyDown({ key }: React.KeyboardEvent) { + if (key === 'Enter' || key === ' ') { + onClick(); + } + }, + tabIndex: 0, + role: 'button', + }); + } + return ( @@ -61,26 +81,8 @@ const RowLabelWithCheckbox = ({ checked={someChecked ? 'indeterminate' : value} /> - ) => - (key === 'Enter' || key === ' ') && onClick(), - tabIndex: 0, - role: 'button', - })} - > - - {capitalise(label)} - + + {label} {children} From c64804aef8378ff0fc980c6727107337b8f3a95a Mon Sep 17 00:00:00 2001 From: Alexandre Bodin Date: Sat, 22 Jun 2024 15:37:10 +0200 Subject: [PATCH 32/78] fix: user creation with sso --- .../admin/src/components/ConfirmDialog.tsx | 12 ++++++++++- .../admin/src/layouts/AuthenticatedLayout.tsx | 2 +- .../pages/Settings/pages/Roles/CreatePage.tsx | 10 ++++------ .../pages/Settings/pages/Users/EditPage.tsx | 2 +- .../pages/Settings/pages/Users/ListPage.tsx | 20 +++++++++++++++---- .../pages/Users/components/NewUserForm.tsx | 11 +++------- .../i18n/admin/src/components/Initializer.tsx | 19 ------------------ packages/plugins/i18n/admin/src/index.ts | 3 --- 8 files changed, 36 insertions(+), 43 deletions(-) delete mode 100644 packages/plugins/i18n/admin/src/components/Initializer.tsx diff --git a/packages/core/admin/admin/src/components/ConfirmDialog.tsx b/packages/core/admin/admin/src/components/ConfirmDialog.tsx index 736edc7236..89c11fbbc2 100644 --- a/packages/core/admin/admin/src/components/ConfirmDialog.tsx +++ b/packages/core/admin/admin/src/components/ConfirmDialog.tsx @@ -3,6 +3,7 @@ import * as React from 'react'; import { Button, ButtonProps, Dialog } from '@strapi/design-system'; import { WarningCircle } from '@strapi/icons'; import { useIntl } from 'react-intl'; +import { styled } from 'styled-components'; /* ------------------------------------------------------------------------------------------------- * ConfirmDialog @@ -49,7 +50,7 @@ interface ConfirmDialogProps extends Pick, Pick, + icon = , onConfirm, variant = 'danger-light', startAction, @@ -115,5 +116,14 @@ const ConfirmDialog = ({ ); }; +const StyledWarning = styled(WarningCircle)` + width: 24px; + height: 24px; + + path { + fill: ${({ theme }) => theme.colors.danger600}; + } +`; + export { ConfirmDialog }; export type { ConfirmDialogProps }; diff --git a/packages/core/admin/admin/src/layouts/AuthenticatedLayout.tsx b/packages/core/admin/admin/src/layouts/AuthenticatedLayout.tsx index 7d3b62b6d4..4ee552fd8d 100644 --- a/packages/core/admin/admin/src/layouts/AuthenticatedLayout.tsx +++ b/packages/core/admin/admin/src/layouts/AuthenticatedLayout.tsx @@ -47,7 +47,7 @@ const AdminLayout = () => { fetch('https://api.github.com/repos/strapi/strapi/releases/latest') .then(async (res) => { if (!res.ok) { - throw new Error(); + return; } const response = (await res.json()) as { tag_name: string | null | undefined }; diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/CreatePage.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/CreatePage.tsx index 3768a76213..880cb537e9 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/CreatePage.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/CreatePage.tsx @@ -14,7 +14,7 @@ import { import { format } from 'date-fns'; import { Formik, Form, FormikHelpers } from 'formik'; import { useIntl } from 'react-intl'; -import { useNavigate, useMatch } from 'react-router-dom'; +import { useNavigate, useParams } from 'react-router-dom'; import { styled } from 'styled-components'; import * as yup from 'yup'; @@ -58,7 +58,7 @@ interface CreateRoleFormValues { * manage the state of the child is nonsensical. */ const CreatePage = () => { - const match = useMatch('/settings/roles/duplicate/:id'); + const { id } = useParams(); const { toggleNotification } = useNotification(); const { formatMessage } = useIntl(); const navigate = useNavigate(); @@ -69,9 +69,7 @@ const CreatePage = () => { _unstableFormatValidationErrors: formatValidationErrors, } = useAPIErrorHandler(); - const id = match?.params.id ?? null; - - const { isLoading: isLoadingPermissionsLayout, data: permissionsLayout } = + const { isLoading: isLoadingPermissionsLayout, currentData: permissionsLayout } = useGetRolePermissionLayoutQuery({ /** * Role here is a query param so if there's no role we pass an empty string @@ -84,7 +82,7 @@ const CreatePage = () => { * We need this so if we're cloning a role, we can fetch * the current permissions that role has. */ - const { data: rolePermissions, isLoading: isLoadingRole } = useGetRolePermissionsQuery( + const { currentData: rolePermissions, isLoading: isLoadingRole } = useGetRolePermissionsQuery( { id: id!, }, diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Users/EditPage.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Users/EditPage.tsx index 69c2424e57..7d936967da 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Users/EditPage.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Users/EditPage.tsx @@ -96,7 +96,7 @@ const EditPage = () => { React.useEffect(() => { if (error) { - // Redirect the use to the homepage if is not allowed to read + // Redirect the user to the homepage if is not allowed to read if (error.name === 'UnauthorizedError') { toggleNotification({ type: 'info', diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Users/ListPage.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Users/ListPage.tsx index 267d72f3d6..df0262c61e 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Users/ListPage.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Users/ListPage.tsx @@ -1,12 +1,13 @@ import * as React from 'react'; -import { Flex, Typography, Status, IconButton } from '@strapi/design-system'; +import { Flex, Typography, Status, IconButton, Dialog } from '@strapi/design-system'; import { Pencil, Trash } from '@strapi/icons'; import * as qs from 'qs'; import { MessageDescriptor, useIntl } from 'react-intl'; import { NavLink, useLocation, useNavigate } from 'react-router-dom'; import { SanitizedAdminUser } from '../../../../../../shared/contracts/shared'; +import { ConfirmDialog } from '../../../../components/ConfirmDialog'; import { Filters } from '../../../../components/Filters'; import { Layouts } from '../../../../components/Layouts/Layout'; import { Page } from '../../../../components/PageHelpers'; @@ -39,6 +40,8 @@ const ListPageCE = () => { const { toggleNotification } = useNotification(); const { formatMessage } = useIntl(); const { search } = useLocation(); + const [showDeleteConfirmation, setShowDeleteConfirmation] = React.useState(false); + const [idsToDelete, setIdsToDelete] = React.useState>([]); const { data, isError, isLoading } = useAdminUsers(qs.parse(search, { ignoreQueryPrefix: true })); const { pagination, users = [] } = data ?? {}; @@ -79,7 +82,6 @@ const ListPageCE = () => { }); } } catch (err) { - console.error(err); toggleNotification({ type: 'danger', message: formatMessage({ @@ -96,8 +98,15 @@ const ListPageCE = () => { } }; - const handleDeleteClick = (id: SanitizedAdminUser['id']) => async () => - await handleDeleteAll([id]); + const handleDeleteClick = (id: SanitizedAdminUser['id']) => async () => { + setIdsToDelete([id]); + setShowDeleteConfirmation(true); + }; + + const confirmDelete = async () => { + await handleDeleteAll(idsToDelete); + setShowDeleteConfirmation(false); + }; // block rendering until the EE component is fully loaded if (!CreateAction) { @@ -217,6 +226,9 @@ const ListPageCE = () => { {isModalOpened && } + + + ); }; diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.tsx index 408e116dca..ab79d48bde 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.tsx @@ -103,17 +103,12 @@ const ModalForm = ({ onToggle }: ModalFormProps) => { }); if ('data' in res) { + // NOTE: when enabling SSO, the user doesn't have to register and the token is undefined if (res.data.registrationToken) { setRegistrationToken(res.data.registrationToken); - - goNext(); - } else { - // This shouldn't happen, but just incase. - toggleNotification({ - type: 'danger', - message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occured' }), - }); } + + goNext(); } else { toggleNotification({ type: 'danger', diff --git a/packages/plugins/i18n/admin/src/components/Initializer.tsx b/packages/plugins/i18n/admin/src/components/Initializer.tsx deleted file mode 100644 index a24e645254..0000000000 --- a/packages/plugins/i18n/admin/src/components/Initializer.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from 'react'; - -import { pluginId } from '../pluginId'; - -type InitializerProps = { - setPlugin: (plugin: string) => void; -}; - -const Initializer = ({ setPlugin }: InitializerProps) => { - const setPluginRef = React.useRef(setPlugin); - - React.useEffect(() => { - setPluginRef.current(pluginId); - }, []); - - return null; -}; - -export { Initializer }; diff --git a/packages/plugins/i18n/admin/src/index.ts b/packages/plugins/i18n/admin/src/index.ts index 48e1d9c1b8..5d6ab2e181 100644 --- a/packages/plugins/i18n/admin/src/index.ts +++ b/packages/plugins/i18n/admin/src/index.ts @@ -12,7 +12,6 @@ import { PublishModalAdditionalInfo, UnpublishModalAdditionalInfo, } from './components/CMListViewModalsAdditionalInformation'; -import { Initializer } from './components/Initializer'; import { LocalePicker } from './components/LocalePicker'; import { PERMISSIONS } from './constants'; import { mutateEditViewHook } from './contentManagerHooks/editView'; @@ -41,8 +40,6 @@ export default { app.addRBACMiddleware([localeMiddleware]); app.registerPlugin({ id: pluginId, - initializer: Initializer, - isReady: false, name: pluginId, }); }, From bdee57a0571da734d9a1c4b5c35b3bbdb26fda8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-S=C3=A9bastien=20Herbaux?= Date: Mon, 24 Jun 2024 09:41:22 +0200 Subject: [PATCH 33/78] Handle non-localized content-types in discard-draft migration (#20422) --- .../database/5.0.0-discard-drafts.ts | 36 +++++++++++++++---- .../core/core/src/migrations/draft-publish.ts | 31 ++++++++++++---- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/packages/core/core/src/migrations/database/5.0.0-discard-drafts.ts b/packages/core/core/src/migrations/database/5.0.0-discard-drafts.ts index ff6c4e7019..36f8043dea 100644 --- a/packages/core/core/src/migrations/database/5.0.0-discard-drafts.ts +++ b/packages/core/core/src/migrations/database/5.0.0-discard-drafts.ts @@ -1,8 +1,10 @@ /* eslint-disable no-continue */ -import type { UID } from '@strapi/types'; +import type { UID, Modules } from '@strapi/types'; import type { Database, Migration } from '@strapi/database'; import { async, contentTypes } from '@strapi/utils'; +type DiscardDraftParams = + Modules.Documents.ServiceParams['discardDraft']; type DocumentVersion = { documentId: string; locale: string }; type Knex = Parameters[0]; @@ -16,21 +18,29 @@ export async function* getBatchToDiscard({ db, trx, uid, + isLocalized, batchSize = 1000, }: { db: Database; trx: Knex; uid: string; + isLocalized: boolean; batchSize?: number; }) { let offset = 0; let hasMore = true; + const fields = ['id', 'documentId']; + + if (isLocalized) { + fields.push('locale'); + } + while (hasMore) { // Look for the published entries to discard const batch: DocumentVersion[] = await db .queryBuilder(uid) - .select(['id', 'documentId', 'locale']) + .select(fields) .where({ publishedAt: { $ne: null } }) .limit(batchSize) .offset(offset) @@ -57,22 +67,36 @@ const migrateUp = async (trx: Knex, db: Database) => { const uid = meta.uid as UID.ContentType; const model = strapi.getModel(uid); + const hasDP = contentTypes.hasDraftAndPublish(model); + const isLocalized = strapi + .plugin('i18n') + .service('content-types') + .isLocalizedContentType(model); + if (!hasDP) { continue; } - const discardDraft = async (entry: DocumentVersion) => + const discardDraft = async (entry: DocumentVersion) => { + const params: DiscardDraftParams = { documentId: entry.documentId }; + + // Only add the locale param if the model is localized + if (isLocalized) { + params.locale = entry.locale; + } + strapi .documents(uid) - // Discard draft by referencing the documentId and locale - .discardDraft({ documentId: entry.documentId, locale: entry.locale }); + // Discard draft by referencing the documentId (and locale if the model is localized) + .discardDraft(params); + }; /** * Load a batch of entries (batched to prevent loading millions of rows at once ), * and discard them using the document service. */ - for await (const batch of getBatchToDiscard({ db, trx, uid: meta.uid })) { + for await (const batch of getBatchToDiscard({ db, trx, uid: meta.uid, isLocalized })) { await async.map(batch, discardDraft, { concurrency: 10 }); } } diff --git a/packages/core/core/src/migrations/draft-publish.ts b/packages/core/core/src/migrations/draft-publish.ts index d317b08609..66b20bfd12 100644 --- a/packages/core/core/src/migrations/draft-publish.ts +++ b/packages/core/core/src/migrations/draft-publish.ts @@ -1,8 +1,10 @@ import { contentTypes as contentTypesUtils, async } from '@strapi/utils'; -import { Schema } from '@strapi/types'; +import type { Modules, Schema } from '@strapi/types'; import { getBatchToDiscard } from './database/5.0.0-discard-drafts'; +type DiscardDraftParams = Modules.Documents.ServiceParams['discardDraft']; + interface Input { oldContentTypes: Record; contentTypes: Record; @@ -31,22 +33,37 @@ const enableDraftAndPublish = async ({ oldContentTypes, contentTypes }: Input) = const oldContentType = oldContentTypes[uid]; const contentType = contentTypes[uid]; + const isLocalized = strapi + .plugin('i18n') + .service('content-types') + .isLocalizedContentType(contentType); + // if d&p was enabled set publishedAt to eq createdAt if ( !contentTypesUtils.hasDraftAndPublish(oldContentType) && contentTypesUtils.hasDraftAndPublish(contentType) ) { - const discardDraft = async (entry: { documentId: string; locale: string }) => - strapi - .documents(uid as any) - // Discard draft by referencing the documentId and locale - .discardDraft({ documentId: entry.documentId, locale: entry.locale }); + const discardDraft = async (entry: { documentId: string; locale: string }) => { + const params: DiscardDraftParams = { documentId: entry.documentId }; + + // Only add the locale param if the old content-type is localized + if (isLocalized) { + params.locale = entry.locale; + } + + return ( + strapi + .documents(uid as any) + // Discard draft by referencing the documentId (and locale if the model is localized) + .discardDraft(params) + ); + }; /** * Load a batch of entries (batched to prevent loading millions of rows at once ), * and discard them using the document service. */ - for await (const batch of getBatchToDiscard({ db: strapi.db, trx, uid })) { + for await (const batch of getBatchToDiscard({ db: strapi.db, trx, uid, isLocalized })) { await async.map(batch, discardDraft, { concurrency: 10 }); } } From ccb2b38bb429263fcb4f23495b822252f00b51f9 Mon Sep 17 00:00:00 2001 From: Convly Date: Mon, 24 Jun 2024 10:22:34 +0200 Subject: [PATCH 34/78] v5.0.0-beta.15 --- .github/actions/check-pr-status/package.json | 2 +- examples/experimental-dev/package.json | 6 +- examples/getstarted/package.json | 20 +- examples/kitchensink-ts/package.json | 6 +- examples/kitchensink/package.json | 10 +- .../plugins/workspace-plugin/package.json | 2 +- lerna.json | 2 +- packages/admin-test-utils/package.json | 6 +- packages/cli/cloud/package.json | 8 +- packages/cli/create-strapi-app/package.json | 10 +- packages/cli/create-strapi/package.json | 4 +- packages/core/admin/package.json | 14 +- packages/core/content-manager/package.json | 8 +- packages/core/content-releases/package.json | 12 +- .../core/content-type-builder/package.json | 10 +- packages/core/core/package.json | 24 +- packages/core/data-transfer/package.json | 8 +- packages/core/database/package.json | 8 +- packages/core/email/package.json | 10 +- packages/core/permissions/package.json | 8 +- packages/core/review-workflows/package.json | 10 +- packages/core/strapi/package.json | 44 +- packages/core/types/package.json | 14 +- packages/core/upload/package.json | 10 +- packages/core/utils/package.json | 6 +- packages/generators/app/package.json | 2 +- packages/generators/generators/package.json | 10 +- packages/plugins/cloud/package.json | 8 +- packages/plugins/color-picker/package.json | 4 +- packages/plugins/documentation/package.json | 12 +- packages/plugins/graphql/package.json | 12 +- packages/plugins/i18n/package.json | 12 +- packages/plugins/sentry/package.json | 4 +- .../plugins/users-permissions/package.json | 6 +- .../providers/email-amazon-ses/package.json | 8 +- packages/providers/email-mailgun/package.json | 8 +- .../providers/email-nodemailer/package.json | 6 +- .../providers/email-sendgrid/package.json | 8 +- .../providers/email-sendmail/package.json | 8 +- packages/providers/upload-aws-s3/package.json | 6 +- .../providers/upload-cloudinary/package.json | 8 +- packages/providers/upload-local/package.json | 10 +- packages/utils/api-tests/package.json | 2 +- .../utils/eslint-config-custom/package.json | 2 +- packages/utils/logger/package.json | 6 +- packages/utils/tsconfig/package.json | 2 +- packages/utils/typescript/package.json | 2 +- packages/utils/upgrade/package.json | 6 +- scripts/front/package.json | 2 +- yarn.lock | 386 +++++++++--------- 50 files changed, 401 insertions(+), 401 deletions(-) diff --git a/.github/actions/check-pr-status/package.json b/.github/actions/check-pr-status/package.json index e28302d6e2..fd3d613e6e 100644 --- a/.github/actions/check-pr-status/package.json +++ b/.github/actions/check-pr-status/package.json @@ -1,6 +1,6 @@ { "name": "check-pr-status", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "license": "MIT", "main": "dist/index.js", diff --git a/examples/experimental-dev/package.json b/examples/experimental-dev/package.json index 231931e939..e810f6c798 100644 --- a/examples/experimental-dev/package.json +++ b/examples/experimental-dev/package.json @@ -1,6 +1,6 @@ { "name": "experimental-dev", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "description": "A Strapi application", "license": "MIT", @@ -14,8 +14,8 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/plugin-users-permissions": "5.0.0-beta.14", - "@strapi/strapi": "5.0.0-beta.14", + "@strapi/plugin-users-permissions": "5.0.0-beta.15", + "@strapi/strapi": "5.0.0-beta.15", "better-sqlite3": "9.4.3", "react": "rc", "react-dom": "rc", diff --git a/examples/getstarted/package.json b/examples/getstarted/package.json index 5cfce218f4..e1eec692de 100644 --- a/examples/getstarted/package.json +++ b/examples/getstarted/package.json @@ -1,6 +1,6 @@ { "name": "getstarted", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "description": "A Strapi application.", "license": "SEE LICENSE IN LICENSE", @@ -14,15 +14,15 @@ }, "dependencies": { "@strapi/icons": "2.0.0-beta.6", - "@strapi/plugin-color-picker": "5.0.0-beta.14", - "@strapi/plugin-documentation": "5.0.0-beta.14", - "@strapi/plugin-graphql": "5.0.0-beta.14", - "@strapi/plugin-sentry": "5.0.0-beta.14", - "@strapi/plugin-users-permissions": "5.0.0-beta.14", - "@strapi/provider-email-mailgun": "5.0.0-beta.14", - "@strapi/provider-upload-aws-s3": "5.0.0-beta.14", - "@strapi/provider-upload-cloudinary": "5.0.0-beta.14", - "@strapi/strapi": "5.0.0-beta.14", + "@strapi/plugin-color-picker": "5.0.0-beta.15", + "@strapi/plugin-documentation": "5.0.0-beta.15", + "@strapi/plugin-graphql": "5.0.0-beta.15", + "@strapi/plugin-sentry": "5.0.0-beta.15", + "@strapi/plugin-users-permissions": "5.0.0-beta.15", + "@strapi/provider-email-mailgun": "5.0.0-beta.15", + "@strapi/provider-upload-aws-s3": "5.0.0-beta.15", + "@strapi/provider-upload-cloudinary": "5.0.0-beta.15", + "@strapi/strapi": "5.0.0-beta.15", "better-sqlite3": "9.4.3", "lodash": "4.17.21", "mysql2": "3.9.4", diff --git a/examples/kitchensink-ts/package.json b/examples/kitchensink-ts/package.json index 3ae7cedf1d..f1439f2bec 100644 --- a/examples/kitchensink-ts/package.json +++ b/examples/kitchensink-ts/package.json @@ -1,6 +1,6 @@ { "name": "kitchensink-ts", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "description": "A Strapi application", "license": "MIT", @@ -14,8 +14,8 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/plugin-users-permissions": "5.0.0-beta.14", - "@strapi/strapi": "5.0.0-beta.14", + "@strapi/plugin-users-permissions": "5.0.0-beta.15", + "@strapi/strapi": "5.0.0-beta.15", "better-sqlite3": "9.4.3", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/examples/kitchensink/package.json b/examples/kitchensink/package.json index 86fc694065..44469c7823 100644 --- a/examples/kitchensink/package.json +++ b/examples/kitchensink/package.json @@ -1,6 +1,6 @@ { "name": "kitchensink", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "description": "A Strapi application.", "license": "SEE LICENSE IN LICENSE", @@ -13,10 +13,10 @@ "strapi": "strapi" }, "dependencies": { - "@strapi/provider-email-mailgun": "5.0.0-beta.14", - "@strapi/provider-upload-aws-s3": "5.0.0-beta.14", - "@strapi/provider-upload-cloudinary": "5.0.0-beta.14", - "@strapi/strapi": "5.0.0-beta.14", + "@strapi/provider-email-mailgun": "5.0.0-beta.15", + "@strapi/provider-upload-aws-s3": "5.0.0-beta.15", + "@strapi/provider-upload-cloudinary": "5.0.0-beta.15", + "@strapi/strapi": "5.0.0-beta.15", "better-sqlite3": "9.4.3", "lodash": "4.17.21", "mysql2": "3.9.4", diff --git a/examples/plugins/workspace-plugin/package.json b/examples/plugins/workspace-plugin/package.json index 5b520b5b4b..a4c1406c64 100644 --- a/examples/plugins/workspace-plugin/package.json +++ b/examples/plugins/workspace-plugin/package.json @@ -1,6 +1,6 @@ { "name": "strapi-plugin-workspace-plugin", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "description": "This is the description of my plugin.", "exports": { diff --git a/lerna.json b/lerna.json index 3b50cbf442..47333fe59a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,4 +1,4 @@ { - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "npmClient": "yarn" } diff --git a/packages/admin-test-utils/package.json b/packages/admin-test-utils/package.json index 21a2f824b4..a9fd925f71 100644 --- a/packages/admin-test-utils/package.json +++ b/packages/admin-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/admin-test-utils", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "description": "Test utilities for the Strapi administration panel", "license": "MIT", @@ -81,9 +81,9 @@ "@reduxjs/toolkit": "1.9.7", "@strapi/pack-up": "5.0.0", "@testing-library/jest-dom": "6.4.5", - "eslint-config-custom": "5.0.0-beta.14", + "eslint-config-custom": "5.0.0-beta.15", "jest-environment-jsdom": "29.6.1", - "tsconfig": "5.0.0-beta.14" + "tsconfig": "5.0.0-beta.15" }, "peerDependencies": { "@reduxjs/toolkit": "^1.9.7", diff --git a/packages/cli/cloud/package.json b/packages/cli/cloud/package.json index 1f4fd94e07..f93346b526 100644 --- a/packages/cli/cloud/package.json +++ b/packages/cli/cloud/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/cloud-cli", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Commands to interact with the Strapi Cloud", "keywords": [ "strapi", @@ -44,7 +44,7 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "axios": "1.6.0", "chalk": "4.1.2", "cli-progress": "3.12.0", @@ -69,8 +69,8 @@ "@types/cli-progress": "3.11.5", "@types/eventsource": "1.1.15", "@types/lodash": "^4.14.191", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/cli/create-strapi-app/package.json b/packages/cli/create-strapi-app/package.json index dac9557a65..a8f9f69219 100644 --- a/packages/cli/create-strapi-app/package.json +++ b/packages/cli/create-strapi-app/package.json @@ -1,6 +1,6 @@ { "name": "create-strapi-app", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Generate a new Strapi application.", "keywords": [ "create-strapi-app", @@ -43,8 +43,8 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/cloud-cli": "5.0.0-beta.14", - "@strapi/generate-new": "5.0.0-beta.14", + "@strapi/cloud-cli": "5.0.0-beta.15", + "@strapi/generate-new": "5.0.0-beta.15", "chalk": "4.1.2", "commander": "8.3.0", "inquirer": "8.2.5" @@ -52,8 +52,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/inquirer": "8.2.5", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/cli/create-strapi/package.json b/packages/cli/create-strapi/package.json index 7259f2c9b1..9f5b688b16 100644 --- a/packages/cli/create-strapi/package.json +++ b/packages/cli/create-strapi/package.json @@ -1,6 +1,6 @@ { "name": "create-strapi", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Generate a new Strapi application.", "keywords": [ "create-strapi", @@ -36,7 +36,7 @@ "bin/" ], "dependencies": { - "create-strapi-app": "5.0.0-beta.14" + "create-strapi-app": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/admin/package.json b/packages/core/admin/package.json index 1b74c036bd..e7e5df75d0 100644 --- a/packages/core/admin/package.json +++ b/packages/core/admin/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/admin", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Strapi Admin", "repository": { "type": "git", @@ -81,10 +81,10 @@ "@reduxjs/toolkit": "1.9.7", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/permissions": "5.0.0-beta.14", - "@strapi/types": "5.0.0-beta.14", - "@strapi/typescript-utils": "5.0.0-beta.14", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/permissions": "5.0.0-beta.15", + "@strapi/types": "5.0.0-beta.15", + "@strapi/typescript-utils": "5.0.0-beta.15", + "@strapi/utils": "5.0.0-beta.15", "@testing-library/dom": "10.1.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", @@ -139,8 +139,8 @@ "zod": "^3.22.4" }, "devDependencies": { - "@strapi/admin-test-utils": "5.0.0-beta.14", - "@strapi/data-transfer": "5.0.0-beta.14", + "@strapi/admin-test-utils": "5.0.0-beta.15", + "@strapi/data-transfer": "5.0.0-beta.15", "@strapi/pack-up": "5.0.0", "@types/codemirror5": "npm:@types/codemirror@^5.60.15", "@types/fs-extra": "11.0.4", diff --git a/packages/core/content-manager/package.json b/packages/core/content-manager/package.json index b6435fddaf..56bcacd8fd 100644 --- a/packages/core/content-manager/package.json +++ b/packages/core/content-manager/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/content-manager", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "A powerful UI to easily manage your data.", "repository": { "type": "git", @@ -62,8 +62,8 @@ "@sindresorhus/slugify": "1.1.0", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/types": "5.0.0-beta.14", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.15", + "@strapi/utils": "5.0.0-beta.15", "codemirror5": "npm:codemirror@^5.65.11", "date-fns": "2.30.0", "fractional-indexing": "3.2.0", @@ -97,7 +97,7 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.14", + "@strapi/admin": "5.0.0-beta.15", "@strapi/database": "workspace:*", "@strapi/pack-up": "5.0.0", "@testing-library/react": "15.0.7", diff --git a/packages/core/content-releases/package.json b/packages/core/content-releases/package.json index cae3eee904..3d0f39e2bb 100644 --- a/packages/core/content-releases/package.json +++ b/packages/core/content-releases/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/content-releases", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Strapi plugin for organizing and releasing content", "repository": { "type": "git", @@ -55,11 +55,11 @@ }, "dependencies": { "@reduxjs/toolkit": "1.9.7", - "@strapi/database": "5.0.0-beta.14", + "@strapi/database": "5.0.0-beta.15", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", "@strapi/types": "workspace:*", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "date-fns": "2.30.0", "date-fns-tz": "2.0.1", "formik": "2.4.5", @@ -70,9 +70,9 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.14", - "@strapi/admin-test-utils": "5.0.0-beta.14", - "@strapi/content-manager": "5.0.0-beta.14", + "@strapi/admin": "5.0.0-beta.15", + "@strapi/admin-test-utils": "5.0.0-beta.15", + "@strapi/content-manager": "5.0.0-beta.15", "@strapi/pack-up": "5.0.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", diff --git a/packages/core/content-type-builder/package.json b/packages/core/content-type-builder/package.json index 3c9d0251af..9fe8793f10 100644 --- a/packages/core/content-type-builder/package.json +++ b/packages/core/content-type-builder/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/content-type-builder", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Create and manage content types", "repository": { "type": "git", @@ -59,9 +59,9 @@ "@reduxjs/toolkit": "1.9.7", "@sindresorhus/slugify": "1.1.0", "@strapi/design-system": "2.0.0-beta.6", - "@strapi/generators": "5.0.0-beta.14", + "@strapi/generators": "5.0.0-beta.15", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "date-fns": "2.30.0", "fs-extra": "11.2.0", "immer": "9.0.21", @@ -73,9 +73,9 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.14", + "@strapi/admin": "5.0.0-beta.15", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.15", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "@types/fs-extra": "11.0.4", diff --git a/packages/core/core/package.json b/packages/core/core/package.json index 058f2d1a0e..e2a39f1a84 100644 --- a/packages/core/core/package.json +++ b/packages/core/core/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/core", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Core of Strapi", "homepage": "https://strapi.io", "bugs": { @@ -55,16 +55,16 @@ "@koa/cors": "5.0.0", "@koa/router": "12.0.1", "@paralleldrive/cuid2": "2.2.2", - "@strapi/admin": "5.0.0-beta.14", - "@strapi/database": "5.0.0-beta.14", - "@strapi/generate-new": "5.0.0-beta.14", - "@strapi/generators": "5.0.0-beta.14", - "@strapi/logger": "5.0.0-beta.14", + "@strapi/admin": "5.0.0-beta.15", + "@strapi/database": "5.0.0-beta.15", + "@strapi/generate-new": "5.0.0-beta.15", + "@strapi/generators": "5.0.0-beta.15", + "@strapi/logger": "5.0.0-beta.15", "@strapi/pack-up": "5.0.0", - "@strapi/permissions": "5.0.0-beta.14", - "@strapi/types": "5.0.0-beta.14", - "@strapi/typescript-utils": "5.0.0-beta.14", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/permissions": "5.0.0-beta.15", + "@strapi/types": "5.0.0-beta.15", + "@strapi/typescript-utils": "5.0.0-beta.15", + "@strapi/utils": "5.0.0-beta.15", "bcryptjs": "2.4.3", "boxen": "5.1.2", "chalk": "4.1.2", @@ -126,9 +126,9 @@ "@types/node": "18.19.24", "@types/node-schedule": "2.1.0", "@types/statuses": "2.0.1", - "eslint-config-custom": "5.0.0-beta.14", + "eslint-config-custom": "5.0.0-beta.15", "supertest": "6.3.3", - "tsconfig": "5.0.0-beta.14" + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/data-transfer/package.json b/packages/core/data-transfer/package.json index 0de820cbd2..4d8a91b425 100644 --- a/packages/core/data-transfer/package.json +++ b/packages/core/data-transfer/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/data-transfer", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Data transfer capabilities for Strapi", "keywords": [ "strapi", @@ -40,9 +40,9 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/logger": "5.0.0-beta.14", - "@strapi/types": "5.0.0-beta.14", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/logger": "5.0.0-beta.15", + "@strapi/types": "5.0.0-beta.15", + "@strapi/utils": "5.0.0-beta.15", "chalk": "4.1.2", "cli-table3": "0.6.2", "commander": "8.3.0", diff --git a/packages/core/database/package.json b/packages/core/database/package.json index cbb9650f6c..aba48f4569 100644 --- a/packages/core/database/package.json +++ b/packages/core/database/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/database", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Strapi's database layer", "homepage": "https://strapi.io", "bugs": { @@ -40,7 +40,7 @@ }, "dependencies": { "@paralleldrive/cuid2": "2.2.2", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "ajv": "8.16.0", "date-fns": "2.30.0", "debug": "4.3.4", @@ -53,8 +53,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/fs-extra": "11.0.4", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/email/package.json b/packages/core/email/package.json index 82b6550c44..712be789da 100644 --- a/packages/core/email/package.json +++ b/packages/core/email/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/email", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Easily configure your Strapi application to send emails.", "repository": { "type": "git", @@ -54,17 +54,17 @@ "dependencies": { "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/provider-email-sendmail": "5.0.0-beta.14", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/provider-email-sendmail": "5.0.0-beta.15", + "@strapi/utils": "5.0.0-beta.15", "lodash": "4.17.21", "react-intl": "6.6.2", "react-query": "3.39.3", "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.14", + "@strapi/admin": "5.0.0-beta.15", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.15", "@testing-library/react": "15.0.7", "@types/koa": "2.13.4", "@types/lodash": "^4.14.191", diff --git a/packages/core/permissions/package.json b/packages/core/permissions/package.json index 2ca8f9a83c..d09d2a8f0a 100644 --- a/packages/core/permissions/package.json +++ b/packages/core/permissions/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/permissions", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Strapi's permission layer.", "repository": { "type": "git", @@ -37,15 +37,15 @@ }, "dependencies": { "@casl/ability": "6.5.0", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "lodash": "4.17.21", "qs": "6.11.1", "sift": "16.0.1" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/core/review-workflows/package.json b/packages/core/review-workflows/package.json index 888d285a63..0d45019966 100644 --- a/packages/core/review-workflows/package.json +++ b/packages/core/review-workflows/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/review-workflows", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Review workflows for your content", "repository": { "type": "git", @@ -65,11 +65,11 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.14", - "@strapi/content-manager": "5.0.0-beta.14", + "@strapi/admin": "5.0.0-beta.15", + "@strapi/content-manager": "5.0.0-beta.15", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.14", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.15", + "@strapi/utils": "5.0.0-beta.15", "@testing-library/react": "15.0.7", "msw": "1.3.0", "react": "18.3.1", diff --git a/packages/core/strapi/package.json b/packages/core/strapi/package.json index fc35ac6cbe..28b428b88b 100644 --- a/packages/core/strapi/package.json +++ b/packages/core/strapi/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/strapi", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite", "keywords": [ "strapi", @@ -109,26 +109,26 @@ }, "dependencies": { "@pmmmwh/react-refresh-webpack-plugin": "0.5.11", - "@strapi/admin": "5.0.0-beta.14", - "@strapi/cloud-cli": "5.0.0-beta.14", - "@strapi/content-manager": "5.0.0-beta.14", - "@strapi/content-releases": "5.0.0-beta.14", - "@strapi/content-type-builder": "5.0.0-beta.14", - "@strapi/core": "5.0.0-beta.14", - "@strapi/data-transfer": "5.0.0-beta.14", - "@strapi/database": "5.0.0-beta.14", - "@strapi/email": "5.0.0-beta.14", - "@strapi/generate-new": "5.0.0-beta.14", - "@strapi/generators": "5.0.0-beta.14", - "@strapi/i18n": "5.0.0-beta.14", - "@strapi/logger": "5.0.0-beta.14", + "@strapi/admin": "5.0.0-beta.15", + "@strapi/cloud-cli": "5.0.0-beta.15", + "@strapi/content-manager": "5.0.0-beta.15", + "@strapi/content-releases": "5.0.0-beta.15", + "@strapi/content-type-builder": "5.0.0-beta.15", + "@strapi/core": "5.0.0-beta.15", + "@strapi/data-transfer": "5.0.0-beta.15", + "@strapi/database": "5.0.0-beta.15", + "@strapi/email": "5.0.0-beta.15", + "@strapi/generate-new": "5.0.0-beta.15", + "@strapi/generators": "5.0.0-beta.15", + "@strapi/i18n": "5.0.0-beta.15", + "@strapi/logger": "5.0.0-beta.15", "@strapi/pack-up": "5.0.0", - "@strapi/permissions": "5.0.0-beta.14", - "@strapi/review-workflows": "5.0.0-beta.14", - "@strapi/types": "5.0.0-beta.14", - "@strapi/typescript-utils": "5.0.0-beta.14", - "@strapi/upload": "5.0.0-beta.14", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/permissions": "5.0.0-beta.15", + "@strapi/review-workflows": "5.0.0-beta.15", + "@strapi/types": "5.0.0-beta.15", + "@strapi/typescript-utils": "5.0.0-beta.15", + "@strapi/upload": "5.0.0-beta.15", + "@strapi/utils": "5.0.0-beta.15", "@types/nodemon": "1.19.6", "@vitejs/plugin-react-swc": "3.6.0", "boxen": "5.1.2", @@ -183,10 +183,10 @@ "@types/node": "18.19.24", "@types/webpack-bundle-analyzer": "4.7.0", "@types/webpack-hot-middleware": "2.25.9", - "eslint-config-custom": "5.0.0-beta.14", + "eslint-config-custom": "5.0.0-beta.15", "react": "18.3.1", "react-dom": "18.3.1", - "tsconfig": "5.0.0-beta.14" + "tsconfig": "5.0.0-beta.15" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0", diff --git a/packages/core/types/package.json b/packages/core/types/package.json index 3bb2e00e9a..0bf881ec61 100644 --- a/packages/core/types/package.json +++ b/packages/core/types/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/types", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Shared typescript types for Strapi internal use", "keywords": [ "strapi" @@ -46,10 +46,10 @@ "@casl/ability": "6.5.0", "@koa/cors": "5.0.0", "@koa/router": "12.0.1", - "@strapi/database": "5.0.0-beta.14", - "@strapi/logger": "5.0.0-beta.14", - "@strapi/permissions": "5.0.0-beta.14", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/database": "5.0.0-beta.15", + "@strapi/logger": "5.0.0-beta.15", + "@strapi/permissions": "5.0.0-beta.15", + "@strapi/utils": "5.0.0-beta.15", "commander": "8.3.0", "koa": "2.15.2", "node-schedule": "2.1.0", @@ -64,9 +64,9 @@ "@types/koa": "2.13.4", "@types/koa__router": "12.0.0", "@types/node-schedule": "2.1.0", - "eslint-config-custom": "5.0.0-beta.14", + "eslint-config-custom": "5.0.0-beta.15", "lodash": "4.17.21", - "tsconfig": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.15", "typescript": "5.3.2", "undici": "6.18.2" }, diff --git a/packages/core/upload/package.json b/packages/core/upload/package.json index 2acb5c0bc7..28e48bc20d 100644 --- a/packages/core/upload/package.json +++ b/packages/core/upload/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/upload", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Makes it easy to upload images and files to your Strapi Application.", "license": "SEE LICENSE IN LICENSE", "author": { @@ -47,8 +47,8 @@ "dependencies": { "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/provider-upload-local": "5.0.0-beta.14", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/provider-upload-local": "5.0.0-beta.15", + "@strapi/utils": "5.0.0-beta.15", "byte-size": "8.1.1", "cropperjs": "1.6.1", "date-fns": "2.30.0", @@ -70,9 +70,9 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.14", + "@strapi/admin": "5.0.0-beta.15", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.15", "@testing-library/dom": "10.1.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", diff --git a/packages/core/utils/package.json b/packages/core/utils/package.json index 804ea490c6..9ad7cfb53f 100644 --- a/packages/core/utils/package.json +++ b/packages/core/utils/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/utils", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Shared utilities for the Strapi packages", "keywords": [ "strapi", @@ -60,10 +60,10 @@ "@types/http-errors": "2.0.4", "@types/koa": "2.13.4", "@types/node": "18.19.24", - "eslint-config-custom": "5.0.0-beta.14", + "eslint-config-custom": "5.0.0-beta.15", "koa": "2.15.2", "koa-body": "6.0.1", - "tsconfig": "5.0.0-beta.14" + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/generators/app/package.json b/packages/generators/app/package.json index 3051245521..05808e6f43 100644 --- a/packages/generators/app/package.json +++ b/packages/generators/app/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/generate-new", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Generate a new Strapi application.", "keywords": [ "generate", diff --git a/packages/generators/generators/package.json b/packages/generators/generators/package.json index c5ff31bf71..9a6b8f71a9 100644 --- a/packages/generators/generators/package.json +++ b/packages/generators/generators/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/generators", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Interactive API generator.", "keywords": [ "strapi", @@ -46,8 +46,8 @@ }, "dependencies": { "@sindresorhus/slugify": "1.1.0", - "@strapi/typescript-utils": "5.0.0-beta.14", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/typescript-utils": "5.0.0-beta.15", + "@strapi/utils": "5.0.0-beta.15", "chalk": "4.1.2", "copyfiles": "2.4.1", "fs-extra": "11.2.0", @@ -58,8 +58,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/fs-extra": "11.0.4", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/plugins/cloud/package.json b/packages/plugins/cloud/package.json index c8d4e46913..3823377473 100644 --- a/packages/plugins/cloud/package.json +++ b/packages/plugins/cloud/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-cloud", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Instructions to deploy your local project to Strapi Cloud", "license": "MIT", "author": { @@ -42,13 +42,13 @@ }, "devDependencies": { "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.14", - "eslint-config-custom": "5.0.0-beta.14", + "@strapi/strapi": "5.0.0-beta.15", + "eslint-config-custom": "5.0.0-beta.15", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.22.3", "styled-components": "6.1.8", - "tsconfig": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.15", "typescript": "5.2.2" }, "peerDependencies": { diff --git a/packages/plugins/color-picker/package.json b/packages/plugins/color-picker/package.json index 32679a81f9..0685eb15da 100644 --- a/packages/plugins/color-picker/package.json +++ b/packages/plugins/color-picker/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-color-picker", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Strapi maintained Custom Fields", "repository": { "type": "git", @@ -60,7 +60,7 @@ }, "devDependencies": { "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.14", + "@strapi/strapi": "5.0.0-beta.15", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "react": "18.3.1", diff --git a/packages/plugins/documentation/package.json b/packages/plugins/documentation/package.json index 842d92c1eb..359dbe5954 100644 --- a/packages/plugins/documentation/package.json +++ b/packages/plugins/documentation/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-documentation", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Create an OpenAPI Document and visualize your API with SWAGGER UI.", "repository": { "type": "git", @@ -55,10 +55,10 @@ }, "dependencies": { "@reduxjs/toolkit": "1.9.7", - "@strapi/admin": "5.0.0-beta.14", + "@strapi/admin": "5.0.0-beta.15", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "bcryptjs": "2.4.3", "cheerio": "^1.0.0-rc.12", "formik": "2.4.5", @@ -74,11 +74,11 @@ }, "devDependencies": { "@apidevtools/swagger-parser": "^10.1.0", - "@strapi/admin-test-utils": "5.0.0-beta.14", + "@strapi/admin-test-utils": "5.0.0-beta.15", "@strapi/pack-up": "5.0.0", "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.14", - "@strapi/types": "5.0.0-beta.14", + "@strapi/strapi": "5.0.0-beta.15", + "@strapi/types": "5.0.0-beta.15", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "@types/fs-extra": "11.0.4", diff --git a/packages/plugins/graphql/package.json b/packages/plugins/graphql/package.json index 91077b8b73..6a4811338a 100644 --- a/packages/plugins/graphql/package.json +++ b/packages/plugins/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-graphql", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Adds GraphQL endpoint with default API methods.", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@koa/cors": "5.0.0", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "graphql": "^16.8.1", "graphql-depth-limit": "^1.1.0", "graphql-playground-middleware-koa": "^1.6.21", @@ -68,19 +68,19 @@ }, "devDependencies": { "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.14", - "@strapi/types": "5.0.0-beta.14", + "@strapi/strapi": "5.0.0-beta.15", + "@strapi/types": "5.0.0-beta.15", "@types/graphql-depth-limit": "1.1.5", "@types/koa-bodyparser": "4.3.12", "@types/koa__cors": "5.0.0", "cross-env": "^7.0.3", - "eslint-config-custom": "5.0.0-beta.14", + "eslint-config-custom": "5.0.0-beta.15", "koa": "2.15.2", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.22.3", "styled-components": "6.1.8", - "tsconfig": "5.0.0-beta.14", + "tsconfig": "5.0.0-beta.15", "typescript": "5.3.2" }, "peerDependencies": { diff --git a/packages/plugins/i18n/package.json b/packages/plugins/i18n/package.json index 9b2408e59b..19a0dc02cb 100644 --- a/packages/plugins/i18n/package.json +++ b/packages/plugins/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/i18n", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Create read and update content in different languages, both from the Admin Panel and from the API", "repository": { "type": "git", @@ -55,7 +55,7 @@ "@reduxjs/toolkit": "1.9.7", "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "lodash": "4.17.21", "qs": "6.11.1", "react-intl": "6.6.2", @@ -63,11 +63,11 @@ "yup": "0.32.9" }, "devDependencies": { - "@strapi/admin": "5.0.0-beta.14", - "@strapi/admin-test-utils": "5.0.0-beta.14", - "@strapi/content-manager": "5.0.0-beta.14", + "@strapi/admin": "5.0.0-beta.15", + "@strapi/admin-test-utils": "5.0.0-beta.15", + "@strapi/content-manager": "5.0.0-beta.15", "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.15", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", "msw": "1.3.0", diff --git a/packages/plugins/sentry/package.json b/packages/plugins/sentry/package.json index 9ec63c6897..cbd2b62c8b 100644 --- a/packages/plugins/sentry/package.json +++ b/packages/plugins/sentry/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-sentry", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Send Strapi error events to Sentry", "repository": { "type": "git", @@ -57,7 +57,7 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@strapi/sdk-plugin": "^5.0.0", - "@strapi/strapi": "5.0.0-beta.14", + "@strapi/strapi": "5.0.0-beta.15", "react": "18.3.1", "react-dom": "18.3.1", "react-router-dom": "6.22.3", diff --git a/packages/plugins/users-permissions/package.json b/packages/plugins/users-permissions/package.json index 4b9cb75108..8dd912332f 100644 --- a/packages/plugins/users-permissions/package.json +++ b/packages/plugins/users-permissions/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/plugin-users-permissions", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Protect your API with a full-authentication process based on JWT", "repository": { "type": "git", @@ -48,7 +48,7 @@ "dependencies": { "@strapi/design-system": "2.0.0-beta.6", "@strapi/icons": "2.0.0-beta.6", - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "bcryptjs": "2.4.3", "formik": "2.4.5", "grant-koa": "5.4.8", @@ -68,7 +68,7 @@ }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "@strapi/strapi": "5.0.0-beta.14", + "@strapi/strapi": "5.0.0-beta.15", "@testing-library/dom": "10.1.0", "@testing-library/react": "15.0.7", "@testing-library/user-event": "14.5.2", diff --git a/packages/providers/email-amazon-ses/package.json b/packages/providers/email-amazon-ses/package.json index edc2c5a74f..0023531cd4 100644 --- a/packages/providers/email-amazon-ses/package.json +++ b/packages/providers/email-amazon-ses/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-amazon-ses", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Amazon SES provider for strapi email", "keywords": [ "email", @@ -42,13 +42,13 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "node-ses": "^3.0.3" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-mailgun/package.json b/packages/providers/email-mailgun/package.json index 3652d33a7c..964d172adc 100644 --- a/packages/providers/email-mailgun/package.json +++ b/packages/providers/email-mailgun/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-mailgun", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Mailgun provider for strapi email plugin", "keywords": [ "email", @@ -44,14 +44,14 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "form-data": "^4.0.0", "mailgun.js": "10.2.1" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-nodemailer/package.json b/packages/providers/email-nodemailer/package.json index bc7b0eac99..4b68abaf34 100644 --- a/packages/providers/email-nodemailer/package.json +++ b/packages/providers/email-nodemailer/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-nodemailer", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Nodemailer provider for Strapi 3", "keywords": [ "strapi", @@ -61,8 +61,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/nodemailer": "6.4.7", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-sendgrid/package.json b/packages/providers/email-sendgrid/package.json index 1ffde8fc34..1c8b73abc1 100644 --- a/packages/providers/email-sendgrid/package.json +++ b/packages/providers/email-sendgrid/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-sendgrid", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Sendgrid provider for strapi email", "keywords": [ "email", @@ -43,12 +43,12 @@ }, "dependencies": { "@sendgrid/mail": "7.7.0", - "@strapi/utils": "5.0.0-beta.14" + "@strapi/utils": "5.0.0-beta.15" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/email-sendmail/package.json b/packages/providers/email-sendmail/package.json index fbe73109a4..b0fe382f76 100644 --- a/packages/providers/email-sendmail/package.json +++ b/packages/providers/email-sendmail/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-email-sendmail", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Sendmail provider for strapi email", "keywords": [ "email", @@ -41,14 +41,14 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "sendmail": "^1.6.1" }, "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/sendmail": "1.4.4", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/upload-aws-s3/package.json b/packages/providers/upload-aws-s3/package.json index 7ed134f77c..636dd36bfb 100644 --- a/packages/providers/upload-aws-s3/package.json +++ b/packages/providers/upload-aws-s3/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-aws-s3", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "AWS S3 provider for strapi upload", "keywords": [ "upload", @@ -54,8 +54,8 @@ "devDependencies": { "@strapi/pack-up": "5.0.0", "@types/jest": "29.5.2", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/upload-cloudinary/package.json b/packages/providers/upload-cloudinary/package.json index 7ee5c93064..900acee4c1 100644 --- a/packages/providers/upload-cloudinary/package.json +++ b/packages/providers/upload-cloudinary/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-cloudinary", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Cloudinary provider for strapi upload", "keywords": [ "upload", @@ -42,14 +42,14 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "cloudinary": "^1.41.0", "into-stream": "^5.1.0" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/providers/upload-local/package.json b/packages/providers/upload-local/package.json index 1879c17254..9597f9fef4 100644 --- a/packages/providers/upload-local/package.json +++ b/packages/providers/upload-local/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/provider-upload-local", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Local provider for strapi upload", "keywords": [ "upload", @@ -43,17 +43,17 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "fs-extra": "11.2.0" }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.15", "@types/fs-extra": "11.0.4", "@types/jest": "29.5.2", - "eslint-config-custom": "5.0.0-beta.14", + "eslint-config-custom": "5.0.0-beta.15", "memfs": "4.6.0", - "tsconfig": "5.0.0-beta.14" + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/utils/api-tests/package.json b/packages/utils/api-tests/package.json index aa409814bd..f0cd260df2 100644 --- a/packages/utils/api-tests/package.json +++ b/packages/utils/api-tests/package.json @@ -1,6 +1,6 @@ { "name": "api-tests", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "dependencies": { "dotenv": "16.4.5", diff --git a/packages/utils/eslint-config-custom/package.json b/packages/utils/eslint-config-custom/package.json index 308188a1f3..739d47fb4a 100644 --- a/packages/utils/eslint-config-custom/package.json +++ b/packages/utils/eslint-config-custom/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-custom", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "main": "index.js" } diff --git a/packages/utils/logger/package.json b/packages/utils/logger/package.json index a2e92e6aab..cc356c9b16 100644 --- a/packages/utils/logger/package.json +++ b/packages/utils/logger/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/logger", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Strapi's logger", "homepage": "https://strapi.io", "bugs": { @@ -43,8 +43,8 @@ }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "eslint-config-custom": "5.0.0-beta.14", - "tsconfig": "5.0.0-beta.14" + "eslint-config-custom": "5.0.0-beta.15", + "tsconfig": "5.0.0-beta.15" }, "engines": { "node": ">=18.0.0 <=20.x.x", diff --git a/packages/utils/tsconfig/package.json b/packages/utils/tsconfig/package.json index 67300dcfc3..3ef22059dc 100644 --- a/packages/utils/tsconfig/package.json +++ b/packages/utils/tsconfig/package.json @@ -1,6 +1,6 @@ { "name": "tsconfig", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "devDependencies": { "@tsconfig/node18": "18.2.2" diff --git a/packages/utils/typescript/package.json b/packages/utils/typescript/package.json index 9eb4b3af0a..82138573a4 100644 --- a/packages/utils/typescript/package.json +++ b/packages/utils/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/typescript-utils", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "Typescript support for Strapi", "keywords": [ "strapi", diff --git a/packages/utils/upgrade/package.json b/packages/utils/upgrade/package.json index 628350ef48..132e0bab02 100644 --- a/packages/utils/upgrade/package.json +++ b/packages/utils/upgrade/package.json @@ -1,6 +1,6 @@ { "name": "@strapi/upgrade", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "description": "CLI to upgrade Strapi applications effortless", "keywords": [ "strapi", @@ -59,7 +59,7 @@ "watch": "pack-up watch" }, "dependencies": { - "@strapi/utils": "5.0.0-beta.14", + "@strapi/utils": "5.0.0-beta.15", "chalk": "4.1.2", "cli-table3": "0.6.2", "commander": "8.3.0", @@ -76,7 +76,7 @@ }, "devDependencies": { "@strapi/pack-up": "5.0.0", - "@strapi/types": "5.0.0-beta.14", + "@strapi/types": "5.0.0-beta.15", "@types/fs-extra": "11.0.4", "@types/jscodeshift": "0.11.10", "eslint-config-custom": "workspace:*", diff --git a/scripts/front/package.json b/scripts/front/package.json index 026595481a..3b55c983e8 100644 --- a/scripts/front/package.json +++ b/scripts/front/package.json @@ -1,6 +1,6 @@ { "name": "scripts-front", - "version": "5.0.0-beta.14", + "version": "5.0.0-beta.15", "private": true, "scripts": { "test:front": "jest --config jest.config.front.js" diff --git a/yarn.lock b/yarn.lock index afbdd5b3eb..15b832c0ca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7819,7 +7819,7 @@ __metadata: languageName: node linkType: hard -"@strapi/admin-test-utils@npm:5.0.0-beta.14, @strapi/admin-test-utils@workspace:*, @strapi/admin-test-utils@workspace:packages/admin-test-utils": +"@strapi/admin-test-utils@npm:5.0.0-beta.15, @strapi/admin-test-utils@workspace:*, @strapi/admin-test-utils@workspace:packages/admin-test-utils": version: 0.0.0-use.local resolution: "@strapi/admin-test-utils@workspace:packages/admin-test-utils" dependencies: @@ -7827,10 +7827,10 @@ __metadata: "@reduxjs/toolkit": "npm:1.9.7" "@strapi/pack-up": "npm:5.0.0" "@testing-library/jest-dom": "npm:6.4.5" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" jest-environment-jsdom: "npm:29.6.1" jest-styled-components: "npm:7.1.1" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" whatwg-fetch: "npm:3.6.2" peerDependencies: "@reduxjs/toolkit": ^1.9.7 @@ -7839,7 +7839,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/admin@npm:5.0.0-beta.14, @strapi/admin@workspace:packages/core/admin": +"@strapi/admin@npm:5.0.0-beta.15, @strapi/admin@workspace:packages/core/admin": version: 0.0.0-use.local resolution: "@strapi/admin@workspace:packages/core/admin" dependencies: @@ -7848,15 +7848,15 @@ __metadata: "@radix-ui/react-context": "npm:1.0.1" "@radix-ui/react-toolbar": "npm:1.0.4" "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin-test-utils": "npm:5.0.0-beta.14" - "@strapi/data-transfer": "npm:5.0.0-beta.14" + "@strapi/admin-test-utils": "npm:5.0.0-beta.15" + "@strapi/data-transfer": "npm:5.0.0-beta.15" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.14" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/typescript-utils": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/permissions": "npm:5.0.0-beta.15" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/typescript-utils": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@testing-library/dom": "npm:10.1.0" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" @@ -7941,12 +7941,12 @@ __metadata: languageName: unknown linkType: soft -"@strapi/cloud-cli@npm:5.0.0-beta.14, @strapi/cloud-cli@workspace:packages/cli/cloud": +"@strapi/cloud-cli@npm:5.0.0-beta.15, @strapi/cloud-cli@workspace:packages/cli/cloud": version: 0.0.0-use.local resolution: "@strapi/cloud-cli@workspace:packages/cli/cloud" dependencies: "@strapi/pack-up": "npm:4.23.0" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/cli-progress": "npm:3.11.5" "@types/eventsource": "npm:1.1.15" "@types/lodash": "npm:^4.14.191" @@ -7954,7 +7954,7 @@ __metadata: chalk: "npm:4.1.2" cli-progress: "npm:3.12.0" commander: "npm:8.3.0" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" eventsource: "npm:2.0.2" fast-safe-stringify: "npm:2.1.1" fs-extra: "npm:10.0.0" @@ -7967,7 +7967,7 @@ __metadata: ora: "npm:5.4.1" pkg-up: "npm:3.1.0" tar: "npm:6.1.13" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" xdg-app-paths: "npm:8.3.0" yup: "npm:0.32.9" bin: @@ -7975,20 +7975,20 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-manager@npm:5.0.0-beta.14, @strapi/content-manager@workspace:packages/core/content-manager": +"@strapi/content-manager@npm:5.0.0-beta.15, @strapi/content-manager@workspace:packages/core/content-manager": version: 0.0.0-use.local resolution: "@strapi/content-manager@workspace:packages/core/content-manager" dependencies: "@radix-ui/react-toolbar": "npm:1.0.4" "@reduxjs/toolkit": "npm:1.9.7" "@sindresorhus/slugify": "npm:1.1.0" - "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/admin": "npm:5.0.0-beta.15" "@strapi/database": "workspace:*" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@testing-library/react": "npm:15.0.7" "@types/jest": "npm:29.5.2" "@types/lodash": "npm:^4.14.191" @@ -8038,20 +8038,20 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-releases@npm:5.0.0-beta.14, @strapi/content-releases@workspace:packages/core/content-releases": +"@strapi/content-releases@npm:5.0.0-beta.15, @strapi/content-releases@workspace:packages/core/content-releases": version: 0.0.0-use.local resolution: "@strapi/content-releases@workspace:packages/core/content-releases" dependencies: "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.14" - "@strapi/admin-test-utils": "npm:5.0.0-beta.14" - "@strapi/content-manager": "npm:5.0.0-beta.14" - "@strapi/database": "npm:5.0.0-beta.14" + "@strapi/admin": "npm:5.0.0-beta.15" + "@strapi/admin-test-utils": "npm:5.0.0-beta.15" + "@strapi/content-manager": "npm:5.0.0-beta.15" + "@strapi/database": "npm:5.0.0-beta.15" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" "@strapi/types": "workspace:*" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.15" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" "@types/koa": "npm:2.13.4" @@ -8081,19 +8081,19 @@ __metadata: languageName: unknown linkType: soft -"@strapi/content-type-builder@npm:5.0.0-beta.14, @strapi/content-type-builder@workspace:packages/core/content-type-builder": +"@strapi/content-type-builder@npm:5.0.0-beta.15, @strapi/content-type-builder@workspace:packages/core/content-type-builder": version: 0.0.0-use.local resolution: "@strapi/content-type-builder@workspace:packages/core/content-type-builder" dependencies: "@reduxjs/toolkit": "npm:1.9.7" "@sindresorhus/slugify": "npm:1.1.0" - "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/admin": "npm:5.0.0-beta.15" "@strapi/design-system": "npm:2.0.0-beta.6" - "@strapi/generators": "npm:5.0.0-beta.14" + "@strapi/generators": "npm:5.0.0-beta.15" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" "@types/fs-extra": "npm:11.0.4" @@ -8123,24 +8123,24 @@ __metadata: languageName: unknown linkType: soft -"@strapi/core@npm:5.0.0-beta.14, @strapi/core@workspace:packages/core/core": +"@strapi/core@npm:5.0.0-beta.15, @strapi/core@workspace:packages/core/core": version: 0.0.0-use.local resolution: "@strapi/core@workspace:packages/core/core" dependencies: "@koa/cors": "npm:5.0.0" "@koa/router": "npm:12.0.1" "@paralleldrive/cuid2": "npm:2.2.2" - "@strapi/admin": "npm:5.0.0-beta.14" - "@strapi/database": "npm:5.0.0-beta.14" - "@strapi/generate-new": "npm:5.0.0-beta.14" - "@strapi/generators": "npm:5.0.0-beta.14" - "@strapi/logger": "npm:5.0.0-beta.14" + "@strapi/admin": "npm:5.0.0-beta.15" + "@strapi/database": "npm:5.0.0-beta.15" + "@strapi/generate-new": "npm:5.0.0-beta.15" + "@strapi/generators": "npm:5.0.0-beta.15" + "@strapi/logger": "npm:5.0.0-beta.15" "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.14" + "@strapi/permissions": "npm:5.0.0-beta.15" "@strapi/ts-zen": "npm:^0.2.0" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/typescript-utils": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/typescript-utils": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/bcryptjs": "npm:2.4.3" "@types/configstore": "npm:5.0.1" "@types/delegates": "npm:1.0.0" @@ -8169,7 +8169,7 @@ __metadata: debug: "npm:4.3.4" delegates: "npm:1.0.0" dotenv: "npm:16.4.5" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" execa: "npm:5.1.1" fs-extra: "npm:11.2.0" glob: "npm:10.3.10" @@ -8197,22 +8197,22 @@ __metadata: semver: "npm:7.5.4" statuses: "npm:2.0.1" supertest: "npm:6.3.3" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" typescript: "npm:5.2.2" undici: "npm:6.18.2" yup: "npm:0.32.9" languageName: unknown linkType: soft -"@strapi/data-transfer@npm:5.0.0-beta.14, @strapi/data-transfer@workspace:packages/core/data-transfer": +"@strapi/data-transfer@npm:5.0.0-beta.15, @strapi/data-transfer@workspace:packages/core/data-transfer": version: 0.0.0-use.local resolution: "@strapi/data-transfer@workspace:packages/core/data-transfer" dependencies: "@strapi/database": "workspace:*" - "@strapi/logger": "npm:5.0.0-beta.14" + "@strapi/logger": "npm:5.0.0-beta.15" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/fs-extra": "npm:11.0.4" "@types/jest": "npm:29.5.2" "@types/koa": "npm:2.13.4" @@ -8245,23 +8245,23 @@ __metadata: languageName: unknown linkType: soft -"@strapi/database@npm:5.0.0-beta.14, @strapi/database@workspace:*, @strapi/database@workspace:packages/core/database": +"@strapi/database@npm:5.0.0-beta.15, @strapi/database@workspace:*, @strapi/database@workspace:packages/core/database": version: 0.0.0-use.local resolution: "@strapi/database@workspace:packages/core/database" dependencies: "@paralleldrive/cuid2": "npm:2.2.2" "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/fs-extra": "npm:11.0.4" ajv: "npm:8.16.0" date-fns: "npm:2.30.0" debug: "npm:4.3.4" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" fs-extra: "npm:11.2.0" knex: "npm:3.0.1" lodash: "npm:4.17.21" semver: "npm:7.5.4" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" umzug: "npm:3.8.1" languageName: unknown linkType: soft @@ -8301,17 +8301,17 @@ __metadata: languageName: node linkType: hard -"@strapi/email@npm:5.0.0-beta.14, @strapi/email@workspace:packages/core/email": +"@strapi/email@npm:5.0.0-beta.15, @strapi/email@workspace:packages/core/email": version: 0.0.0-use.local resolution: "@strapi/email@workspace:packages/core/email" dependencies: - "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/admin": "npm:5.0.0-beta.15" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/provider-email-sendmail": "npm:5.0.0-beta.14" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/provider-email-sendmail": "npm:5.0.0-beta.15" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@testing-library/react": "npm:15.0.7" "@types/koa": "npm:2.13.4" "@types/lodash": "npm:^4.14.191" @@ -8367,7 +8367,7 @@ __metadata: languageName: node linkType: hard -"@strapi/generate-new@npm:5.0.0-beta.14, @strapi/generate-new@workspace:packages/generators/app": +"@strapi/generate-new@npm:5.0.0-beta.15, @strapi/generate-new@workspace:packages/generators/app": version: 0.0.0-use.local resolution: "@strapi/generate-new@workspace:packages/generators/app" dependencies: @@ -8387,39 +8387,39 @@ __metadata: languageName: unknown linkType: soft -"@strapi/generators@npm:5.0.0-beta.14, @strapi/generators@workspace:packages/generators/generators": +"@strapi/generators@npm:5.0.0-beta.15, @strapi/generators@workspace:packages/generators/generators": version: 0.0.0-use.local resolution: "@strapi/generators@workspace:packages/generators/generators" dependencies: "@sindresorhus/slugify": "npm:1.1.0" "@strapi/pack-up": "npm:5.0.0" - "@strapi/typescript-utils": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/typescript-utils": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/fs-extra": "npm:11.0.4" chalk: "npm:4.1.2" copyfiles: "npm:2.4.1" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" fs-extra: "npm:11.2.0" node-plop: "npm:0.26.3" plop: "npm:2.7.6" pluralize: "npm:8.0.0" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" languageName: unknown linkType: soft -"@strapi/i18n@npm:5.0.0-beta.14, @strapi/i18n@workspace:packages/plugins/i18n": +"@strapi/i18n@npm:5.0.0-beta.15, @strapi/i18n@workspace:packages/plugins/i18n": version: 0.0.0-use.local resolution: "@strapi/i18n@workspace:packages/plugins/i18n" dependencies: "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.14" - "@strapi/admin-test-utils": "npm:5.0.0-beta.14" - "@strapi/content-manager": "npm:5.0.0-beta.14" + "@strapi/admin": "npm:5.0.0-beta.15" + "@strapi/admin-test-utils": "npm:5.0.0-beta.15" + "@strapi/content-manager": "npm:5.0.0-beta.15" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" lodash: "npm:4.17.21" @@ -8454,14 +8454,14 @@ __metadata: languageName: node linkType: hard -"@strapi/logger@npm:5.0.0-beta.14, @strapi/logger@workspace:packages/utils/logger": +"@strapi/logger@npm:5.0.0-beta.15, @strapi/logger@workspace:packages/utils/logger": version: 0.0.0-use.local resolution: "@strapi/logger@workspace:packages/utils/logger" dependencies: "@strapi/pack-up": "npm:5.0.0" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" lodash: "npm:4.17.21" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" winston: "npm:3.10.0" languageName: unknown linkType: soft @@ -8559,18 +8559,18 @@ __metadata: languageName: node linkType: hard -"@strapi/permissions@npm:5.0.0-beta.14, @strapi/permissions@workspace:packages/core/permissions": +"@strapi/permissions@npm:5.0.0-beta.15, @strapi/permissions@workspace:packages/core/permissions": version: 0.0.0-use.local resolution: "@strapi/permissions@workspace:packages/core/permissions" dependencies: "@casl/ability": "npm:6.5.0" "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.14" - eslint-config-custom: "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.15" + eslint-config-custom: "npm:5.0.0-beta.15" lodash: "npm:4.17.21" qs: "npm:6.11.1" sift: "npm:16.0.1" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" languageName: unknown linkType: soft @@ -8581,14 +8581,14 @@ __metadata: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.14" - eslint-config-custom: "npm:5.0.0-beta.14" + "@strapi/strapi": "npm:5.0.0-beta.15" + eslint-config-custom: "npm:5.0.0-beta.15" react: "npm:18.3.1" react-dom: "npm:18.3.1" react-intl: "npm:6.6.2" react-router-dom: "npm:6.22.3" styled-components: "npm:6.1.8" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" typescript: "npm:5.2.2" peerDependencies: "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc @@ -8599,14 +8599,14 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-color-picker@npm:5.0.0-beta.14, @strapi/plugin-color-picker@workspace:packages/plugins/color-picker": +"@strapi/plugin-color-picker@npm:5.0.0-beta.15, @strapi/plugin-color-picker@workspace:packages/plugins/color-picker": version: 0.0.0-use.local resolution: "@strapi/plugin-color-picker@workspace:packages/plugins/color-picker" dependencies: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.14" + "@strapi/strapi": "npm:5.0.0-beta.15" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" react: "npm:18.3.1" @@ -8625,21 +8625,21 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-documentation@npm:5.0.0-beta.14, @strapi/plugin-documentation@workspace:packages/plugins/documentation": +"@strapi/plugin-documentation@npm:5.0.0-beta.15, @strapi/plugin-documentation@workspace:packages/plugins/documentation": version: 0.0.0-use.local resolution: "@strapi/plugin-documentation@workspace:packages/plugins/documentation" dependencies: "@apidevtools/swagger-parser": "npm:^10.1.0" "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.14" - "@strapi/admin-test-utils": "npm:5.0.0-beta.14" + "@strapi/admin": "npm:5.0.0-beta.15" + "@strapi/admin-test-utils": "npm:5.0.0-beta.15" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.14" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/strapi": "npm:5.0.0-beta.15" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" "@types/fs-extra": "npm:11.0.4" @@ -8676,7 +8676,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-graphql@npm:5.0.0-beta.14, @strapi/plugin-graphql@workspace:packages/plugins/graphql": +"@strapi/plugin-graphql@npm:5.0.0-beta.15, @strapi/plugin-graphql@workspace:packages/plugins/graphql": version: 0.0.0-use.local resolution: "@strapi/plugin-graphql@workspace:packages/plugins/graphql" dependencies: @@ -8688,14 +8688,14 @@ __metadata: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.14" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/strapi": "npm:5.0.0-beta.15" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/graphql-depth-limit": "npm:1.1.5" "@types/koa-bodyparser": "npm:4.3.12" "@types/koa__cors": "npm:5.0.0" cross-env: "npm:^7.0.3" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" graphql: "npm:^16.8.1" graphql-depth-limit: "npm:^1.1.0" graphql-playground-middleware-koa: "npm:^1.6.21" @@ -8710,7 +8710,7 @@ __metadata: react-dom: "npm:18.3.1" react-router-dom: "npm:6.22.3" styled-components: "npm:6.1.8" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" typescript: "npm:5.3.2" peerDependencies: "@strapi/strapi": ^5.0.0 || ^5.0.0-beta || ^5.0.0-alpha || ^5.0.0-rc @@ -8721,7 +8721,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-sentry@npm:5.0.0-beta.14, @strapi/plugin-sentry@workspace:packages/plugins/sentry": +"@strapi/plugin-sentry@npm:5.0.0-beta.15, @strapi/plugin-sentry@workspace:packages/plugins/sentry": version: 0.0.0-use.local resolution: "@strapi/plugin-sentry@workspace:packages/plugins/sentry" dependencies: @@ -8730,7 +8730,7 @@ __metadata: "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" "@strapi/sdk-plugin": "npm:^5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.14" + "@strapi/strapi": "npm:5.0.0-beta.15" react: "npm:18.3.1" react-dom: "npm:18.3.1" react-router-dom: "npm:6.22.3" @@ -8744,15 +8744,15 @@ __metadata: languageName: unknown linkType: soft -"@strapi/plugin-users-permissions@npm:5.0.0-beta.14, @strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions": +"@strapi/plugin-users-permissions@npm:5.0.0-beta.15, @strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions": version: 0.0.0-use.local resolution: "@strapi/plugin-users-permissions@workspace:packages/plugins/users-permissions" dependencies: "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/strapi": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/strapi": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@testing-library/dom": "npm:10.1.0" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" @@ -8791,23 +8791,23 @@ __metadata: resolution: "@strapi/provider-email-amazon-ses@workspace:packages/providers/email-amazon-ses" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.14" - eslint-config-custom: "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.15" + eslint-config-custom: "npm:5.0.0-beta.15" node-ses: "npm:^3.0.3" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" languageName: unknown linkType: soft -"@strapi/provider-email-mailgun@npm:5.0.0-beta.14, @strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun": +"@strapi/provider-email-mailgun@npm:5.0.0-beta.15, @strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun": version: 0.0.0-use.local resolution: "@strapi/provider-email-mailgun@workspace:packages/providers/email-mailgun" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.14" - eslint-config-custom: "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.15" + eslint-config-custom: "npm:5.0.0-beta.15" form-data: "npm:^4.0.0" mailgun.js: "npm:10.2.1" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" languageName: unknown linkType: soft @@ -8817,10 +8817,10 @@ __metadata: dependencies: "@strapi/pack-up": "npm:5.0.0" "@types/nodemailer": "npm:6.4.7" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" lodash: "npm:4.17.21" nodemailer: "npm:6.9.1" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" languageName: unknown linkType: soft @@ -8830,26 +8830,26 @@ __metadata: dependencies: "@sendgrid/mail": "npm:7.7.0" "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.14" - eslint-config-custom: "npm:5.0.0-beta.14" - tsconfig: "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.15" + eslint-config-custom: "npm:5.0.0-beta.15" + tsconfig: "npm:5.0.0-beta.15" languageName: unknown linkType: soft -"@strapi/provider-email-sendmail@npm:5.0.0-beta.14, @strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail": +"@strapi/provider-email-sendmail@npm:5.0.0-beta.15, @strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail": version: 0.0.0-use.local resolution: "@strapi/provider-email-sendmail@workspace:packages/providers/email-sendmail" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/sendmail": "npm:1.4.4" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" sendmail: "npm:^1.6.1" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" languageName: unknown linkType: soft -"@strapi/provider-upload-aws-s3@npm:5.0.0-beta.14, @strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3": +"@strapi/provider-upload-aws-s3@npm:5.0.0-beta.15, @strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3": version: 0.0.0-use.local resolution: "@strapi/provider-upload-aws-s3@workspace:packages/providers/upload-aws-s3" dependencies: @@ -8859,53 +8859,53 @@ __metadata: "@aws-sdk/types": "npm:3.433.0" "@strapi/pack-up": "npm:5.0.0" "@types/jest": "npm:29.5.2" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" lodash: "npm:4.17.21" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" languageName: unknown linkType: soft -"@strapi/provider-upload-cloudinary@npm:5.0.0-beta.14, @strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary": +"@strapi/provider-upload-cloudinary@npm:5.0.0-beta.15, @strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary": version: 0.0.0-use.local resolution: "@strapi/provider-upload-cloudinary@workspace:packages/providers/upload-cloudinary" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.15" cloudinary: "npm:^1.41.0" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" into-stream: "npm:^5.1.0" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" languageName: unknown linkType: soft -"@strapi/provider-upload-local@npm:5.0.0-beta.14, @strapi/provider-upload-local@workspace:packages/providers/upload-local": +"@strapi/provider-upload-local@npm:5.0.0-beta.15, @strapi/provider-upload-local@workspace:packages/providers/upload-local": version: 0.0.0-use.local resolution: "@strapi/provider-upload-local@workspace:packages/providers/upload-local" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/fs-extra": "npm:11.0.4" "@types/jest": "npm:29.5.2" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" fs-extra: "npm:11.2.0" memfs: "npm:4.6.0" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" languageName: unknown linkType: soft -"@strapi/review-workflows@npm:5.0.0-beta.14, @strapi/review-workflows@workspace:packages/core/review-workflows": +"@strapi/review-workflows@npm:5.0.0-beta.15, @strapi/review-workflows@workspace:packages/core/review-workflows": version: 0.0.0-use.local resolution: "@strapi/review-workflows@workspace:packages/core/review-workflows" dependencies: "@reduxjs/toolkit": "npm:1.9.7" - "@strapi/admin": "npm:5.0.0-beta.14" - "@strapi/content-manager": "npm:5.0.0-beta.14" + "@strapi/admin": "npm:5.0.0-beta.15" + "@strapi/content-manager": "npm:5.0.0-beta.15" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@testing-library/react": "npm:15.0.7" fractional-indexing: "npm:3.2.0" msw: "npm:1.3.0" @@ -8954,32 +8954,32 @@ __metadata: languageName: node linkType: hard -"@strapi/strapi@npm:5.0.0-beta.14, @strapi/strapi@workspace:packages/core/strapi": +"@strapi/strapi@npm:5.0.0-beta.15, @strapi/strapi@workspace:packages/core/strapi": version: 0.0.0-use.local resolution: "@strapi/strapi@workspace:packages/core/strapi" dependencies: "@pmmmwh/react-refresh-webpack-plugin": "npm:0.5.11" - "@strapi/admin": "npm:5.0.0-beta.14" - "@strapi/cloud-cli": "npm:5.0.0-beta.14" - "@strapi/content-manager": "npm:5.0.0-beta.14" - "@strapi/content-releases": "npm:5.0.0-beta.14" - "@strapi/content-type-builder": "npm:5.0.0-beta.14" - "@strapi/core": "npm:5.0.0-beta.14" - "@strapi/data-transfer": "npm:5.0.0-beta.14" - "@strapi/database": "npm:5.0.0-beta.14" - "@strapi/email": "npm:5.0.0-beta.14" - "@strapi/generate-new": "npm:5.0.0-beta.14" - "@strapi/generators": "npm:5.0.0-beta.14" - "@strapi/i18n": "npm:5.0.0-beta.14" - "@strapi/logger": "npm:5.0.0-beta.14" + "@strapi/admin": "npm:5.0.0-beta.15" + "@strapi/cloud-cli": "npm:5.0.0-beta.15" + "@strapi/content-manager": "npm:5.0.0-beta.15" + "@strapi/content-releases": "npm:5.0.0-beta.15" + "@strapi/content-type-builder": "npm:5.0.0-beta.15" + "@strapi/core": "npm:5.0.0-beta.15" + "@strapi/data-transfer": "npm:5.0.0-beta.15" + "@strapi/database": "npm:5.0.0-beta.15" + "@strapi/email": "npm:5.0.0-beta.15" + "@strapi/generate-new": "npm:5.0.0-beta.15" + "@strapi/generators": "npm:5.0.0-beta.15" + "@strapi/i18n": "npm:5.0.0-beta.15" + "@strapi/logger": "npm:5.0.0-beta.15" "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.14" - "@strapi/review-workflows": "npm:5.0.0-beta.14" + "@strapi/permissions": "npm:5.0.0-beta.15" + "@strapi/review-workflows": "npm:5.0.0-beta.15" "@strapi/ts-zen": "npm:^0.2.0" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/typescript-utils": "npm:5.0.0-beta.14" - "@strapi/upload": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/typescript-utils": "npm:5.0.0-beta.15" + "@strapi/upload": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/fs-extra": "npm:11.0.4" "@types/jest": "npm:29.5.2" "@types/lodash": "npm:^4.14.191" @@ -9004,7 +9004,7 @@ __metadata: esbuild: "npm:0.21.3" esbuild-loader: "npm:^2.21.0" esbuild-register: "npm:3.5.0" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" execa: "npm:5.1.1" fork-ts-checker-webpack-plugin: "npm:8.0.0" fs-extra: "npm:11.2.0" @@ -9026,7 +9026,7 @@ __metadata: resolve-from: "npm:5.0.0" semver: "npm:7.5.4" style-loader: "npm:3.3.4" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" typescript: "npm:5.3.2" vite: "npm:5.1.6" webpack: "npm:^5.90.3" @@ -9055,29 +9055,29 @@ __metadata: languageName: node linkType: hard -"@strapi/types@npm:5.0.0-beta.14, @strapi/types@workspace:*, @strapi/types@workspace:packages/core/types": +"@strapi/types@npm:5.0.0-beta.15, @strapi/types@workspace:*, @strapi/types@workspace:packages/core/types": version: 0.0.0-use.local resolution: "@strapi/types@workspace:packages/core/types" dependencies: "@casl/ability": "npm:6.5.0" "@koa/cors": "npm:5.0.0" "@koa/router": "npm:12.0.1" - "@strapi/database": "npm:5.0.0-beta.14" - "@strapi/logger": "npm:5.0.0-beta.14" + "@strapi/database": "npm:5.0.0-beta.15" + "@strapi/logger": "npm:5.0.0-beta.15" "@strapi/pack-up": "npm:5.0.0" - "@strapi/permissions": "npm:5.0.0-beta.14" + "@strapi/permissions": "npm:5.0.0-beta.15" "@strapi/ts-zen": "npm:^0.2.0" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/jest": "npm:29.5.2" "@types/koa": "npm:2.13.4" "@types/koa__router": "npm:12.0.0" "@types/node-schedule": "npm:2.1.0" commander: "npm:8.3.0" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" koa: "npm:2.15.2" lodash: "npm:4.17.21" node-schedule: "npm:2.1.0" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" typedoc: "npm:0.25.10" typedoc-github-wiki-theme: "npm:1.1.0" typedoc-plugin-markdown: "npm:3.17.1" @@ -9086,7 +9086,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/typescript-utils@npm:5.0.0-beta.14, @strapi/typescript-utils@workspace:packages/utils/typescript": +"@strapi/typescript-utils@npm:5.0.0-beta.15, @strapi/typescript-utils@workspace:packages/utils/typescript": version: 0.0.0-use.local resolution: "@strapi/typescript-utils@workspace:packages/utils/typescript" dependencies: @@ -9137,8 +9137,8 @@ __metadata: resolution: "@strapi/upgrade@workspace:packages/utils/upgrade" dependencies: "@strapi/pack-up": "npm:5.0.0" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@types/fs-extra": "npm:11.0.4" "@types/jscodeshift": "npm:0.11.10" chalk: "npm:4.1.2" @@ -9161,17 +9161,17 @@ __metadata: languageName: unknown linkType: soft -"@strapi/upload@npm:5.0.0-beta.14, @strapi/upload@workspace:packages/core/upload": +"@strapi/upload@npm:5.0.0-beta.15, @strapi/upload@workspace:packages/core/upload": version: 0.0.0-use.local resolution: "@strapi/upload@workspace:packages/core/upload" dependencies: - "@strapi/admin": "npm:5.0.0-beta.14" + "@strapi/admin": "npm:5.0.0-beta.15" "@strapi/design-system": "npm:2.0.0-beta.6" "@strapi/icons": "npm:2.0.0-beta.6" "@strapi/pack-up": "npm:5.0.0" - "@strapi/provider-upload-local": "npm:5.0.0-beta.14" - "@strapi/types": "npm:5.0.0-beta.14" - "@strapi/utils": "npm:5.0.0-beta.14" + "@strapi/provider-upload-local": "npm:5.0.0-beta.15" + "@strapi/types": "npm:5.0.0-beta.15" + "@strapi/utils": "npm:5.0.0-beta.15" "@testing-library/dom": "npm:10.1.0" "@testing-library/react": "npm:15.0.7" "@testing-library/user-event": "npm:14.5.2" @@ -9215,7 +9215,7 @@ __metadata: languageName: unknown linkType: soft -"@strapi/utils@npm:5.0.0-beta.14, @strapi/utils@workspace:packages/core/utils": +"@strapi/utils@npm:5.0.0-beta.15, @strapi/utils@workspace:packages/core/utils": version: 0.0.0-use.local resolution: "@strapi/utils@workspace:packages/core/utils" dependencies: @@ -9225,7 +9225,7 @@ __metadata: "@types/koa": "npm:2.13.4" "@types/node": "npm:18.19.24" date-fns: "npm:2.30.0" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" execa: "npm:5.1.1" http-errors: "npm:2.0.0" koa: "npm:2.15.2" @@ -9234,7 +9234,7 @@ __metadata: node-machine-id: "npm:1.1.12" p-map: "npm:4.0.0" preferred-pm: "npm:3.1.2" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" yup: "npm:0.32.9" zod: "npm:^3.22.4" languageName: unknown @@ -14594,19 +14594,19 @@ __metadata: languageName: node linkType: hard -"create-strapi-app@npm:5.0.0-beta.14, create-strapi-app@workspace:packages/cli/create-strapi-app": +"create-strapi-app@npm:5.0.0-beta.15, create-strapi-app@workspace:packages/cli/create-strapi-app": version: 0.0.0-use.local resolution: "create-strapi-app@workspace:packages/cli/create-strapi-app" dependencies: - "@strapi/cloud-cli": "npm:5.0.0-beta.14" - "@strapi/generate-new": "npm:5.0.0-beta.14" + "@strapi/cloud-cli": "npm:5.0.0-beta.15" + "@strapi/generate-new": "npm:5.0.0-beta.15" "@strapi/pack-up": "npm:5.0.0" "@types/inquirer": "npm:8.2.5" chalk: "npm:4.1.2" commander: "npm:8.3.0" - eslint-config-custom: "npm:5.0.0-beta.14" + eslint-config-custom: "npm:5.0.0-beta.15" inquirer: "npm:8.2.5" - tsconfig: "npm:5.0.0-beta.14" + tsconfig: "npm:5.0.0-beta.15" bin: create-strapi-app: ./bin/index.js languageName: unknown @@ -14616,7 +14616,7 @@ __metadata: version: 0.0.0-use.local resolution: "create-strapi@workspace:packages/cli/create-strapi" dependencies: - create-strapi-app: "npm:5.0.0-beta.14" + create-strapi-app: "npm:5.0.0-beta.15" bin: create-strapi: ./bin/index.js languageName: unknown @@ -16600,7 +16600,7 @@ __metadata: languageName: node linkType: hard -"eslint-config-custom@npm:5.0.0-beta.14, eslint-config-custom@workspace:*, eslint-config-custom@workspace:packages/utils/eslint-config-custom": +"eslint-config-custom@npm:5.0.0-beta.15, eslint-config-custom@workspace:*, eslint-config-custom@workspace:packages/utils/eslint-config-custom": version: 0.0.0-use.local resolution: "eslint-config-custom@workspace:packages/utils/eslint-config-custom" languageName: unknown @@ -17325,8 +17325,8 @@ __metadata: version: 0.0.0-use.local resolution: "experimental-dev@workspace:examples/experimental-dev" dependencies: - "@strapi/plugin-users-permissions": "npm:5.0.0-beta.14" - "@strapi/strapi": "npm:5.0.0-beta.14" + "@strapi/plugin-users-permissions": "npm:5.0.0-beta.15" + "@strapi/strapi": "npm:5.0.0-beta.15" "@vitejs/plugin-react": "npm:4.2.1" babel-plugin-react-compiler: "npm:0.0.0-experimental-c23de8d-20240515" better-sqlite3: "npm:9.4.3" @@ -18426,15 +18426,15 @@ __metadata: resolution: "getstarted@workspace:examples/getstarted" dependencies: "@strapi/icons": "npm:2.0.0-beta.6" - "@strapi/plugin-color-picker": "npm:5.0.0-beta.14" - "@strapi/plugin-documentation": "npm:5.0.0-beta.14" - "@strapi/plugin-graphql": "npm:5.0.0-beta.14" - "@strapi/plugin-sentry": "npm:5.0.0-beta.14" - "@strapi/plugin-users-permissions": "npm:5.0.0-beta.14" - "@strapi/provider-email-mailgun": "npm:5.0.0-beta.14" - "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.14" - "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.14" - "@strapi/strapi": "npm:5.0.0-beta.14" + "@strapi/plugin-color-picker": "npm:5.0.0-beta.15" + "@strapi/plugin-documentation": "npm:5.0.0-beta.15" + "@strapi/plugin-graphql": "npm:5.0.0-beta.15" + "@strapi/plugin-sentry": "npm:5.0.0-beta.15" + "@strapi/plugin-users-permissions": "npm:5.0.0-beta.15" + "@strapi/provider-email-mailgun": "npm:5.0.0-beta.15" + "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.15" + "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.15" + "@strapi/strapi": "npm:5.0.0-beta.15" better-sqlite3: "npm:9.4.3" lodash: "npm:4.17.21" mysql2: "npm:3.9.4" @@ -21798,8 +21798,8 @@ __metadata: version: 0.0.0-use.local resolution: "kitchensink-ts@workspace:examples/kitchensink-ts" dependencies: - "@strapi/plugin-users-permissions": "npm:5.0.0-beta.14" - "@strapi/strapi": "npm:5.0.0-beta.14" + "@strapi/plugin-users-permissions": "npm:5.0.0-beta.15" + "@strapi/strapi": "npm:5.0.0-beta.15" better-sqlite3: "npm:9.4.3" react: "npm:18.3.1" react-dom: "npm:18.3.1" @@ -21812,10 +21812,10 @@ __metadata: version: 0.0.0-use.local resolution: "kitchensink@workspace:examples/kitchensink" dependencies: - "@strapi/provider-email-mailgun": "npm:5.0.0-beta.14" - "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.14" - "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.14" - "@strapi/strapi": "npm:5.0.0-beta.14" + "@strapi/provider-email-mailgun": "npm:5.0.0-beta.15" + "@strapi/provider-upload-aws-s3": "npm:5.0.0-beta.15" + "@strapi/provider-upload-cloudinary": "npm:5.0.0-beta.15" + "@strapi/strapi": "npm:5.0.0-beta.15" better-sqlite3: "npm:9.4.3" lodash: "npm:4.17.21" mysql2: "npm:3.9.4" @@ -30073,7 +30073,7 @@ __metadata: languageName: node linkType: hard -"tsconfig@npm:5.0.0-beta.14, tsconfig@workspace:packages/utils/tsconfig": +"tsconfig@npm:5.0.0-beta.15, tsconfig@workspace:packages/utils/tsconfig": version: 0.0.0-use.local resolution: "tsconfig@workspace:packages/utils/tsconfig" dependencies: From a1a359742a9e2eb8beb5013141cd05596e9680a9 Mon Sep 17 00:00:00 2001 From: Alexandre Bodin Date: Sun, 23 Jun 2024 19:56:48 +0200 Subject: [PATCH 35/78] fix: manage auth in redux store --- packages/core/admin/admin/src/StrapiApp.tsx | 8 +- .../admin/admin/src/core/store/configure.ts | 19 ++++- .../core/admin/admin/src/features/Auth.tsx | 77 +++++++------------ .../admin/src/features/Configuration.tsx | 1 + .../src/pages/Auth/components/Register.tsx | 9 ++- .../pages/Auth/components/ResetPassword.tsx | 8 +- .../components/CollapsePropertyMatrix.tsx | 3 +- .../Roles/components/ContentTypeCollapses.tsx | 7 +- .../Roles/components/PluginsAndSettings.tsx | 4 +- .../Roles/components/RowLabelWithCheckbox.tsx | 1 - .../components/tests/Permissions.test.tsx | 4 +- packages/core/admin/admin/src/reducer.ts | 51 +++++++++--- .../admin/admin/src/tests/reducer.test.ts | 4 + packages/core/admin/admin/tests/store.ts | 7 +- packages/core/admin/admin/tests/utils.tsx | 8 +- .../admin/ee/admin/src/pages/AuthResponse.tsx | 14 ++-- .../content-manager/admin/tests/utils.tsx | 24 +++--- .../RemoveAssetDialog.test.jsx.snap | 76 ++++++++++-------- 18 files changed, 190 insertions(+), 135 deletions(-) diff --git a/packages/core/admin/admin/src/StrapiApp.tsx b/packages/core/admin/admin/src/StrapiApp.tsx index 3313d6a2e0..4a234fd714 100644 --- a/packages/core/admin/admin/src/StrapiApp.tsx +++ b/packages/core/admin/admin/src/StrapiApp.tsx @@ -19,7 +19,12 @@ import { Router, StrapiAppSetting, UnloadedSettingsLink } from './core/apis/rout import { RootState, Store, configureStore } from './core/store/configure'; import { getBasename } from './core/utils/basename'; import { Handler, createHook } from './core/utils/createHook'; -import { THEME_LOCAL_STORAGE_KEY, LANGUAGE_LOCAL_STORAGE_KEY, ThemeName } from './reducer'; +import { + THEME_LOCAL_STORAGE_KEY, + LANGUAGE_LOCAL_STORAGE_KEY, + ThemeName, + getStoredToken, +} from './reducer'; import { getInitialRoutes } from './router'; import { languageNativeNames } from './translations/languageNativeNames'; @@ -439,6 +444,7 @@ class StrapiApp { locale: localeNames[locale] ? locale : 'en', localeNames, }, + token: getStoredToken(), }, }, this.middlewares, diff --git a/packages/core/admin/admin/src/core/store/configure.ts b/packages/core/admin/admin/src/core/store/configure.ts index e8d7a0d47f..a286f9e8a0 100644 --- a/packages/core/admin/admin/src/core/store/configure.ts +++ b/packages/core/admin/admin/src/core/store/configure.ts @@ -4,9 +4,11 @@ import { Middleware, Reducer, combineReducers, + MiddlewareAPI, + isRejected, } from '@reduxjs/toolkit'; -import { reducer as appReducer, AppState } from '../../reducer'; +import { reducer as appReducer, AppState, logout } from '../../reducer'; import { adminApi } from '../../services/api'; /** @@ -73,6 +75,7 @@ const configureStoreImpl = ( devTools: process.env.NODE_ENV !== 'production', middleware: (getDefaultMiddleware) => [ ...getDefaultMiddleware(defaultMiddlewareOptions), + rtkQueryUnauthorizedMiddleware, adminApi.middleware, ...appMiddlewares.map((m) => m()), ], @@ -82,6 +85,20 @@ const configureStoreImpl = ( return store; }; +const rtkQueryUnauthorizedMiddleware: Middleware = + ({ dispatch }: MiddlewareAPI) => + (next) => + (action) => { + // isRejectedWithValue Or isRejected + if (isRejected(action) && action.payload?.status === 401) { + dispatch(logout()); + window.location.href = '/admin/auth/login'; + return; + } + + return next(action); + }; + type Store = ReturnType & { asyncReducers: Record; injectReducer: (key: string, asyncReducer: Reducer) => void; diff --git a/packages/core/admin/admin/src/features/Auth.tsx b/packages/core/admin/admin/src/features/Auth.tsx index 03d70bced3..49f7528223 100644 --- a/packages/core/admin/admin/src/features/Auth.tsx +++ b/packages/core/admin/admin/src/features/Auth.tsx @@ -4,9 +4,9 @@ import { useLocation, useNavigate } from 'react-router-dom'; import { Login } from '../../../shared/contracts/authentication'; import { createContext } from '../components/Context'; -import { useTypedDispatch } from '../core/store/hooks'; +import { useTypedDispatch, useTypedSelector } from '../core/store/hooks'; import { useStrapiApp } from '../features/StrapiApp'; -import { setLocale } from '../reducer'; +import { login as loginAction, logout as logoutAction, setLocale } from '../reducer'; import { adminApi } from '../services/api'; import { useGetMeQuery, @@ -50,7 +50,6 @@ interface AuthContextValue { isLoading: boolean; permissions: Permission[]; refetchPermissions: () => Promise; - setToken: (token: string | null) => void; token: string | null; user?: User; } @@ -74,16 +73,7 @@ const AuthProvider = ({ children, _defaultPermissions = [] }: AuthProviderProps) const dispatch = useTypedDispatch(); const runRbacMiddleware = useStrapiApp('AuthProvider', (state) => state.rbac.run); const location = useLocation(); - const [token, setToken] = React.useState(() => { - const token = - localStorage.getItem(STORAGE_KEYS.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS.TOKEN); - - if (typeof token === 'string') { - return JSON.parse(token); - } - - return null; - }); + const { token = null } = useTypedSelector((state) => state.admin_app); const { data: user, isLoading: isLoadingUser } = useGetMeQuery(undefined, { /** @@ -107,13 +97,11 @@ const AuthProvider = ({ children, _defaultPermissions = [] }: AuthProviderProps) const [renewTokenMutation] = useRenewTokenMutation(); const [logoutMutation] = useLogoutMutation(); - const clearStorage = React.useCallback(() => { - localStorage.removeItem(STORAGE_KEYS.TOKEN); - localStorage.removeItem(STORAGE_KEYS.USER); - sessionStorage.removeItem(STORAGE_KEYS.TOKEN); - sessionStorage.removeItem(STORAGE_KEYS.USER); - setToken(null); - }, []); + const clearStateAndLogout = React.useCallback(() => { + dispatch(adminApi.util.resetApiState()); + dispatch(logoutAction()); + navigate('/auth/login'); + }, [dispatch, navigate]); /** * Fetch data from storages on mount and store it in our state. @@ -121,20 +109,20 @@ const AuthProvider = ({ children, _defaultPermissions = [] }: AuthProviderProps) * does click "remember me" when they login. We also need to renew the token. */ React.useEffect(() => { - const token = - localStorage.getItem(STORAGE_KEYS.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS.TOKEN); - if (token) { - renewTokenMutation({ token: JSON.parse(token) }).then((res) => { + renewTokenMutation({ token }).then((res) => { if ('data' in res) { - setToken(res.data.token); + dispatch( + loginAction({ + token: res.data.token, + }) + ); } else { - clearStorage(); - navigate('/auth/login'); + clearStateAndLogout(); } }); } - }, [renewTokenMutation, clearStorage, navigate]); + }, [token, dispatch, renewTokenMutation, clearStateAndLogout]); React.useEffect(() => { if (user) { @@ -144,20 +132,13 @@ const AuthProvider = ({ children, _defaultPermissions = [] }: AuthProviderProps) } }, [dispatch, user]); - React.useEffect(() => { - if (token) { - storeToken(token, false); - } - }, [token]); - React.useEffect(() => { /** * This will log a user out of all tabs if they log out in one tab. */ const handleUserStorageChange = (event: StorageEvent) => { if (event.key === STORAGE_KEYS.USER && event.newValue === null) { - clearStorage(); - navigate('/auth/login'); + clearStateAndLogout(); } }; @@ -179,21 +160,23 @@ const AuthProvider = ({ children, _defaultPermissions = [] }: AuthProviderProps) if ('data' in res) { const { token } = res.data; - storeToken(token, rememberMe); - setToken(token); + dispatch( + loginAction({ + token, + persist: rememberMe, + }) + ); } return res; }, - [loginMutation] + [dispatch, loginMutation] ); const logout = React.useCallback(async () => { await logoutMutation(); - dispatch(adminApi.util.resetApiState()); - clearStorage(); - navigate('/auth/login'); - }, [clearStorage, dispatch, logoutMutation, navigate]); + clearStateAndLogout(); + }, [clearStateAndLogout, logoutMutation]); const refetchPermissions = React.useCallback(async () => { if (!isUninitialized) { @@ -272,7 +255,6 @@ const AuthProvider = ({ children, _defaultPermissions = [] }: AuthProviderProps) permissions={userPermissions} checkUserHasPermissions={checkUserHasPermissions} refetchPermissions={refetchPermissions} - setToken={setToken} isLoading={isLoading} > {children} @@ -280,12 +262,5 @@ const AuthProvider = ({ children, _defaultPermissions = [] }: AuthProviderProps) ); }; -const storeToken = (token: string, persist?: boolean) => { - if (!persist) { - return window.sessionStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token)); - } - return window.localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token)); -}; - export { AuthProvider, useAuth, STORAGE_KEYS }; export type { AuthContextValue, Permission, User }; diff --git a/packages/core/admin/admin/src/features/Configuration.tsx b/packages/core/admin/admin/src/features/Configuration.tsx index be6d45ae77..31fb3556fe 100644 --- a/packages/core/admin/admin/src/features/Configuration.tsx +++ b/packages/core/admin/admin/src/features/Configuration.tsx @@ -78,6 +78,7 @@ const ConfigurationProvider = ({ (state) => state.admin_app.permissions.settings?.['project-settings'] ); const token = useAuth('ConfigurationProvider', (state) => state.token); + const { allowedActions: { canRead }, } = useRBAC(permissions); diff --git a/packages/core/admin/admin/src/pages/Auth/components/Register.tsx b/packages/core/admin/admin/src/pages/Auth/components/Register.tsx index 4c5a939566..1239fe80ee 100644 --- a/packages/core/admin/admin/src/pages/Auth/components/Register.tsx +++ b/packages/core/admin/admin/src/pages/Auth/components/Register.tsx @@ -17,11 +17,12 @@ import { InputRenderer } from '../../../components/FormInputs/Renderer'; import { useGuidedTour } from '../../../components/GuidedTour/Provider'; import { useNpsSurveySettings } from '../../../components/NpsSurvey'; import { Logo } from '../../../components/UnauthenticatedLogo'; -import { useAuth } from '../../../features/Auth'; +import { useTypedDispatch } from '../../../core/store/hooks'; import { useNotification } from '../../../features/Notifications'; import { useTracking } from '../../../features/Tracking'; import { useAPIErrorHandler } from '../../../hooks/useAPIErrorHandler'; import { LayoutContent, UnauthenticatedLayout } from '../../../layouts/UnauthenticatedLayout'; +import { login } from '../../../reducer'; import { useGetRegistrationInfoQuery, useRegisterAdminMutation, @@ -192,7 +193,7 @@ const Register = ({ hasAdmin }: RegisterProps) => { const [registerAdmin] = useRegisterAdminMutation(); const [registerUser] = useRegisterUserMutation(); - const { setToken } = useAuth('Register', (auth) => auth); + const dispatch = useTypedDispatch(); const handleRegisterAdmin = async ( { news, ...body }: RegisterAdmin.Request['body'] & { news: boolean }, @@ -201,7 +202,7 @@ const Register = ({ hasAdmin }: RegisterProps) => { const res = await registerAdmin(body); if ('data' in res) { - setToken(res.data.token); + dispatch(login({ token: res.data.token })); const { roles } = res.data.user; @@ -247,7 +248,7 @@ const Register = ({ hasAdmin }: RegisterProps) => { const res = await registerUser(body); if ('data' in res) { - setToken(res.data.token); + dispatch(login({ token: res.data.token })); if (news) { // Only enable EE survey if user accepted the newsletter diff --git a/packages/core/admin/admin/src/pages/Auth/components/ResetPassword.tsx b/packages/core/admin/admin/src/pages/Auth/components/ResetPassword.tsx index 1370017384..ba550947be 100644 --- a/packages/core/admin/admin/src/pages/Auth/components/ResetPassword.tsx +++ b/packages/core/admin/admin/src/pages/Auth/components/ResetPassword.tsx @@ -9,13 +9,14 @@ import { ResetPassword } from '../../../../../shared/contracts/authentication'; import { Form } from '../../../components/Form'; import { InputRenderer } from '../../../components/FormInputs/Renderer'; import { Logo } from '../../../components/UnauthenticatedLogo'; -import { useAuth } from '../../../features/Auth'; +import { useTypedDispatch } from '../../../core/store/hooks'; import { useAPIErrorHandler } from '../../../hooks/useAPIErrorHandler'; import { Column, LayoutContent, UnauthenticatedLayout, } from '../../../layouts/UnauthenticatedLayout'; +import { login } from '../../../reducer'; import { useResetPasswordMutation } from '../../../services/auth'; import { isBaseQueryError } from '../../../utils/baseQuery'; import { translatedErrors } from '../../../utils/translatedErrors'; @@ -64,20 +65,19 @@ const RESET_PASSWORD_SCHEMA = yup.object().shape({ const ResetPassword = () => { const { formatMessage } = useIntl(); + const dispatch = useTypedDispatch(); const navigate = useNavigate(); const { search: searchString } = useLocation(); const query = React.useMemo(() => new URLSearchParams(searchString), [searchString]); const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(); - const { setToken } = useAuth('ResetPassword', (auth) => auth); - const [resetPassword, { error }] = useResetPasswordMutation(); const handleSubmit = async (body: ResetPassword.Request['body']) => { const res = await resetPassword(body); if ('data' in res) { - setToken(res.data.token); + dispatch(login({ token: res.data.token })); navigate('/'); } }; diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.tsx index 30b42cfb90..87e786d6f5 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.tsx @@ -15,7 +15,6 @@ import { useIntl } from 'react-intl'; import { styled, DefaultTheme, css } from 'styled-components'; import { Action, SubjectProperty } from '../../../../../../../shared/contracts/permissions'; -import { capitalise } from '../../../../../utils/strings'; import { PermissionsDataManagerContextValue, usePermissionsDataManager, @@ -440,7 +439,7 @@ const SubActionRow = ({ })} title={label} > - {capitalise(label)} + {label} {required && } diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.tsx index dab6b51da5..5f543e86f4 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.tsx @@ -9,6 +9,7 @@ import { useIntl } from 'react-intl'; import { styled, DefaultTheme } from 'styled-components'; import { Action, Subject } from '../../../../../../../shared/contracts/permissions'; +import { capitalise } from '../../../../../utils/strings'; import { PermissionsDataManagerContextValue, usePermissionsDataManager, @@ -121,7 +122,7 @@ const Collapse = ({ const { formatMessage } = useIntl(); const { modifiedData, onChangeParentCheckbox, onChangeSimpleCheckbox } = usePermissionsDataManager(); - const [isConditionMoalOpen, setIsConditionModalOpen] = React.useState(false); + const [isConditionModalOpen, setIsConditionModalOpen] = React.useState(false); // This corresponds to the data related to the CT left checkbox // modifiedData: { collectionTypes: { [ctuid]: {create: {properties: { fields: {f1: true} }, update: {}, ... } } } } @@ -159,7 +160,7 @@ const Collapse = ({ { setIsConditionModalOpen((prev) => !prev); }} diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.tsx index ebe4365182..2fdca75b8b 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.tsx @@ -144,7 +144,7 @@ const SubCategory = ({ }: SubCategoryProps) => { const { modifiedData, onChangeParentCheckbox, onChangeSimpleCheckbox } = usePermissionsDataManager(); - const [isConditionMoalOpen, setIsConditionModalOpen] = React.useState(false); + const [isConditionModalOpen, setIsConditionModalOpen] = React.useState(false); const { formatMessage } = useIntl(); const mainData = get(modifiedData, pathToData, {}); @@ -250,7 +250,7 @@ const SubCategory = ({ })} { setIsConditionModalOpen((prev) => !prev); }} diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RowLabelWithCheckbox.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RowLabelWithCheckbox.tsx index 30a67350ca..4e59f93ff2 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RowLabelWithCheckbox.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/RowLabelWithCheckbox.tsx @@ -3,7 +3,6 @@ import * as React from 'react'; import { Checkbox, Box, Flex, Typography } from '@strapi/design-system'; import { useIntl } from 'react-intl'; -import { capitalise } from '../../../../../utils/strings'; import { PermissionsDataManagerContextValue } from '../hooks/usePermissionsDataManager'; import { firstRowWidth } from '../utils/constants'; diff --git a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/tests/Permissions.test.tsx b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/tests/Permissions.test.tsx index f25198216f..c8208d6e62 100644 --- a/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/tests/Permissions.test.tsx +++ b/packages/core/admin/admin/src/pages/Settings/pages/Roles/components/tests/Permissions.test.tsx @@ -35,7 +35,7 @@ describe('Permissions', () => { COLLECTION_TYPES.forEach((type) => expect( - screen.getByRole('checkbox', { name: `Select all ${type} permissions` }) + screen.getByRole('checkbox', { name: `Select all ${capitalise(type)} permissions` }) ).toBeInTheDocument() ); @@ -73,7 +73,7 @@ describe('Permissions', () => { }); }); - await user.click(screen.getByRole('button', { name: 'Repeat_req_min' })); + await user.click(screen.getByRole('button', { name: 'repeat_req_min' })); COLUMN_HEADERS.filter((head) => head !== 'Publish' && head !== 'Delete').forEach((head) => { expect( diff --git a/packages/core/admin/admin/src/reducer.ts b/packages/core/admin/admin/src/reducer.ts index b97880f8d5..3cf2d3b1ed 100644 --- a/packages/core/admin/admin/src/reducer.ts +++ b/packages/core/admin/admin/src/reducer.ts @@ -16,11 +16,28 @@ interface AppState { currentTheme: ThemeName; availableThemes: string[]; }; + token?: string | null; } +const STORAGE_KEYS = { + TOKEN: 'jwtToken', + USER: 'userInfo', +}; + const THEME_LOCAL_STORAGE_KEY = 'STRAPI_THEME'; const LANGUAGE_LOCAL_STORAGE_KEY = 'strapi-admin-language'; +export const getStoredToken = (): string | null => { + const token = + localStorage.getItem(STORAGE_KEYS.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS.TOKEN); + + if (typeof token === 'string') { + return JSON.parse(token); + } + + return null; +}; + const adminSlice = createSlice({ name: 'admin', initialState: () => { @@ -34,6 +51,7 @@ const adminSlice = createSlice({ availableThemes: [], currentTheme: localStorage.getItem(THEME_LOCAL_STORAGE_KEY) || 'system', }, + token: null, } as AppState; }, reducers: { @@ -50,19 +68,34 @@ const adminSlice = createSlice({ window.localStorage.setItem(LANGUAGE_LOCAL_STORAGE_KEY, action.payload); document.documentElement.setAttribute('lang', action.payload); }, + setToken(state, action: PayloadAction) { + state.token = action.payload; + }, + login(state, action: PayloadAction<{ token: string; persist?: boolean }>) { + const { token, persist } = action.payload; + + if (!persist) { + window.sessionStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token)); + } else { + window.localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token)); + } + + state.token = token; + }, + logout(state) { + state.token = null; + localStorage.removeItem(STORAGE_KEYS.TOKEN); + sessionStorage.removeItem(STORAGE_KEYS.TOKEN); + sessionStorage.removeItem(STORAGE_KEYS.TOKEN); + sessionStorage.removeItem(STORAGE_KEYS.USER); + }, }, }); const reducer = adminSlice.reducer; -const { setAppTheme, setAvailableThemes, setLocale } = adminSlice.actions; +export const { setAppTheme, setAvailableThemes, setLocale, setToken, logout, login } = + adminSlice.actions; -export { - reducer, - setAppTheme, - setAvailableThemes, - setLocale, - THEME_LOCAL_STORAGE_KEY, - LANGUAGE_LOCAL_STORAGE_KEY, -}; +export { reducer, THEME_LOCAL_STORAGE_KEY, LANGUAGE_LOCAL_STORAGE_KEY }; export type { AppState, ThemeName }; diff --git a/packages/core/admin/admin/src/tests/reducer.test.ts b/packages/core/admin/admin/src/tests/reducer.test.ts index eb4f057bfb..200109506e 100644 --- a/packages/core/admin/admin/src/tests/reducer.test.ts +++ b/packages/core/admin/admin/src/tests/reducer.test.ts @@ -23,6 +23,7 @@ describe('admin_app reducer', () => { "availableThemes": [], "currentTheme": "system", }, + "token": null, } `); }); @@ -42,6 +43,7 @@ describe('admin_app reducer', () => { "availableThemes": [], "currentTheme": "dark", }, + "token": null, } `); }); @@ -63,6 +65,7 @@ describe('admin_app reducer', () => { ], "currentTheme": "system", }, + "token": null, } `); }); @@ -83,6 +86,7 @@ describe('admin_app reducer', () => { "availableThemes": [], "currentTheme": "system", }, + "token": null, } `); }); diff --git a/packages/core/admin/admin/tests/store.ts b/packages/core/admin/admin/tests/store.ts index 6a8bf9ca1b..3ad1438cb5 100644 --- a/packages/core/admin/admin/tests/store.ts +++ b/packages/core/admin/admin/tests/store.ts @@ -1,10 +1,12 @@ import { fixtures } from '@strapi/admin-test-utils'; +import { getStoredToken } from '../src/reducer'; + /** * This is for the redux store in `utils`. * The more we adopt it, the bigger it will get – which is okay. */ -const initialState = { +const initialState = () => ({ admin_app: { language: { locale: 'en', @@ -15,7 +17,8 @@ const initialState = { availableThemes: [], currentTheme: 'light', }, + token: getStoredToken(), }, -}; +}); export { initialState }; diff --git a/packages/core/admin/admin/tests/utils.tsx b/packages/core/admin/admin/tests/utils.tsx index 2fb4b57e4b..8674e42716 100644 --- a/packages/core/admin/admin/tests/utils.tsx +++ b/packages/core/admin/admin/tests/utils.tsx @@ -51,8 +51,8 @@ interface ProvidersProps { permissions?: Permission[] | ((defaultPermissions: Permission[]) => Permission[] | undefined); } -const defaultTestStoreConfig = { - preloadedState: initialState, +const defaultTestStoreConfig = () => ({ + preloadedState: initialState(), reducer: { [adminApi.reducerPath]: adminApi.reducer, admin_app: appReducer, @@ -66,7 +66,7 @@ const defaultTestStoreConfig = { }), adminApi.middleware, ], -}; +}); const DEFAULT_PERMISSIONS = [ ...fixtures.permissions.allPermissions, @@ -90,7 +90,7 @@ const Providers = ({ children, initialEntries, storeConfig, permissions = [] }: }); const store = configureStore({ - ...defaultTestStoreConfig, + ...defaultTestStoreConfig(), ...storeConfig, }); diff --git a/packages/core/admin/ee/admin/src/pages/AuthResponse.tsx b/packages/core/admin/ee/admin/src/pages/AuthResponse.tsx index 0aedfdb87b..215a52b44e 100644 --- a/packages/core/admin/ee/admin/src/pages/AuthResponse.tsx +++ b/packages/core/admin/ee/admin/src/pages/AuthResponse.tsx @@ -4,13 +4,15 @@ import { useIntl } from 'react-intl'; import { useNavigate, useMatch } from 'react-router-dom'; import { Page } from '../../../../admin/src/components/PageHelpers'; -import { useAuth } from '../../../../admin/src/features/Auth'; +import { useTypedDispatch } from '../../../../admin/src/core/store/hooks'; +import { login } from '../../../../admin/src/reducer'; import { getCookieValue, deleteCookie } from '../utils/cookies'; const AuthResponse = () => { const match = useMatch('/auth/login/:authResponse'); const { formatMessage } = useIntl(); const navigate = useNavigate(); + const dispatch = useTypedDispatch(); const redirectToOops = React.useCallback(() => { navigate({ @@ -24,8 +26,6 @@ const AuthResponse = () => { }); }, [navigate, formatMessage]); - const { setToken } = useAuth('AuthResponse', (auth) => auth); - React.useEffect(() => { if (match?.params.authResponse === 'error') { redirectToOops(); @@ -35,7 +35,11 @@ const AuthResponse = () => { const jwtToken = getCookieValue('jwtToken'); if (jwtToken) { - setToken(jwtToken); + dispatch( + login({ + token: jwtToken, + }) + ); deleteCookie('jwtToken'); @@ -44,7 +48,7 @@ const AuthResponse = () => { redirectToOops(); } } - }, [match, redirectToOops, setToken, navigate]); + }, [dispatch, match, redirectToOops, navigate]); return ; }; diff --git a/packages/core/content-manager/admin/tests/utils.tsx b/packages/core/content-manager/admin/tests/utils.tsx index 44138672b9..7440936b69 100644 --- a/packages/core/content-manager/admin/tests/utils.tsx +++ b/packages/core/content-manager/admin/tests/utils.tsx @@ -16,15 +16,17 @@ import { import { reducer } from '../src/modules/reducers'; -const storeConfig: ConfigureStoreOptions = { - preloadedState: defaultTestStoreConfig.preloadedState, - reducer: { - ...defaultTestStoreConfig.reducer, - 'content-manager': reducer, - }, - middleware: (getDefaultMiddleware) => [ - ...defaultTestStoreConfig.middleware(getDefaultMiddleware), - ], +const storeConfig = (): ConfigureStoreOptions => { + const testStoreConfig = defaultTestStoreConfig(); + + return { + preloadedState: testStoreConfig.preloadedState, + reducer: { + ...testStoreConfig.reducer, + 'content-manager': reducer, + }, + middleware: (getDefaultMiddleware) => [...testStoreConfig.middleware(getDefaultMiddleware)], + }; }; const render = ( @@ -33,13 +35,13 @@ const render = ( ): ReturnType => renderAdmin(ui, { ...options, - providerOptions: { storeConfig }, + providerOptions: { storeConfig: storeConfig() }, }); const renderHook: typeof renderHookAdmin = (hook, options) => renderHookAdmin(hook, { ...options, - providerOptions: { storeConfig }, + providerOptions: { storeConfig: storeConfig() }, }); export { fireEvent, render, waitFor, act, screen, server, renderHook }; diff --git a/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/RemoveAssetDialog.test.jsx.snap b/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/RemoveAssetDialog.test.jsx.snap index 899beb9c72..d945df0362 100644 --- a/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/RemoveAssetDialog.test.jsx.snap +++ b/packages/core/upload/admin/src/components/EditAssetDialog/tests/__snapshots__/RemoveAssetDialog.test.jsx.snap @@ -22,12 +22,12 @@ exports[`RemoveAssetDialog snapshots the component 1`] = ` padding-inline-start: 24px; } -.c11 { +.c12 { padding-block: 16px; padding-inline: 16px; } -.c14 { +.c15 { background: #4945ff; padding-block: 8px; padding-inline: 8px; @@ -54,7 +54,7 @@ exports[`RemoveAssetDialog snapshots the component 1`] = ` gap: 8px; } -.c12 { +.c13 { align-items: center; display: flex; flex-direction: row; @@ -62,7 +62,7 @@ exports[`RemoveAssetDialog snapshots the component 1`] = ` justify-content: space-between; } -.c15 { +.c16 { align-items: center; display: inline-flex; flex-direction: row; @@ -76,13 +76,13 @@ exports[`RemoveAssetDialog snapshots the component 1`] = ` color: currentcolor; } -.c10 { +.c11 { font-size: 1.4rem; line-height: 1.43; color: currentcolor; } -.c18 { +.c19 { font-size: 1.2rem; line-height: 1.33; font-weight: 600; @@ -100,16 +100,16 @@ exports[`RemoveAssetDialog snapshots the component 1`] = ` width: 1px; } -.c16 { +.c17 { position: relative; outline: none; } -.c16[aria-disabled='true'] { +.c17[aria-disabled='true'] { pointer-events: none; } -.c16:after { +.c17:after { transition-property: all; transition-duration: 0.2s; border-radius: 8px; @@ -122,11 +122,11 @@ exports[`RemoveAssetDialog snapshots the component 1`] = ` border: 2px solid transparent; } -.c16:focus-visible { +.c17:focus-visible { outline: none; } -.c16:focus-visible:after { +.c17:focus-visible:after { border-radius: 8px; content: ''; position: absolute; @@ -137,65 +137,65 @@ exports[`RemoveAssetDialog snapshots the component 1`] = ` border: 2px solid #4945ff; } -.c17 { +.c18 { height: 3.2rem; border: 1px solid #dcdce4; background: #ffffff; color: #32324d; } -.c17 svg { +.c18 svg { height: 1.2rem; } -.c17[aria-disabled='true'] { +.c18[aria-disabled='true'] { border: 1px solid #dcdce4; background: #eaeaef; color: #666687; } -.c17[aria-disabled='true']:active { +.c18[aria-disabled='true']:active { border: 1px solid #dcdce4; background: #eaeaef; color: #666687; } -.c17:hover { +.c18:hover { background-color: #f6f6f9; } -.c17:active { +.c18:active { background-color: #eaeaef; } -.c19 { +.c20 { height: 3.2rem; border: 1px solid #f5c0b8; background: #fcecea; color: #b72b1a; } -.c19 svg { +.c20 svg { height: 1.2rem; } -.c19[aria-disabled='true'] { +.c20[aria-disabled='true'] { border: 1px solid #dcdce4; background: #eaeaef; color: #666687; } -.c19[aria-disabled='true']:active { +.c20[aria-disabled='true']:active { border: 1px solid #dcdce4; background: #eaeaef; color: #666687; } -.c19:hover { +.c20:hover { background-color: #ffffff; } -.c19:active { +.c20:active { background-color: #ffffff; border: 1px solid #d02b20; color: #d02b20; @@ -233,19 +233,28 @@ exports[`RemoveAssetDialog snapshots the component 1`] = ` border-bottom: solid 1px #eaeaef; } -.c13 { +.c14 { border-top: solid 1px #eaeaef; flex: 1; } +.c10 { + width: 24px; + height: 24px; +} + +.c10 path { + fill: #d02b20; +} + @media (prefers-reduced-motion: no-preference) { - .c17 { + .c18 { transition: background-color 120ms cubic-bezier(0.25, 0.46, 0.45, 0.94),color 120ms cubic-bezier(0.25, 0.46, 0.45, 0.94),border-color 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94); } } @media (prefers-reduced-motion: no-preference) { - .c19 { + .c20 { transition: background-color 120ms cubic-bezier(0.25, 0.46, 0.45, 0.94),color 120ms cubic-bezier(0.25, 0.46, 0.45, 0.94),border-color 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94); } } @@ -338,7 +347,8 @@ exports[`RemoveAssetDialog snapshots the component 1`] = ` class="c8 c9" >

Are you sure?