@webiny/api-headless-cms 0.0.0-unstable.df7a8bb475 → 0.0.0-unstable.e2758ee1cf
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/constants.d.ts +2 -1
- package/constants.js +4 -0
- package/constants.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/createEntryData.js +4 -3
- package/crud/contentEntry/entryDataFactories/createEntryData.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js +4 -3
- package/crud/contentEntry/entryDataFactories/createEntryRevisionFromData.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/createPublishEntryData.js +4 -1
- package/crud/contentEntry/entryDataFactories/createPublishEntryData.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/createRepublishEntryData.js +4 -1
- package/crud/contentEntry/entryDataFactories/createRepublishEntryData.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/createUnpublishEntryData.js +2 -1
- package/crud/contentEntry/entryDataFactories/createUnpublishEntryData.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/createUpdateEntryData.js +4 -3
- package/crud/contentEntry/entryDataFactories/createUpdateEntryData.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/system.d.ts +10 -0
- package/crud/contentEntry/entryDataFactories/system.js +14 -0
- package/crud/contentEntry/entryDataFactories/system.js.map +1 -0
- package/crud/contentEntry/searchableFields.js +6 -2
- package/crud/contentEntry/searchableFields.js.map +1 -1
- package/crud/contentModel/validation.d.ts +9 -9
- package/crud/contentModel/validation.js +3 -3
- package/crud/contentModel/validation.js.map +1 -1
- package/domain/contentModel/errors.d.ts +1 -1
- package/domain/contentModel/errors.js.map +1 -1
- package/domain/contentModel/schemas.d.ts +126 -8
- package/domain/contentModel/schemas.js +12 -13
- package/domain/contentModel/schemas.js.map +1 -1
- package/export/graphql/index.js +1 -1
- package/export/graphql/index.js.map +1 -1
- package/exports/api/cms/model.d.ts +1 -0
- package/exports/api/cms/model.js.map +1 -1
- package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.d.ts +2 -2
- package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.js +3 -4
- package/features/contentEntry/GetUniqueFieldValues/GetUniqueFieldValuesUseCase.js.map +1 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js +4 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +12 -3
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
- package/features/contentModel/UpdateModel/UpdateModelRepository.js +8 -2
- package/features/contentModel/UpdateModel/UpdateModelRepository.js.map +1 -1
- package/features/contentModel/UpdateModel/UpdateModelUseCase.js +4 -1
- package/features/contentModel/UpdateModel/UpdateModelUseCase.js.map +1 -1
- package/features/modelBuilder/feature.js +6 -0
- package/features/modelBuilder/feature.js.map +1 -1
- package/features/modelBuilder/fields/BaseFieldBuilder.d.ts +36 -0
- package/features/modelBuilder/fields/BaseFieldBuilder.js +41 -0
- package/features/modelBuilder/fields/BaseFieldBuilder.js.map +1 -0
- package/features/modelBuilder/fields/DataFieldBuilder.d.ts +228 -0
- package/features/modelBuilder/fields/DataFieldBuilder.js +219 -0
- package/features/modelBuilder/fields/DataFieldBuilder.js.map +1 -0
- package/features/modelBuilder/fields/DynamicZoneFieldType.d.ts +2 -2
- package/features/modelBuilder/fields/DynamicZoneFieldType.js +10 -3
- package/features/modelBuilder/fields/DynamicZoneFieldType.js.map +1 -1
- package/features/modelBuilder/fields/FieldBuilder.d.ts +5 -50
- package/features/modelBuilder/fields/FieldBuilder.js +3 -165
- package/features/modelBuilder/fields/FieldBuilder.js.map +1 -1
- package/features/modelBuilder/fields/FieldBuilderRegistry.js +11 -1
- package/features/modelBuilder/fields/FieldBuilderRegistry.js.map +1 -1
- package/features/modelBuilder/fields/LayoutFieldBuilder.d.ts +7 -0
- package/features/modelBuilder/fields/LayoutFieldBuilder.js +9 -0
- package/features/modelBuilder/fields/LayoutFieldBuilder.js.map +1 -0
- package/features/modelBuilder/fields/ObjectFieldType.d.ts +4 -3
- package/features/modelBuilder/fields/ObjectFieldType.js +19 -4
- package/features/modelBuilder/fields/ObjectFieldType.js.map +1 -1
- package/features/modelBuilder/fields/UiAlertFieldType.d.ts +19 -0
- package/features/modelBuilder/fields/UiAlertFieldType.js +36 -0
- package/features/modelBuilder/fields/UiAlertFieldType.js.map +1 -0
- package/features/modelBuilder/fields/UiSeparatorFieldType.d.ts +17 -0
- package/features/modelBuilder/fields/UiSeparatorFieldType.js +31 -0
- package/features/modelBuilder/fields/UiSeparatorFieldType.js.map +1 -0
- package/features/modelBuilder/fields/UiTabsFieldType.d.ts +28 -0
- package/features/modelBuilder/fields/UiTabsFieldType.js +75 -0
- package/features/modelBuilder/fields/UiTabsFieldType.js.map +1 -0
- package/features/modelBuilder/fields/abstractions.d.ts +2 -2
- package/features/modelBuilder/fields/abstractions.js.map +1 -1
- package/features/modelBuilder/index.d.ts +3 -0
- package/features/modelBuilder/index.js +3 -0
- package/features/modelBuilder/index.js.map +1 -1
- package/features/modelBuilder/models/BaseModelBuilder.d.ts +9 -4
- package/features/modelBuilder/models/BaseModelBuilder.js +19 -0
- package/features/modelBuilder/models/BaseModelBuilder.js.map +1 -1
- package/features/modelBuilder/models/PrivateModelBuilder.js +4 -2
- package/features/modelBuilder/models/PrivateModelBuilder.js.map +1 -1
- package/features/modelBuilder/models/PublicModelBuilder.js +16 -4
- package/features/modelBuilder/models/PublicModelBuilder.js.map +1 -1
- package/graphql/index.js +2 -1
- package/graphql/index.js.map +1 -1
- package/graphql/schema/baseSchema.js +17 -15
- package/graphql/schema/baseSchema.js.map +1 -1
- package/graphql/schema/cms/createEntryResolver.d.ts +10 -0
- package/graphql/schema/cms/createEntryResolver.js +56 -0
- package/graphql/schema/cms/createEntryResolver.js.map +1 -0
- package/graphql/schema/cms/deleteEntryResolver.d.ts +10 -0
- package/graphql/schema/cms/deleteEntryResolver.js +56 -0
- package/graphql/schema/cms/deleteEntryResolver.js.map +1 -0
- package/graphql/schema/cms/getEntryResolver.d.ts +11 -0
- package/graphql/schema/cms/getEntryResolver.js +58 -0
- package/graphql/schema/cms/getEntryResolver.js.map +1 -0
- package/graphql/schema/cms/helpers/buildFieldsSelection.d.ts +23 -0
- package/graphql/schema/cms/helpers/buildFieldsSelection.js +79 -0
- package/graphql/schema/cms/helpers/buildFieldsSelection.js.map +1 -0
- package/graphql/schema/cms/helpers/getErrorMessage.d.ts +4 -0
- package/graphql/schema/cms/helpers/getErrorMessage.js +14 -0
- package/graphql/schema/cms/helpers/getErrorMessage.js.map +1 -0
- package/graphql/schema/cms/helpers/getModel.d.ts +6 -0
- package/graphql/schema/cms/helpers/getModel.js +12 -0
- package/graphql/schema/cms/helpers/getModel.js.map +1 -0
- package/graphql/schema/cms/helpers/index.d.ts +5 -0
- package/graphql/schema/cms/helpers/index.js +7 -0
- package/graphql/schema/cms/helpers/index.js.map +1 -0
- package/graphql/schema/cms/helpers/transformSortToArray.d.ts +18 -0
- package/graphql/schema/cms/helpers/transformSortToArray.js +38 -0
- package/graphql/schema/cms/helpers/transformSortToArray.js.map +1 -0
- package/graphql/schema/cms/helpers/transformWhereToNested.d.ts +17 -0
- package/graphql/schema/cms/helpers/transformWhereToNested.js +54 -0
- package/graphql/schema/cms/helpers/transformWhereToNested.js.map +1 -0
- package/graphql/schema/cms/helpers.d.ts +5 -0
- package/graphql/schema/cms/helpers.js +7 -0
- package/graphql/schema/cms/helpers.js.map +1 -0
- package/graphql/schema/cms/index.d.ts +2 -0
- package/graphql/schema/cms/index.js +26 -0
- package/graphql/schema/cms/index.js.map +1 -0
- package/graphql/schema/cms/listEntriesResolver.d.ts +14 -0
- package/graphql/schema/cms/listEntriesResolver.js +97 -0
- package/graphql/schema/cms/listEntriesResolver.js.map +1 -0
- package/graphql/schema/cms/publishEntryResolver.d.ts +10 -0
- package/graphql/schema/cms/publishEntryResolver.js +56 -0
- package/graphql/schema/cms/publishEntryResolver.js.map +1 -0
- package/graphql/schema/cms/resolvers/createEntry.d.ts +8 -0
- package/graphql/schema/cms/resolvers/createEntry.js +17 -0
- package/graphql/schema/cms/resolvers/createEntry.js.map +1 -0
- package/graphql/schema/cms/resolvers/deleteEntryRevision.d.ts +8 -0
- package/graphql/schema/cms/resolvers/deleteEntryRevision.js +17 -0
- package/graphql/schema/cms/resolvers/deleteEntryRevision.js.map +1 -0
- package/graphql/schema/cms/resolvers/getEntry.d.ts +8 -0
- package/graphql/schema/cms/resolvers/getEntry.js +17 -0
- package/graphql/schema/cms/resolvers/getEntry.js.map +1 -0
- package/graphql/schema/cms/resolvers/index.d.ts +9 -0
- package/graphql/schema/cms/resolvers/index.js +11 -0
- package/graphql/schema/cms/resolvers/index.js.map +1 -0
- package/graphql/schema/cms/resolvers/listEntries.d.ts +8 -0
- package/graphql/schema/cms/resolvers/listEntries.js +17 -0
- package/graphql/schema/cms/resolvers/listEntries.js.map +1 -0
- package/graphql/schema/cms/resolvers/mutationCms.d.ts +8 -0
- package/graphql/schema/cms/resolvers/mutationCms.js +24 -0
- package/graphql/schema/cms/resolvers/mutationCms.js.map +1 -0
- package/graphql/schema/cms/resolvers/publishEntryRevision.d.ts +8 -0
- package/graphql/schema/cms/resolvers/publishEntryRevision.js +17 -0
- package/graphql/schema/cms/resolvers/publishEntryRevision.js.map +1 -0
- package/graphql/schema/cms/resolvers/queryCms.d.ts +8 -0
- package/graphql/schema/cms/resolvers/queryCms.js +23 -0
- package/graphql/schema/cms/resolvers/queryCms.js.map +1 -0
- package/graphql/schema/cms/resolvers/unpublishEntryRevision.d.ts +8 -0
- package/graphql/schema/cms/resolvers/unpublishEntryRevision.js +17 -0
- package/graphql/schema/cms/resolvers/unpublishEntryRevision.js.map +1 -0
- package/graphql/schema/cms/resolvers/updateEntryRevision.d.ts +8 -0
- package/graphql/schema/cms/resolvers/updateEntryRevision.js +17 -0
- package/graphql/schema/cms/resolvers/updateEntryRevision.js.map +1 -0
- package/graphql/schema/cms/typeDefs/index.d.ts +3 -0
- package/graphql/schema/cms/typeDefs/index.js +5 -0
- package/graphql/schema/cms/typeDefs/index.js.map +1 -0
- package/graphql/schema/cms/typeDefs/mutation.d.ts +8 -0
- package/graphql/schema/cms/typeDefs/mutation.js +42 -0
- package/graphql/schema/cms/typeDefs/mutation.js.map +1 -0
- package/graphql/schema/cms/typeDefs/query.d.ts +8 -0
- package/graphql/schema/cms/typeDefs/query.js +35 -0
- package/graphql/schema/cms/typeDefs/query.js.map +1 -0
- package/graphql/schema/cms/typeDefs/responses.d.ts +8 -0
- package/graphql/schema/cms/typeDefs/responses.js +35 -0
- package/graphql/schema/cms/typeDefs/responses.js.map +1 -0
- package/graphql/schema/cms/unpublishEntryResolver.d.ts +10 -0
- package/graphql/schema/cms/unpublishEntryResolver.js +56 -0
- package/graphql/schema/cms/unpublishEntryResolver.js.map +1 -0
- package/graphql/schema/cms/updateEntryResolver.d.ts +11 -0
- package/graphql/schema/cms/updateEntryResolver.js +58 -0
- package/graphql/schema/cms/updateEntryResolver.js.map +1 -0
- package/graphql/schema/contentModels.js +21 -3
- package/graphql/schema/contentModels.js.map +1 -1
- package/graphql/schema/createManageSDL.js +4 -2
- package/graphql/schema/createManageSDL.js.map +1 -1
- package/graphqlFields/index.js.map +1 -1
- package/package.json +24 -23
- package/plugins/CmsModelPlugin.js +19 -4
- package/plugins/CmsModelPlugin.js.map +1 -1
- package/types/fields/objectField.d.ts +2 -0
- package/types/fields/objectField.js.map +1 -1
- package/types/model.d.ts +32 -3
- package/types/model.js.map +1 -1
- package/types/modelField.d.ts +19 -3
- package/types/modelField.js.map +1 -1
- package/types/types.d.ts +12 -9
- package/types/types.js.map +1 -1
- package/utils/createModelField.js +4 -2
- package/utils/createModelField.js.map +1 -1
- package/crud/contentEntry/entryDataFactories/state.d.ts +0 -10
- package/crud/contentEntry/entryDataFactories/state.js +0 -16
- package/crud/contentEntry/entryDataFactories/state.js.map +0 -1
- package/crud/contentModel/validateModel.d.ts +0 -9
- package/crud/contentModel/validateModel.js +0 -21
- package/crud/contentModel/validateModel.js.map +0 -1
- package/crud/contentModel/validateModelFields.d.ts +0 -9
- package/crud/contentModel/validateModelFields.js +0 -267
- package/crud/contentModel/validateModelFields.js.map +0 -1
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { getModel, getErrorMessage } from "./helpers.js";
|
|
2
|
+
export const createDeleteEntryRevisionResolver = () => {
|
|
3
|
+
return async ({
|
|
4
|
+
args,
|
|
5
|
+
context
|
|
6
|
+
}) => {
|
|
7
|
+
const {
|
|
8
|
+
modelId,
|
|
9
|
+
revisionId,
|
|
10
|
+
permanent = false
|
|
11
|
+
} = args;
|
|
12
|
+
try {
|
|
13
|
+
const model = await getModel(context, modelId);
|
|
14
|
+
|
|
15
|
+
// Use manage API for deleting entries.
|
|
16
|
+
const apiType = "manage";
|
|
17
|
+
const executeSchema = await context.cms.getExecutableSchema(apiType);
|
|
18
|
+
const query = /* GraphQL */`
|
|
19
|
+
mutation Delete${model.singularApiName}($revisionId: ID!, $options: CmsDeleteEntryOptions) {
|
|
20
|
+
delete${model.singularApiName}(revision: $revisionId, options: $options) {
|
|
21
|
+
data
|
|
22
|
+
error {
|
|
23
|
+
message
|
|
24
|
+
code
|
|
25
|
+
data
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
`;
|
|
30
|
+
const result = await executeSchema({
|
|
31
|
+
query,
|
|
32
|
+
variables: {
|
|
33
|
+
revisionId,
|
|
34
|
+
options: {
|
|
35
|
+
permanently: permanent
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
const operationName = `delete${model.singularApiName}`;
|
|
40
|
+
return result.data?.[operationName] || {
|
|
41
|
+
data: false,
|
|
42
|
+
error: null
|
|
43
|
+
};
|
|
44
|
+
} catch (error) {
|
|
45
|
+
return {
|
|
46
|
+
data: false,
|
|
47
|
+
error: {
|
|
48
|
+
message: getErrorMessage(error, "Failed to delete entry"),
|
|
49
|
+
code: "DELETE_ENTRY_ERROR"
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=deleteEntryResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getModel","getErrorMessage","createDeleteEntryRevisionResolver","args","context","modelId","revisionId","permanent","model","apiType","executeSchema","cms","getExecutableSchema","query","singularApiName","result","variables","options","permanently","operationName","data","error","message","code"],"sources":["deleteEntryResolver.ts"],"sourcesContent":["import type { CmsContext } from \"~/types/index.js\";\nimport type { ApiEndpoint } from \"~/types/index.js\";\nimport type { ExecutionResult } from \"graphql\";\nimport { getModel, getErrorMessage } from \"./helpers.js\";\n\nexport interface DeleteEntryRevisionArgs {\n modelId: string;\n revisionId: string;\n permanent?: boolean;\n}\n\nexport const createDeleteEntryRevisionResolver = () => {\n return async ({ args, context }: { args: DeleteEntryRevisionArgs; context: CmsContext }) => {\n const { modelId, revisionId, permanent = false } = args;\n\n try {\n const model = await getModel(context, modelId);\n\n // Use manage API for deleting entries.\n const apiType: ApiEndpoint = \"manage\";\n const executeSchema = await context.cms.getExecutableSchema(apiType);\n\n const query = /* GraphQL */ `\n mutation Delete${model.singularApiName}($revisionId: ID!, $options: CmsDeleteEntryOptions) {\n delete${model.singularApiName}(revision: $revisionId, options: $options) {\n data\n error {\n message\n code\n data\n }\n }\n }\n `;\n\n const result = (await executeSchema({\n query,\n variables: {\n revisionId,\n options: { permanently: permanent }\n }\n })) as ExecutionResult;\n\n const operationName = `delete${model.singularApiName}`;\n return result.data?.[operationName] || { data: false, error: null };\n } catch (error) {\n return {\n data: false,\n error: {\n message: getErrorMessage(error, \"Failed to delete entry\"),\n code: \"DELETE_ENTRY_ERROR\"\n }\n };\n }\n };\n};\n"],"mappings":"AAGA,SAASA,QAAQ,EAAEC,eAAe;AAQlC,OAAO,MAAMC,iCAAiC,GAAGA,CAAA,KAAM;EACnD,OAAO,OAAO;IAAEC,IAAI;IAAEC;EAAgE,CAAC,KAAK;IACxF,MAAM;MAAEC,OAAO;MAAEC,UAAU;MAAEC,SAAS,GAAG;IAAM,CAAC,GAAGJ,IAAI;IAEvD,IAAI;MACA,MAAMK,KAAK,GAAG,MAAMR,QAAQ,CAACI,OAAO,EAAEC,OAAO,CAAC;;MAE9C;MACA,MAAMI,OAAoB,GAAG,QAAQ;MACrC,MAAMC,aAAa,GAAG,MAAMN,OAAO,CAACO,GAAG,CAACC,mBAAmB,CAACH,OAAO,CAAC;MAEpE,MAAMI,KAAK,GAAG,aAAc;AACxC,iCAAiCL,KAAK,CAACM,eAAe;AACtD,4BAA4BN,KAAK,CAACM,eAAe;AACjD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;MAED,MAAMC,MAAM,GAAI,MAAML,aAAa,CAAC;QAChCG,KAAK;QACLG,SAAS,EAAE;UACPV,UAAU;UACVW,OAAO,EAAE;YAAEC,WAAW,EAAEX;UAAU;QACtC;MACJ,CAAC,CAAqB;MAEtB,MAAMY,aAAa,GAAG,SAASX,KAAK,CAACM,eAAe,EAAE;MACtD,OAAOC,MAAM,CAACK,IAAI,GAAGD,aAAa,CAAC,IAAI;QAAEC,IAAI,EAAE,KAAK;QAAEC,KAAK,EAAE;MAAK,CAAC;IACvE,CAAC,CAAC,OAAOA,KAAK,EAAE;MACZ,OAAO;QACHD,IAAI,EAAE,KAAK;QACXC,KAAK,EAAE;UACHC,OAAO,EAAErB,eAAe,CAACoB,KAAK,EAAE,wBAAwB,CAAC;UACzDE,IAAI,EAAE;QACV;MACJ,CAAC;IACL;EACJ,CAAC;AACL,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CmsContext } from "../../../types/index.js";
|
|
2
|
+
export interface GetEntryArgs {
|
|
3
|
+
modelId: string;
|
|
4
|
+
where: Record<string, unknown>;
|
|
5
|
+
fields: string[];
|
|
6
|
+
preview?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const createGetEntryResolver: () => ({ args, context }: {
|
|
9
|
+
args: GetEntryArgs;
|
|
10
|
+
context: CmsContext;
|
|
11
|
+
}) => Promise<{}>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getModel, getErrorMessage, buildFieldsSelection } from "./helpers.js";
|
|
2
|
+
export const createGetEntryResolver = () => {
|
|
3
|
+
return async ({
|
|
4
|
+
args,
|
|
5
|
+
context
|
|
6
|
+
}) => {
|
|
7
|
+
const {
|
|
8
|
+
modelId,
|
|
9
|
+
where,
|
|
10
|
+
fields,
|
|
11
|
+
preview = false
|
|
12
|
+
} = args;
|
|
13
|
+
try {
|
|
14
|
+
const model = await getModel(context, modelId);
|
|
15
|
+
|
|
16
|
+
// Determine which API to use based on the preview flag.
|
|
17
|
+
// preview=true -> preview API, preview=false -> read API
|
|
18
|
+
const apiType = preview ? "preview" : "read";
|
|
19
|
+
const executeSchema = await context.cms.getExecutableSchema(apiType);
|
|
20
|
+
const fieldsSelection = buildFieldsSelection(fields);
|
|
21
|
+
const query = /* GraphQL */`
|
|
22
|
+
query Get${model.singularApiName}($where: ${model.singularApiName}GetWhereInput!) {
|
|
23
|
+
get${model.singularApiName}(where: $where) {
|
|
24
|
+
data {
|
|
25
|
+
${fieldsSelection}
|
|
26
|
+
}
|
|
27
|
+
error {
|
|
28
|
+
message
|
|
29
|
+
code
|
|
30
|
+
data
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
`;
|
|
35
|
+
const result = await executeSchema({
|
|
36
|
+
query,
|
|
37
|
+
variables: {
|
|
38
|
+
where
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
const operationName = `get${model.singularApiName}`;
|
|
42
|
+
return result.data?.[operationName] || {
|
|
43
|
+
data: null,
|
|
44
|
+
error: null
|
|
45
|
+
};
|
|
46
|
+
} catch (error) {
|
|
47
|
+
return {
|
|
48
|
+
data: null,
|
|
49
|
+
error: {
|
|
50
|
+
message: getErrorMessage(error, "Failed to get entry"),
|
|
51
|
+
code: "GET_ENTRY_ERROR"
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=getEntryResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getModel","getErrorMessage","buildFieldsSelection","createGetEntryResolver","args","context","modelId","where","fields","preview","model","apiType","executeSchema","cms","getExecutableSchema","fieldsSelection","query","singularApiName","result","variables","operationName","data","error","message","code"],"sources":["getEntryResolver.ts"],"sourcesContent":["import type { CmsContext } from \"~/types/index.js\";\nimport type { ApiEndpoint } from \"~/types/index.js\";\nimport type { ExecutionResult } from \"graphql\";\nimport { getModel, getErrorMessage, buildFieldsSelection } from \"./helpers.js\";\n\nexport interface GetEntryArgs {\n modelId: string;\n where: Record<string, unknown>;\n fields: string[];\n preview?: boolean;\n}\n\nexport const createGetEntryResolver = () => {\n return async ({ args, context }: { args: GetEntryArgs; context: CmsContext }) => {\n const { modelId, where, fields, preview = false } = args;\n\n try {\n const model = await getModel(context, modelId);\n\n // Determine which API to use based on the preview flag.\n // preview=true -> preview API, preview=false -> read API\n const apiType: ApiEndpoint = preview ? \"preview\" : \"read\";\n const executeSchema = await context.cms.getExecutableSchema(apiType);\n\n const fieldsSelection = buildFieldsSelection(fields);\n\n const query = /* GraphQL */ `\n query Get${model.singularApiName}($where: ${model.singularApiName}GetWhereInput!) {\n get${model.singularApiName}(where: $where) {\n data {\n ${fieldsSelection}\n }\n error {\n message\n code\n data\n }\n }\n }\n `;\n\n const result = (await executeSchema({\n query,\n variables: { where }\n })) as ExecutionResult;\n\n const operationName = `get${model.singularApiName}`;\n return result.data?.[operationName] || { data: null, error: null };\n } catch (error) {\n return {\n data: null,\n error: {\n message: getErrorMessage(error, \"Failed to get entry\"),\n code: \"GET_ENTRY_ERROR\"\n }\n };\n }\n };\n};\n"],"mappings":"AAGA,SAASA,QAAQ,EAAEC,eAAe,EAAEC,oBAAoB;AASxD,OAAO,MAAMC,sBAAsB,GAAGA,CAAA,KAAM;EACxC,OAAO,OAAO;IAAEC,IAAI;IAAEC;EAAqD,CAAC,KAAK;IAC7E,MAAM;MAAEC,OAAO;MAAEC,KAAK;MAAEC,MAAM;MAAEC,OAAO,GAAG;IAAM,CAAC,GAAGL,IAAI;IAExD,IAAI;MACA,MAAMM,KAAK,GAAG,MAAMV,QAAQ,CAACK,OAAO,EAAEC,OAAO,CAAC;;MAE9C;MACA;MACA,MAAMK,OAAoB,GAAGF,OAAO,GAAG,SAAS,GAAG,MAAM;MACzD,MAAMG,aAAa,GAAG,MAAMP,OAAO,CAACQ,GAAG,CAACC,mBAAmB,CAACH,OAAO,CAAC;MAEpE,MAAMI,eAAe,GAAGb,oBAAoB,CAACM,MAAM,CAAC;MAEpD,MAAMQ,KAAK,GAAG,aAAc;AACxC,2BAA2BN,KAAK,CAACO,eAAe,YAAYP,KAAK,CAACO,eAAe;AACjF,yBAAyBP,KAAK,CAACO,eAAe;AAC9C;AACA,8BAA8BF,eAAe;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;MAED,MAAMG,MAAM,GAAI,MAAMN,aAAa,CAAC;QAChCI,KAAK;QACLG,SAAS,EAAE;UAAEZ;QAAM;MACvB,CAAC,CAAqB;MAEtB,MAAMa,aAAa,GAAG,MAAMV,KAAK,CAACO,eAAe,EAAE;MACnD,OAAOC,MAAM,CAACG,IAAI,GAAGD,aAAa,CAAC,IAAI;QAAEC,IAAI,EAAE,IAAI;QAAEC,KAAK,EAAE;MAAK,CAAC;IACtE,CAAC,CAAC,OAAOA,KAAK,EAAE;MACZ,OAAO;QACHD,IAAI,EAAE,IAAI;QACVC,KAAK,EAAE;UACHC,OAAO,EAAEtB,eAAe,CAACqB,KAAK,EAAE,qBAAqB,CAAC;UACtDE,IAAI,EAAE;QACV;MACJ,CAAC;IACL;EACJ,CAAC;AACL,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper to build GraphQL fields selection from fields array.
|
|
3
|
+
* Supports both top-level fields (e.g., "createdOn", "id") and values fields (e.g., "values.author.name").
|
|
4
|
+
* Properly merges nested fields that share common parent paths.
|
|
5
|
+
*
|
|
6
|
+
* @param fields - Optional array of field paths in dot notation
|
|
7
|
+
* @returns GraphQL selection string with proper field nesting
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* buildFieldsSelection(["id", "entryId", "createdOn", "values.name", "values.author.name", "values.author.email"])
|
|
11
|
+
* // Returns:
|
|
12
|
+
* // id
|
|
13
|
+
* // entryId
|
|
14
|
+
* // createdOn
|
|
15
|
+
* // values {
|
|
16
|
+
* // name
|
|
17
|
+
* // author {
|
|
18
|
+
* // name
|
|
19
|
+
* // email
|
|
20
|
+
* // }
|
|
21
|
+
* // }
|
|
22
|
+
*/
|
|
23
|
+
export declare const buildFieldsSelection: (fields?: string[]) => string;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper to build GraphQL fields selection from fields array.
|
|
3
|
+
* Supports both top-level fields (e.g., "createdOn", "id") and values fields (e.g., "values.author.name").
|
|
4
|
+
* Properly merges nested fields that share common parent paths.
|
|
5
|
+
*
|
|
6
|
+
* @param fields - Optional array of field paths in dot notation
|
|
7
|
+
* @returns GraphQL selection string with proper field nesting
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* buildFieldsSelection(["id", "entryId", "createdOn", "values.name", "values.author.name", "values.author.email"])
|
|
11
|
+
* // Returns:
|
|
12
|
+
* // id
|
|
13
|
+
* // entryId
|
|
14
|
+
* // createdOn
|
|
15
|
+
* // values {
|
|
16
|
+
* // name
|
|
17
|
+
* // author {
|
|
18
|
+
* // name
|
|
19
|
+
* // email
|
|
20
|
+
* // }
|
|
21
|
+
* // }
|
|
22
|
+
*/
|
|
23
|
+
export const buildFieldsSelection = fields => {
|
|
24
|
+
if (!fields || fields.length === 0) {
|
|
25
|
+
return `
|
|
26
|
+
id
|
|
27
|
+
entryId
|
|
28
|
+
values
|
|
29
|
+
`;
|
|
30
|
+
}
|
|
31
|
+
const fieldTree = {};
|
|
32
|
+
fields.forEach(field => {
|
|
33
|
+
const parts = field.split(".");
|
|
34
|
+
let current = fieldTree;
|
|
35
|
+
parts.forEach((part, index) => {
|
|
36
|
+
if (current[part] === undefined) {
|
|
37
|
+
// Leaf node (null) or new branch (empty object)
|
|
38
|
+
current[part] = index === parts.length - 1 ? null : {};
|
|
39
|
+
} else if (current[part] === null && index < parts.length - 1) {
|
|
40
|
+
// Convert leaf to branch if we need to traverse deeper
|
|
41
|
+
current[part] = {};
|
|
42
|
+
}
|
|
43
|
+
if (current[part] !== null) {
|
|
44
|
+
current = current[part];
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Recursively converts the field tree into a GraphQL selection string.
|
|
51
|
+
*
|
|
52
|
+
* @param node - The current field tree node to process
|
|
53
|
+
* @param indent - Current indentation level for formatting
|
|
54
|
+
* @returns GraphQL selection string for this node and its children
|
|
55
|
+
*
|
|
56
|
+
* Handles two cases:
|
|
57
|
+
* - Leaf nodes (value === null): Simple field name
|
|
58
|
+
* - Branch nodes (value === object): Field name with nested selection in braces
|
|
59
|
+
*/
|
|
60
|
+
const buildSelection = (node, indent = " ") => {
|
|
61
|
+
const lines = [];
|
|
62
|
+
Object.keys(node).sort().forEach(key => {
|
|
63
|
+
const value = node[key];
|
|
64
|
+
if (value === null) {
|
|
65
|
+
// Leaf field - just the field name
|
|
66
|
+
lines.push(`${indent}${key}`);
|
|
67
|
+
} else {
|
|
68
|
+
// Branch field - field name with nested selection
|
|
69
|
+
lines.push(`${indent}${key} {`);
|
|
70
|
+
lines.push(buildSelection(value, indent + " "));
|
|
71
|
+
lines.push(`${indent}}`);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return lines.join("\n");
|
|
75
|
+
};
|
|
76
|
+
return buildSelection(fieldTree);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=buildFieldsSelection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["buildFieldsSelection","fields","length","fieldTree","forEach","field","parts","split","current","part","index","undefined","buildSelection","node","indent","lines","Object","keys","sort","key","value","push","join"],"sources":["buildFieldsSelection.ts"],"sourcesContent":["/**\n * Helper to build GraphQL fields selection from fields array.\n * Supports both top-level fields (e.g., \"createdOn\", \"id\") and values fields (e.g., \"values.author.name\").\n * Properly merges nested fields that share common parent paths.\n *\n * @param fields - Optional array of field paths in dot notation\n * @returns GraphQL selection string with proper field nesting\n *\n * @example\n * buildFieldsSelection([\"id\", \"entryId\", \"createdOn\", \"values.name\", \"values.author.name\", \"values.author.email\"])\n * // Returns:\n * // id\n * // entryId\n * // createdOn\n * // values {\n * // name\n * // author {\n * // name\n * // email\n * // }\n * // }\n */\nexport const buildFieldsSelection = (fields?: string[]): string => {\n if (!fields || fields.length === 0) {\n return `\n id\n entryId\n values\n `;\n }\n\n interface FieldNode {\n [key: string]: FieldNode | null;\n }\n\n const fieldTree: FieldNode = {};\n\n fields.forEach(field => {\n const parts = field.split(\".\");\n let current = fieldTree;\n\n parts.forEach((part, index) => {\n if (current[part] === undefined) {\n // Leaf node (null) or new branch (empty object)\n current[part] = index === parts.length - 1 ? null : {};\n } else if (current[part] === null && index < parts.length - 1) {\n // Convert leaf to branch if we need to traverse deeper\n current[part] = {};\n }\n if (current[part] !== null) {\n current = current[part] as FieldNode;\n }\n });\n });\n\n /**\n * Recursively converts the field tree into a GraphQL selection string.\n *\n * @param node - The current field tree node to process\n * @param indent - Current indentation level for formatting\n * @returns GraphQL selection string for this node and its children\n *\n * Handles two cases:\n * - Leaf nodes (value === null): Simple field name\n * - Branch nodes (value === object): Field name with nested selection in braces\n */\n const buildSelection = (node: FieldNode, indent: string = \" \"): string => {\n const lines: string[] = [];\n\n Object.keys(node)\n .sort()\n .forEach(key => {\n const value = node[key];\n if (value === null) {\n // Leaf field - just the field name\n lines.push(`${indent}${key}`);\n } else {\n // Branch field - field name with nested selection\n lines.push(`${indent}${key} {`);\n lines.push(buildSelection(value, indent + \" \"));\n lines.push(`${indent}}`);\n }\n });\n\n return lines.join(\"\\n\");\n };\n\n return buildSelection(fieldTree);\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,oBAAoB,GAAIC,MAAiB,IAAa;EAC/D,IAAI,CAACA,MAAM,IAAIA,MAAM,CAACC,MAAM,KAAK,CAAC,EAAE;IAChC,OAAO;AACf;AACA;AACA;AACA,SAAS;EACL;EAMA,MAAMC,SAAoB,GAAG,CAAC,CAAC;EAE/BF,MAAM,CAACG,OAAO,CAACC,KAAK,IAAI;IACpB,MAAMC,KAAK,GAAGD,KAAK,CAACE,KAAK,CAAC,GAAG,CAAC;IAC9B,IAAIC,OAAO,GAAGL,SAAS;IAEvBG,KAAK,CAACF,OAAO,CAAC,CAACK,IAAI,EAAEC,KAAK,KAAK;MAC3B,IAAIF,OAAO,CAACC,IAAI,CAAC,KAAKE,SAAS,EAAE;QAC7B;QACAH,OAAO,CAACC,IAAI,CAAC,GAAGC,KAAK,KAAKJ,KAAK,CAACJ,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;MAC1D,CAAC,MAAM,IAAIM,OAAO,CAACC,IAAI,CAAC,KAAK,IAAI,IAAIC,KAAK,GAAGJ,KAAK,CAACJ,MAAM,GAAG,CAAC,EAAE;QAC3D;QACAM,OAAO,CAACC,IAAI,CAAC,GAAG,CAAC,CAAC;MACtB;MACA,IAAID,OAAO,CAACC,IAAI,CAAC,KAAK,IAAI,EAAE;QACxBD,OAAO,GAAGA,OAAO,CAACC,IAAI,CAAc;MACxC;IACJ,CAAC,CAAC;EACN,CAAC,CAAC;;EAEF;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACI,MAAMG,cAAc,GAAGA,CAACC,IAAe,EAAEC,MAAc,GAAG,UAAU,KAAa;IAC7E,MAAMC,KAAe,GAAG,EAAE;IAE1BC,MAAM,CAACC,IAAI,CAACJ,IAAI,CAAC,CACZK,IAAI,CAAC,CAAC,CACNd,OAAO,CAACe,GAAG,IAAI;MACZ,MAAMC,KAAK,GAAGP,IAAI,CAACM,GAAG,CAAC;MACvB,IAAIC,KAAK,KAAK,IAAI,EAAE;QAChB;QACAL,KAAK,CAACM,IAAI,CAAC,GAAGP,MAAM,GAAGK,GAAG,EAAE,CAAC;MACjC,CAAC,MAAM;QACH;QACAJ,KAAK,CAACM,IAAI,CAAC,GAAGP,MAAM,GAAGK,GAAG,IAAI,CAAC;QAC/BJ,KAAK,CAACM,IAAI,CAACT,cAAc,CAACQ,KAAK,EAAEN,MAAM,GAAG,MAAM,CAAC,CAAC;QAClDC,KAAK,CAACM,IAAI,CAAC,GAAGP,MAAM,GAAG,CAAC;MAC5B;IACJ,CAAC,CAAC;IAEN,OAAOC,KAAK,CAACO,IAAI,CAAC,IAAI,CAAC;EAC3B,CAAC;EAED,OAAOV,cAAc,CAACT,SAAS,CAAC;AACpC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper to get error message from unknown error.
|
|
3
|
+
*/
|
|
4
|
+
export const getErrorMessage = (error, fallback) => {
|
|
5
|
+
if (error instanceof Error) {
|
|
6
|
+
return error.message;
|
|
7
|
+
}
|
|
8
|
+
if (typeof error === "string") {
|
|
9
|
+
return error;
|
|
10
|
+
}
|
|
11
|
+
return fallback;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=getErrorMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getErrorMessage","error","fallback","Error","message"],"sources":["getErrorMessage.ts"],"sourcesContent":["/**\n * Helper to get error message from unknown error.\n */\nexport const getErrorMessage = (error: unknown, fallback: string): string => {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return fallback;\n};\n"],"mappings":"AAAA;AACA;AACA;AACA,OAAO,MAAMA,eAAe,GAAGA,CAACC,KAAc,EAAEC,QAAgB,KAAa;EACzE,IAAID,KAAK,YAAYE,KAAK,EAAE;IACxB,OAAOF,KAAK,CAACG,OAAO;EACxB;EACA,IAAI,OAAOH,KAAK,KAAK,QAAQ,EAAE;IAC3B,OAAOA,KAAK;EAChB;EACA,OAAOC,QAAQ;AACnB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper to get model by modelId.
|
|
3
|
+
*/
|
|
4
|
+
export const getModel = async (context, modelId) => {
|
|
5
|
+
const model = await context.cms.getModel(modelId);
|
|
6
|
+
if (!model) {
|
|
7
|
+
throw new Error(`Model "${modelId}" not found`);
|
|
8
|
+
}
|
|
9
|
+
return model;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=getModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getModel","context","modelId","model","cms","Error"],"sources":["getModel.ts"],"sourcesContent":["import type { CmsContext } from \"~/types/index.js\";\nimport type { CmsModel } from \"~/types/index.js\";\n\n/**\n * Helper to get model by modelId.\n */\nexport const getModel = async (context: CmsContext, modelId: string): Promise<CmsModel> => {\n const model = await context.cms.getModel(modelId);\n if (!model) {\n throw new Error(`Model \"${modelId}\" not found`);\n }\n return model;\n};\n"],"mappings":"AAGA;AACA;AACA;AACA,OAAO,MAAMA,QAAQ,GAAG,MAAAA,CAAOC,OAAmB,EAAEC,OAAe,KAAwB;EACvF,MAAMC,KAAK,GAAG,MAAMF,OAAO,CAACG,GAAG,CAACJ,QAAQ,CAACE,OAAO,CAAC;EACjD,IAAI,CAACC,KAAK,EAAE;IACR,MAAM,IAAIE,KAAK,CAAC,UAAUH,OAAO,aAAa,CAAC;EACnD;EACA,OAAOC,KAAK;AAChB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { getErrorMessage } from "./getErrorMessage.js";
|
|
2
|
+
export { getModel } from "./getModel.js";
|
|
3
|
+
export { transformSortToArray } from "./transformSortToArray.js";
|
|
4
|
+
export { buildFieldsSelection } from "./buildFieldsSelection.js";
|
|
5
|
+
export { transformWhereToNested } from "./transformWhereToNested.js";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { getErrorMessage } from "./getErrorMessage.js";
|
|
2
|
+
export { getModel } from "./getModel.js";
|
|
3
|
+
export { transformSortToArray } from "./transformSortToArray.js";
|
|
4
|
+
export { buildFieldsSelection } from "./buildFieldsSelection.js";
|
|
5
|
+
export { transformWhereToNested } from "./transformWhereToNested.js";
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getErrorMessage","getModel","transformSortToArray","buildFieldsSelection","transformWhereToNested"],"sources":["index.ts"],"sourcesContent":["export { getErrorMessage } from \"./getErrorMessage.js\";\nexport { getModel } from \"./getModel.js\";\nexport { transformSortToArray } from \"./transformSortToArray.js\";\nexport { buildFieldsSelection } from \"./buildFieldsSelection.js\";\nexport { transformWhereToNested } from \"./transformWhereToNested.js\";\n"],"mappings":"AAAA,SAASA,eAAe;AACxB,SAASC,QAAQ;AACjB,SAASC,oBAAoB;AAC7B,SAASC,oBAAoB;AAC7B,SAASC,sBAAsB","ignoreList":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transforms sort parameter to array of strings format expected by GraphQL schema.
|
|
3
|
+
* Handles two input formats:
|
|
4
|
+
* 1. Object format: {createdOn: "desc"} -> ["createdOn_DESC"]
|
|
5
|
+
* 2. Array of strings: ["createdOn_DESC"] -> ["createdOn_DESC"] (pass through)
|
|
6
|
+
*
|
|
7
|
+
* @param sort - Sort parameter (object or array of strings)
|
|
8
|
+
* @returns Array of strings in format ["field_ASC"|"field_DESC"] or undefined if no sort provided
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* transformSortToArray({createdOn: "desc"})
|
|
12
|
+
* // Returns: ["createdOn_DESC"]
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* transformSortToArray(["createdOn_DESC", "name_ASC"])
|
|
16
|
+
* // Returns: ["createdOn_DESC", "name_ASC"]
|
|
17
|
+
*/
|
|
18
|
+
export declare const transformSortToArray: (sort?: Record<string, unknown> | string[]) => string[] | undefined;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transforms sort parameter to array of strings format expected by GraphQL schema.
|
|
3
|
+
* Handles two input formats:
|
|
4
|
+
* 1. Object format: {createdOn: "desc"} -> ["createdOn_DESC"]
|
|
5
|
+
* 2. Array of strings: ["createdOn_DESC"] -> ["createdOn_DESC"] (pass through)
|
|
6
|
+
*
|
|
7
|
+
* @param sort - Sort parameter (object or array of strings)
|
|
8
|
+
* @returns Array of strings in format ["field_ASC"|"field_DESC"] or undefined if no sort provided
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* transformSortToArray({createdOn: "desc"})
|
|
12
|
+
* // Returns: ["createdOn_DESC"]
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* transformSortToArray(["createdOn_DESC", "name_ASC"])
|
|
16
|
+
* // Returns: ["createdOn_DESC", "name_ASC"]
|
|
17
|
+
*/
|
|
18
|
+
export const transformSortToArray = sort => {
|
|
19
|
+
if (!sort) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Handle array of strings format: ["createdOn_DESC", "name_ASC"]
|
|
24
|
+
if (Array.isArray(sort)) {
|
|
25
|
+
return sort.map(item => String(item));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Handle object format: {createdOn: "desc", name: "asc"}
|
|
29
|
+
if (typeof sort === "object") {
|
|
30
|
+
return Object.entries(sort).map(([field, direction]) => {
|
|
31
|
+
const normalizedDirection = String(direction).toUpperCase();
|
|
32
|
+
return `${field}_${normalizedDirection}`;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=transformSortToArray.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["transformSortToArray","sort","undefined","Array","isArray","map","item","String","Object","entries","field","direction","normalizedDirection","toUpperCase"],"sources":["transformSortToArray.ts"],"sourcesContent":["/**\n * Transforms sort parameter to array of strings format expected by GraphQL schema.\n * Handles two input formats:\n * 1. Object format: {createdOn: \"desc\"} -> [\"createdOn_DESC\"]\n * 2. Array of strings: [\"createdOn_DESC\"] -> [\"createdOn_DESC\"] (pass through)\n *\n * @param sort - Sort parameter (object or array of strings)\n * @returns Array of strings in format [\"field_ASC\"|\"field_DESC\"] or undefined if no sort provided\n *\n * @example\n * transformSortToArray({createdOn: \"desc\"})\n * // Returns: [\"createdOn_DESC\"]\n *\n * @example\n * transformSortToArray([\"createdOn_DESC\", \"name_ASC\"])\n * // Returns: [\"createdOn_DESC\", \"name_ASC\"]\n */\nexport const transformSortToArray = (\n sort?: Record<string, unknown> | string[]\n): string[] | undefined => {\n if (!sort) {\n return undefined;\n }\n\n // Handle array of strings format: [\"createdOn_DESC\", \"name_ASC\"]\n if (Array.isArray(sort)) {\n return sort.map(item => String(item));\n }\n\n // Handle object format: {createdOn: \"desc\", name: \"asc\"}\n if (typeof sort === \"object\") {\n return Object.entries(sort).map(([field, direction]) => {\n const normalizedDirection = String(direction).toUpperCase();\n return `${field}_${normalizedDirection}`;\n });\n }\n\n return undefined;\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,oBAAoB,GAC7BC,IAAyC,IAClB;EACvB,IAAI,CAACA,IAAI,EAAE;IACP,OAAOC,SAAS;EACpB;;EAEA;EACA,IAAIC,KAAK,CAACC,OAAO,CAACH,IAAI,CAAC,EAAE;IACrB,OAAOA,IAAI,CAACI,GAAG,CAACC,IAAI,IAAIC,MAAM,CAACD,IAAI,CAAC,CAAC;EACzC;;EAEA;EACA,IAAI,OAAOL,IAAI,KAAK,QAAQ,EAAE;IAC1B,OAAOO,MAAM,CAACC,OAAO,CAACR,IAAI,CAAC,CAACI,GAAG,CAAC,CAAC,CAACK,KAAK,EAAEC,SAAS,CAAC,KAAK;MACpD,MAAMC,mBAAmB,GAAGL,MAAM,CAACI,SAAS,CAAC,CAACE,WAAW,CAAC,CAAC;MAC3D,OAAO,GAAGH,KAAK,IAAIE,mBAAmB,EAAE;IAC5C,CAAC,CAAC;EACN;EAEA,OAAOV,SAAS;AACpB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transforms a flat where object with dot-notation keys into a nested object.
|
|
3
|
+
* Keys without dots are passed through unchanged.
|
|
4
|
+
* Handles logical operators (AND, OR) recursively.
|
|
5
|
+
*
|
|
6
|
+
* @param where - Where clause object potentially containing dot-notation keys
|
|
7
|
+
* @returns Nested where object compatible with the GraphQL ListWhereInput type
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* transformWhereToNested({ "values.name": "Keyboard", id: "abc" })
|
|
11
|
+
* // Returns: { values: { name: "Keyboard" }, id: "abc" }
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* transformWhereToNested({ "values.price_gt": 100, "values.name_contains": "board" })
|
|
15
|
+
* // Returns: { values: { price_gt: 100, name_contains: "board" } }
|
|
16
|
+
*/
|
|
17
|
+
export declare const transformWhereToNested: (where?: Record<string, unknown>) => Record<string, unknown> | undefined;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transforms a flat where object with dot-notation keys into a nested object.
|
|
3
|
+
* Keys without dots are passed through unchanged.
|
|
4
|
+
* Handles logical operators (AND, OR) recursively.
|
|
5
|
+
*
|
|
6
|
+
* @param where - Where clause object potentially containing dot-notation keys
|
|
7
|
+
* @returns Nested where object compatible with the GraphQL ListWhereInput type
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* transformWhereToNested({ "values.name": "Keyboard", id: "abc" })
|
|
11
|
+
* // Returns: { values: { name: "Keyboard" }, id: "abc" }
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* transformWhereToNested({ "values.price_gt": 100, "values.name_contains": "board" })
|
|
15
|
+
* // Returns: { values: { price_gt: 100, name_contains: "board" } }
|
|
16
|
+
*/
|
|
17
|
+
export const transformWhereToNested = where => {
|
|
18
|
+
if (!where) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const result = {};
|
|
22
|
+
for (const [key, value] of Object.entries(where)) {
|
|
23
|
+
// Handle logical operators recursively.
|
|
24
|
+
if (key === "AND" || key === "OR") {
|
|
25
|
+
if (Array.isArray(value)) {
|
|
26
|
+
result[key] = value.map(item => transformWhereToNested(item));
|
|
27
|
+
} else {
|
|
28
|
+
result[key] = value;
|
|
29
|
+
}
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const dotIndex = key.indexOf(".");
|
|
33
|
+
if (dotIndex === -1) {
|
|
34
|
+
// No dot — pass through unchanged.
|
|
35
|
+
result[key] = value;
|
|
36
|
+
} else {
|
|
37
|
+
// Dot-notation key — expand into nested object.
|
|
38
|
+
const head = key.slice(0, dotIndex);
|
|
39
|
+
const tail = key.slice(dotIndex + 1);
|
|
40
|
+
if (result[head] === undefined) {
|
|
41
|
+
result[head] = {};
|
|
42
|
+
}
|
|
43
|
+
const nested = result[head];
|
|
44
|
+
// Recursively expand in case of multiple levels of nesting.
|
|
45
|
+
const expanded = transformWhereToNested({
|
|
46
|
+
[tail]: value
|
|
47
|
+
});
|
|
48
|
+
Object.assign(nested, expanded);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=transformWhereToNested.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["transformWhereToNested","where","undefined","result","key","value","Object","entries","Array","isArray","map","item","dotIndex","indexOf","head","slice","tail","nested","expanded","assign"],"sources":["transformWhereToNested.ts"],"sourcesContent":["/**\n * Transforms a flat where object with dot-notation keys into a nested object.\n * Keys without dots are passed through unchanged.\n * Handles logical operators (AND, OR) recursively.\n *\n * @param where - Where clause object potentially containing dot-notation keys\n * @returns Nested where object compatible with the GraphQL ListWhereInput type\n *\n * @example\n * transformWhereToNested({ \"values.name\": \"Keyboard\", id: \"abc\" })\n * // Returns: { values: { name: \"Keyboard\" }, id: \"abc\" }\n *\n * @example\n * transformWhereToNested({ \"values.price_gt\": 100, \"values.name_contains\": \"board\" })\n * // Returns: { values: { price_gt: 100, name_contains: \"board\" } }\n */\nexport const transformWhereToNested = (\n where?: Record<string, unknown>\n): Record<string, unknown> | undefined => {\n if (!where) {\n return undefined;\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(where)) {\n // Handle logical operators recursively.\n if (key === \"AND\" || key === \"OR\") {\n if (Array.isArray(value)) {\n result[key] = value.map(item =>\n transformWhereToNested(item as Record<string, unknown>)\n );\n } else {\n result[key] = value;\n }\n continue;\n }\n\n const dotIndex = key.indexOf(\".\");\n if (dotIndex === -1) {\n // No dot — pass through unchanged.\n result[key] = value;\n } else {\n // Dot-notation key — expand into nested object.\n const head = key.slice(0, dotIndex);\n const tail = key.slice(dotIndex + 1);\n\n if (result[head] === undefined) {\n result[head] = {};\n }\n\n const nested = result[head] as Record<string, unknown>;\n // Recursively expand in case of multiple levels of nesting.\n const expanded = transformWhereToNested({ [tail]: value }) as Record<string, unknown>;\n Object.assign(nested, expanded);\n }\n }\n\n return result;\n};\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,sBAAsB,GAC/BC,KAA+B,IACO;EACtC,IAAI,CAACA,KAAK,EAAE;IACR,OAAOC,SAAS;EACpB;EAEA,MAAMC,MAA+B,GAAG,CAAC,CAAC;EAE1C,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACN,KAAK,CAAC,EAAE;IAC9C;IACA,IAAIG,GAAG,KAAK,KAAK,IAAIA,GAAG,KAAK,IAAI,EAAE;MAC/B,IAAII,KAAK,CAACC,OAAO,CAACJ,KAAK,CAAC,EAAE;QACtBF,MAAM,CAACC,GAAG,CAAC,GAAGC,KAAK,CAACK,GAAG,CAACC,IAAI,IACxBX,sBAAsB,CAACW,IAA+B,CAC1D,CAAC;MACL,CAAC,MAAM;QACHR,MAAM,CAACC,GAAG,CAAC,GAAGC,KAAK;MACvB;MACA;IACJ;IAEA,MAAMO,QAAQ,GAAGR,GAAG,CAACS,OAAO,CAAC,GAAG,CAAC;IACjC,IAAID,QAAQ,KAAK,CAAC,CAAC,EAAE;MACjB;MACAT,MAAM,CAACC,GAAG,CAAC,GAAGC,KAAK;IACvB,CAAC,MAAM;MACH;MACA,MAAMS,IAAI,GAAGV,GAAG,CAACW,KAAK,CAAC,CAAC,EAAEH,QAAQ,CAAC;MACnC,MAAMI,IAAI,GAAGZ,GAAG,CAACW,KAAK,CAACH,QAAQ,GAAG,CAAC,CAAC;MAEpC,IAAIT,MAAM,CAACW,IAAI,CAAC,KAAKZ,SAAS,EAAE;QAC5BC,MAAM,CAACW,IAAI,CAAC,GAAG,CAAC,CAAC;MACrB;MAEA,MAAMG,MAAM,GAAGd,MAAM,CAACW,IAAI,CAA4B;MACtD;MACA,MAAMI,QAAQ,GAAGlB,sBAAsB,CAAC;QAAE,CAACgB,IAAI,GAAGX;MAAM,CAAC,CAA4B;MACrFC,MAAM,CAACa,MAAM,CAACF,MAAM,EAAEC,QAAQ,CAAC;IACnC;EACJ;EAEA,OAAOf,MAAM;AACjB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { getErrorMessage } from "./helpers/getErrorMessage.js";
|
|
2
|
+
export { getModel } from "./helpers/getModel.js";
|
|
3
|
+
export { transformSortToArray } from "./helpers/transformSortToArray.js";
|
|
4
|
+
export { buildFieldsSelection } from "./helpers/buildFieldsSelection.js";
|
|
5
|
+
export { transformWhereToNested } from "./helpers/transformWhereToNested.js";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { getErrorMessage } from "./helpers/getErrorMessage.js";
|
|
2
|
+
export { getModel } from "./helpers/getModel.js";
|
|
3
|
+
export { transformSortToArray } from "./helpers/transformSortToArray.js";
|
|
4
|
+
export { buildFieldsSelection } from "./helpers/buildFieldsSelection.js";
|
|
5
|
+
export { transformWhereToNested } from "./helpers/transformWhereToNested.js";
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getErrorMessage","getModel","transformSortToArray","buildFieldsSelection","transformWhereToNested"],"sources":["helpers.ts"],"sourcesContent":["export { getErrorMessage } from \"./helpers/getErrorMessage.js\";\nexport { getModel } from \"./helpers/getModel.js\";\nexport { transformSortToArray } from \"./helpers/transformSortToArray.js\";\nexport { buildFieldsSelection } from \"./helpers/buildFieldsSelection.js\";\nexport { transformWhereToNested } from \"./helpers/transformWhereToNested.js\";\n"],"mappings":"AAAA,SAASA,eAAe;AACxB,SAASC,QAAQ;AACjB,SAASC,oBAAoB;AAC7B,SAASC,oBAAoB;AAC7B,SAASC,sBAAsB","ignoreList":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ContextPlugin } from "@webiny/api";
|
|
2
|
+
import { CmsResponseTypeDefsImpl, CmsQueryTypeDefsImpl, CmsMutationTypeDefsImpl } from "./typeDefs/index.js";
|
|
3
|
+
import { QueryCmsResolverImpl, MutationCmsResolverImpl, GetEntryResolverImpl, ListEntriesResolverImpl, CreateEntryResolverImpl, UpdateEntryRevisionResolverImpl, DeleteEntryRevisionResolverImpl, PublishEntryRevisionResolverImpl, UnpublishEntryRevisionResolverImpl } from "./resolvers/index.js";
|
|
4
|
+
export const createCmsSchema = () => {
|
|
5
|
+
const plugin = new ContextPlugin(async context => {
|
|
6
|
+
// Register type definitions.
|
|
7
|
+
context.container.register(CmsResponseTypeDefsImpl);
|
|
8
|
+
context.container.register(CmsQueryTypeDefsImpl);
|
|
9
|
+
context.container.register(CmsMutationTypeDefsImpl);
|
|
10
|
+
|
|
11
|
+
// Register resolvers.
|
|
12
|
+
context.container.register(QueryCmsResolverImpl);
|
|
13
|
+
context.container.register(MutationCmsResolverImpl);
|
|
14
|
+
context.container.register(GetEntryResolverImpl);
|
|
15
|
+
context.container.register(ListEntriesResolverImpl);
|
|
16
|
+
context.container.register(CreateEntryResolverImpl);
|
|
17
|
+
context.container.register(UpdateEntryRevisionResolverImpl);
|
|
18
|
+
context.container.register(DeleteEntryRevisionResolverImpl);
|
|
19
|
+
context.container.register(PublishEntryRevisionResolverImpl);
|
|
20
|
+
context.container.register(UnpublishEntryRevisionResolverImpl);
|
|
21
|
+
});
|
|
22
|
+
plugin.name = "headless-cms.graphql.createCmsSchema";
|
|
23
|
+
return plugin;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ContextPlugin","CmsResponseTypeDefsImpl","CmsQueryTypeDefsImpl","CmsMutationTypeDefsImpl","QueryCmsResolverImpl","MutationCmsResolverImpl","GetEntryResolverImpl","ListEntriesResolverImpl","CreateEntryResolverImpl","UpdateEntryRevisionResolverImpl","DeleteEntryRevisionResolverImpl","PublishEntryRevisionResolverImpl","UnpublishEntryRevisionResolverImpl","createCmsSchema","plugin","context","container","register","name"],"sources":["index.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/api\";\nimport {\n CmsResponseTypeDefsImpl,\n CmsQueryTypeDefsImpl,\n CmsMutationTypeDefsImpl\n} from \"./typeDefs/index.js\";\nimport {\n QueryCmsResolverImpl,\n MutationCmsResolverImpl,\n GetEntryResolverImpl,\n ListEntriesResolverImpl,\n CreateEntryResolverImpl,\n UpdateEntryRevisionResolverImpl,\n DeleteEntryRevisionResolverImpl,\n PublishEntryRevisionResolverImpl,\n UnpublishEntryRevisionResolverImpl\n} from \"./resolvers/index.js\";\n\nexport const createCmsSchema = () => {\n const plugin = new ContextPlugin(async context => {\n // Register type definitions.\n context.container.register(CmsResponseTypeDefsImpl);\n context.container.register(CmsQueryTypeDefsImpl);\n context.container.register(CmsMutationTypeDefsImpl);\n\n // Register resolvers.\n context.container.register(QueryCmsResolverImpl);\n context.container.register(MutationCmsResolverImpl);\n context.container.register(GetEntryResolverImpl);\n context.container.register(ListEntriesResolverImpl);\n context.container.register(CreateEntryResolverImpl);\n context.container.register(UpdateEntryRevisionResolverImpl);\n context.container.register(DeleteEntryRevisionResolverImpl);\n context.container.register(PublishEntryRevisionResolverImpl);\n context.container.register(UnpublishEntryRevisionResolverImpl);\n });\n\n plugin.name = \"headless-cms.graphql.createCmsSchema\";\n\n return plugin;\n};\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,aAAa;AAC3C,SACIC,uBAAuB,EACvBC,oBAAoB,EACpBC,uBAAuB;AAE3B,SACIC,oBAAoB,EACpBC,uBAAuB,EACvBC,oBAAoB,EACpBC,uBAAuB,EACvBC,uBAAuB,EACvBC,+BAA+B,EAC/BC,+BAA+B,EAC/BC,gCAAgC,EAChCC,kCAAkC;AAGtC,OAAO,MAAMC,eAAe,GAAGA,CAAA,KAAM;EACjC,MAAMC,MAAM,GAAG,IAAId,aAAa,CAAC,MAAMe,OAAO,IAAI;IAC9C;IACAA,OAAO,CAACC,SAAS,CAACC,QAAQ,CAAChB,uBAAuB,CAAC;IACnDc,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACf,oBAAoB,CAAC;IAChDa,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACd,uBAAuB,CAAC;;IAEnD;IACAY,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACb,oBAAoB,CAAC;IAChDW,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACZ,uBAAuB,CAAC;IACnDU,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACX,oBAAoB,CAAC;IAChDS,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACV,uBAAuB,CAAC;IACnDQ,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACT,uBAAuB,CAAC;IACnDO,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACR,+BAA+B,CAAC;IAC3DM,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACP,+BAA+B,CAAC;IAC3DK,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACN,gCAAgC,CAAC;IAC5DI,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACL,kCAAkC,CAAC;EAClE,CAAC,CAAC;EAEFE,MAAM,CAACI,IAAI,GAAG,sCAAsC;EAEpD,OAAOJ,MAAM;AACjB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CmsContext } from "../../../types/index.js";
|
|
2
|
+
export interface ListEntriesArgs {
|
|
3
|
+
modelId: string;
|
|
4
|
+
where?: Record<string, unknown>;
|
|
5
|
+
sort?: Record<string, unknown> | string[];
|
|
6
|
+
limit?: number;
|
|
7
|
+
after?: string;
|
|
8
|
+
fields: string[];
|
|
9
|
+
preview?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare const createListEntriesResolver: () => ({ args, context }: {
|
|
12
|
+
args: ListEntriesArgs;
|
|
13
|
+
context: CmsContext;
|
|
14
|
+
}) => Promise<{}>;
|