@webiny/api-headless-cms 5.34.3-beta.0 → 5.34.3-beta.1
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.
|
@@ -28,6 +28,14 @@ var _error = _interopRequireDefault(require("@webiny/error"));
|
|
|
28
28
|
var _codeFrame = _interopRequireDefault(require("code-frame"));
|
|
29
29
|
|
|
30
30
|
// @ts-ignore `code-frame` has no types
|
|
31
|
+
const createRequestBody = body => {
|
|
32
|
+
/**
|
|
33
|
+
* We are trusting that the body payload is correct.
|
|
34
|
+
* The `processRequestBody` will fail if it is not.
|
|
35
|
+
*/
|
|
36
|
+
return typeof body === "string" ? JSON.parse(body) : body;
|
|
37
|
+
};
|
|
38
|
+
|
|
31
39
|
const schemaList = new Map();
|
|
32
40
|
|
|
33
41
|
const generateCacheKey = async args => {
|
|
@@ -80,49 +88,41 @@ const getSchema = async params => {
|
|
|
80
88
|
const tenantId = context.tenancy.getCurrentTenant().id;
|
|
81
89
|
const id = `${tenantId}#${type}#${locale.code}`;
|
|
82
90
|
const cacheKey = await generateCacheKey(params);
|
|
91
|
+
const cachedSchema = schemaList.get(id);
|
|
83
92
|
|
|
84
|
-
if (
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
schemaList.set(id, {
|
|
88
|
-
key: cacheKey,
|
|
89
|
-
schema
|
|
90
|
-
});
|
|
91
|
-
return schema;
|
|
92
|
-
} catch (err) {
|
|
93
|
-
if (!Array.isArray(err.locations)) {
|
|
94
|
-
throw new _error.default((0, _objectSpread2.default)({}, err));
|
|
95
|
-
}
|
|
93
|
+
if ((cachedSchema === null || cachedSchema === void 0 ? void 0 : cachedSchema.key) === cacheKey) {
|
|
94
|
+
return cachedSchema.schema;
|
|
95
|
+
}
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
try {
|
|
98
|
+
const schema = await generateSchema(params);
|
|
99
|
+
schemaList.set(id, {
|
|
100
|
+
key: cacheKey,
|
|
101
|
+
schema
|
|
102
|
+
});
|
|
103
|
+
return schema;
|
|
104
|
+
} catch (err) {
|
|
105
|
+
if (!Array.isArray(err.locations)) {
|
|
98
106
|
throw new _error.default({
|
|
99
|
-
code: "INVALID_GRAPHQL_SCHEMA",
|
|
100
107
|
message: err.message,
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
108
|
+
code: err.code || "INVALID_GRAPHQL_SCHEMA_LOCATIONS",
|
|
109
|
+
data: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, err.data || {}), {}, {
|
|
110
|
+
locations: err.locations
|
|
111
|
+
})
|
|
106
112
|
});
|
|
107
113
|
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Safe to cast because check was done few lines up.
|
|
111
|
-
*/
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const cache = schemaList.get(id);
|
|
115
114
|
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
const [location] = err.locations;
|
|
116
|
+
throw new _error.default({
|
|
117
|
+
code: "INVALID_GRAPHQL_SCHEMA",
|
|
118
|
+
message: err.message,
|
|
119
|
+
data: {
|
|
120
|
+
invalidSegment: (0, _codeFrame.default)(err.source.body, location.line, location.column, {
|
|
121
|
+
frameSize: 15
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
});
|
|
118
125
|
}
|
|
119
|
-
|
|
120
|
-
const schema = await generateSchema(params);
|
|
121
|
-
schemaList.set(id, {
|
|
122
|
-
key: cacheKey,
|
|
123
|
-
schema
|
|
124
|
-
});
|
|
125
|
-
return schema;
|
|
126
126
|
};
|
|
127
127
|
|
|
128
128
|
const checkEndpointAccess = async context => {
|
|
@@ -140,7 +140,7 @@ const checkEndpointAccess = async context => {
|
|
|
140
140
|
const formatErrorPayload = error => {
|
|
141
141
|
if (error instanceof _error.default) {
|
|
142
142
|
return JSON.stringify({
|
|
143
|
-
type: "
|
|
143
|
+
type: "CmsGraphQLWebinyError",
|
|
144
144
|
message: error.message,
|
|
145
145
|
code: error.code,
|
|
146
146
|
data: error.data
|
|
@@ -175,17 +175,37 @@ const cmsRoutes = new _handler.RoutePlugin(({
|
|
|
175
175
|
});
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
+
let schema;
|
|
179
|
+
|
|
178
180
|
try {
|
|
179
|
-
|
|
181
|
+
schema = await getSchema({
|
|
180
182
|
context,
|
|
181
183
|
locale: context.cms.getLocale(),
|
|
182
184
|
type: context.cms.type
|
|
183
185
|
});
|
|
184
|
-
|
|
186
|
+
} catch (ex) {
|
|
187
|
+
console.log(`Error while generating the schema.`);
|
|
188
|
+
console.log(formatErrorPayload(ex));
|
|
189
|
+
throw ex;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
let body = [];
|
|
193
|
+
|
|
194
|
+
try {
|
|
195
|
+
body = createRequestBody(request.body);
|
|
196
|
+
} catch (ex) {
|
|
197
|
+
console.log(`Error while creating the body request.`);
|
|
198
|
+
console.log(formatErrorPayload(ex));
|
|
199
|
+
throw ex;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
try {
|
|
185
203
|
const result = await (0, _processRequestBody.default)(body, schema, context);
|
|
186
204
|
return reply.code(200).send(result);
|
|
187
205
|
} catch (ex) {
|
|
188
|
-
|
|
206
|
+
console.log(`Error while processing the body request.`);
|
|
207
|
+
console.log(formatErrorPayload(ex));
|
|
208
|
+
throw ex;
|
|
189
209
|
}
|
|
190
210
|
});
|
|
191
211
|
onOptions("/cms/:type(^manage|preview|read$)/:locale", async (_, reply) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["schemaList","Map","generateCacheKey","args","context","locale","type","lastModelChange","cms","getModelLastChange","code","toISOString","join","generateSchema","plugins","register","buildSchemaPlugins","typeDefs","resolvers","schemaPlugins","byType","GraphQLSchemaPlugin","pl","push","schema","makeExecutableSchema","getSchema","params","tenantId","tenancy","getCurrentTenant","id","cacheKey","has","set","key","err","Array","isArray","locations","WebinyError","location","message","data","invalidSegment","codeFrame","source","body","line","column","frameSize","cache","get","checkEndpointAccess","permission","security","getPermission","NotAuthorizedError","reason","formatErrorPayload","error","JSON","stringify","name","stack","cmsRoutes","RoutePlugin","onPost","onOptions","request","reply","ex","send","getLocale","result","processRequestBody","_","status","hijack","graphQLHandlerFactory","debug","debugPlugins"],"sources":["graphQLHandlerFactory.ts"],"sourcesContent":["import { GraphQLSchema } from \"graphql\";\nimport { makeExecutableSchema } from \"@graphql-tools/schema\";\nimport { ApiEndpoint, CmsContext } from \"~/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport { PluginCollection } from \"@webiny/plugins/types\";\nimport debugPlugins from \"@webiny/handler-graphql/debugPlugins\";\nimport processRequestBody from \"@webiny/handler-graphql/processRequestBody\";\nimport { buildSchemaPlugins } from \"./buildSchemaPlugins\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/plugins\";\nimport { GraphQLRequestBody } from \"@webiny/handler-graphql/types\";\nimport { RoutePlugin } from \"@webiny/handler\";\nimport WebinyError from \"@webiny/error\";\n// @ts-ignore `code-frame` has no types\nimport codeFrame from \"code-frame\";\n\ninterface SchemaCache {\n key: string;\n schema: GraphQLSchema;\n}\ninterface GetSchemaParams {\n context: CmsContext;\n type: ApiEndpoint;\n locale: I18NLocale;\n}\n\nconst schemaList = new Map<string, SchemaCache>();\n\nconst generateCacheKey = async (args: GetSchemaParams): Promise<string> => {\n const { context, locale, type } = args;\n const lastModelChange = await context.cms.getModelLastChange();\n return [locale.code, type, lastModelChange.toISOString()].join(\"#\");\n};\n\nconst generateSchema = async (args: GetSchemaParams): Promise<GraphQLSchema> => {\n const { context } = args;\n\n context.plugins.register(await buildSchemaPlugins(context));\n /**\n * Really hard to type this to satisfy the makeExecutableSchema\n */\n // TODO @ts-refactor\n const typeDefs: any = [];\n const resolvers: any = [];\n\n // Get schema definitions from plugins\n const schemaPlugins = context.plugins.byType<GraphQLSchemaPlugin>(GraphQLSchemaPlugin.type);\n for (const pl of schemaPlugins) {\n typeDefs.push(pl.schema.typeDefs);\n resolvers.push(pl.schema.resolvers);\n }\n\n return makeExecutableSchema({\n typeDefs,\n resolvers\n });\n};\n\n/**\n * Gets an existing schema or rewrites existing one or creates a completely new one\n * depending on the schemaId created from type and locale parameters\n */\nconst getSchema = async (params: GetSchemaParams): Promise<GraphQLSchema> => {\n const { context, type, locale } = params;\n const tenantId = context.tenancy.getCurrentTenant().id;\n const id = `${tenantId}#${type}#${locale.code}`;\n\n const cacheKey = await generateCacheKey(params);\n if (!schemaList.has(id)) {\n try {\n const schema = await generateSchema(params);\n schemaList.set(id, {\n key: cacheKey,\n schema\n });\n return schema;\n } catch (err) {\n if (!Array.isArray(err.locations)) {\n throw new WebinyError({\n ...err\n });\n }\n const [location] = err.locations;\n\n throw new WebinyError({\n code: \"INVALID_GRAPHQL_SCHEMA\",\n message: err.message,\n data: {\n invalidSegment: codeFrame(err.source.body, location.line, location.column, {\n frameSize: 15\n })\n }\n });\n }\n }\n /**\n * Safe to cast because check was done few lines up.\n */\n const cache = schemaList.get(id) as SchemaCache;\n if (cache.key === cacheKey) {\n return cache.schema;\n }\n const schema = await generateSchema(params);\n schemaList.set(id, {\n key: cacheKey,\n schema\n });\n return schema;\n};\n\nconst checkEndpointAccess = async (context: CmsContext): Promise<void> => {\n const permission = await context.security.getPermission(`cms.endpoint.${context.cms.type}`);\n if (!permission) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access \"${context.cms.type}\" endpoint.`\n }\n });\n }\n};\n\nconst formatErrorPayload = (error: Error): string => {\n if (error instanceof WebinyError) {\n return JSON.stringify({\n type: \"WebinyError\",\n message: error.message,\n code: error.code,\n data: error.data\n });\n }\n\n return JSON.stringify({\n type: \"Error\",\n name: error.name,\n message: error.message,\n stack: error.stack\n });\n};\n\nexport interface GraphQLHandlerFactoryParams {\n debug?: boolean;\n}\n\nconst cmsRoutes = new RoutePlugin<CmsContext>(({ onPost, onOptions, context }) => {\n onPost(\"/cms/:type(^manage|preview|read$)/:locale\", async (request, reply) => {\n try {\n await checkEndpointAccess(context);\n } catch (ex) {\n return reply.code(401).send({\n data: null,\n error: {\n message: ex.message || \"Not authorized!\",\n code: ex.code || \"SECURITY_NOT_AUTHORIZED\",\n data: ex.data || null,\n stack: null\n }\n });\n }\n\n try {\n const schema = await getSchema({\n context,\n locale: context.cms.getLocale(),\n type: context.cms.type as ApiEndpoint\n });\n const body: GraphQLRequestBody | GraphQLRequestBody[] = request.body as any;\n const result = await processRequestBody(body, schema, context);\n return reply.code(200).send(result);\n } catch (ex) {\n return reply.code(500).send(formatErrorPayload(ex));\n }\n });\n\n onOptions(\"/cms/:type(^manage|preview|read$)/:locale\", async (_, reply) => {\n return reply.status(204).send({}).hijack();\n });\n});\n\ncmsRoutes.name = \"headless-cms.graphql.route.default\";\n\nexport const graphQLHandlerFactory = ({ debug }: GraphQLHandlerFactoryParams): PluginCollection => {\n return [\n ...(debug ? debugPlugins() : []),\n cmsRoutes,\n {\n type: \"wcp-telemetry-tracker\"\n }\n ];\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["createRequestBody","body","JSON","parse","schemaList","Map","generateCacheKey","args","context","locale","type","lastModelChange","cms","getModelLastChange","code","toISOString","join","generateSchema","plugins","register","buildSchemaPlugins","typeDefs","resolvers","schemaPlugins","byType","GraphQLSchemaPlugin","pl","push","schema","makeExecutableSchema","getSchema","params","tenantId","tenancy","getCurrentTenant","id","cacheKey","cachedSchema","get","key","set","err","Array","isArray","locations","WebinyError","message","data","location","invalidSegment","codeFrame","source","line","column","frameSize","checkEndpointAccess","permission","security","getPermission","NotAuthorizedError","reason","formatErrorPayload","error","stringify","name","stack","cmsRoutes","RoutePlugin","onPost","onOptions","request","reply","ex","send","getLocale","console","log","result","processRequestBody","_","status","hijack","graphQLHandlerFactory","debug","debugPlugins"],"sources":["graphQLHandlerFactory.ts"],"sourcesContent":["import { GraphQLSchema } from \"graphql\";\nimport { makeExecutableSchema } from \"@graphql-tools/schema\";\nimport { ApiEndpoint, CmsContext } from \"~/types\";\nimport { I18NLocale } from \"@webiny/api-i18n/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport { PluginCollection } from \"@webiny/plugins/types\";\nimport debugPlugins from \"@webiny/handler-graphql/debugPlugins\";\nimport processRequestBody from \"@webiny/handler-graphql/processRequestBody\";\nimport { buildSchemaPlugins } from \"./buildSchemaPlugins\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/plugins\";\nimport { GraphQLRequestBody } from \"@webiny/handler-graphql/types\";\nimport { RoutePlugin } from \"@webiny/handler\";\nimport WebinyError from \"@webiny/error\";\n// @ts-ignore `code-frame` has no types\nimport codeFrame from \"code-frame\";\n\ninterface SchemaCache {\n key: string;\n schema: GraphQLSchema;\n}\ninterface GetSchemaParams {\n context: CmsContext;\n type: ApiEndpoint;\n locale: I18NLocale;\n}\n\nconst createRequestBody = (body: unknown): GraphQLRequestBody | GraphQLRequestBody[] => {\n /**\n * We are trusting that the body payload is correct.\n * The `processRequestBody` will fail if it is not.\n */\n return typeof body === \"string\" ? JSON.parse(body) : body;\n};\n\nconst schemaList = new Map<string, SchemaCache>();\n\nconst generateCacheKey = async (args: GetSchemaParams): Promise<string> => {\n const { context, locale, type } = args;\n const lastModelChange = await context.cms.getModelLastChange();\n return [locale.code, type, lastModelChange.toISOString()].join(\"#\");\n};\n\nconst generateSchema = async (args: GetSchemaParams): Promise<GraphQLSchema> => {\n const { context } = args;\n\n context.plugins.register(await buildSchemaPlugins(context));\n /**\n * Really hard to type this to satisfy the makeExecutableSchema\n */\n // TODO @ts-refactor\n const typeDefs: any = [];\n const resolvers: any = [];\n\n // Get schema definitions from plugins\n const schemaPlugins = context.plugins.byType<GraphQLSchemaPlugin>(GraphQLSchemaPlugin.type);\n for (const pl of schemaPlugins) {\n typeDefs.push(pl.schema.typeDefs);\n resolvers.push(pl.schema.resolvers);\n }\n\n return makeExecutableSchema({\n typeDefs,\n resolvers\n });\n};\n\n/**\n * Gets an existing schema or rewrites existing one or creates a completely new one\n * depending on the schemaId created from type and locale parameters\n */\nconst getSchema = async (params: GetSchemaParams): Promise<GraphQLSchema> => {\n const { context, type, locale } = params;\n const tenantId = context.tenancy.getCurrentTenant().id;\n const id = `${tenantId}#${type}#${locale.code}`;\n\n const cacheKey = await generateCacheKey(params);\n const cachedSchema = schemaList.get(id);\n if (cachedSchema?.key === cacheKey) {\n return cachedSchema.schema;\n }\n try {\n const schema = await generateSchema(params);\n schemaList.set(id, {\n key: cacheKey,\n schema\n });\n return schema;\n } catch (err) {\n if (!Array.isArray(err.locations)) {\n throw new WebinyError({\n message: err.message,\n code: err.code || \"INVALID_GRAPHQL_SCHEMA_LOCATIONS\",\n data: {\n ...(err.data || {}),\n locations: err.locations\n }\n });\n }\n const [location] = err.locations;\n\n throw new WebinyError({\n code: \"INVALID_GRAPHQL_SCHEMA\",\n message: err.message,\n data: {\n invalidSegment: codeFrame(err.source.body, location.line, location.column, {\n frameSize: 15\n })\n }\n });\n }\n};\n\nconst checkEndpointAccess = async (context: CmsContext): Promise<void> => {\n const permission = await context.security.getPermission(`cms.endpoint.${context.cms.type}`);\n if (!permission) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access \"${context.cms.type}\" endpoint.`\n }\n });\n }\n};\n\nconst formatErrorPayload = (error: Error): string => {\n if (error instanceof WebinyError) {\n return JSON.stringify({\n type: \"CmsGraphQLWebinyError\",\n message: error.message,\n code: error.code,\n data: error.data\n });\n }\n\n return JSON.stringify({\n type: \"Error\",\n name: error.name,\n message: error.message,\n stack: error.stack\n });\n};\n\nexport interface GraphQLHandlerFactoryParams {\n debug?: boolean;\n}\n\nconst cmsRoutes = new RoutePlugin<CmsContext>(({ onPost, onOptions, context }) => {\n onPost(\"/cms/:type(^manage|preview|read$)/:locale\", async (request, reply) => {\n try {\n await checkEndpointAccess(context);\n } catch (ex) {\n return reply.code(401).send({\n data: null,\n error: {\n message: ex.message || \"Not authorized!\",\n code: ex.code || \"SECURITY_NOT_AUTHORIZED\",\n data: ex.data || null,\n stack: null\n }\n });\n }\n\n let schema: GraphQLSchema;\n try {\n schema = await getSchema({\n context,\n locale: context.cms.getLocale(),\n type: context.cms.type as ApiEndpoint\n });\n } catch (ex) {\n console.log(`Error while generating the schema.`);\n console.log(formatErrorPayload(ex));\n throw ex;\n }\n\n let body: GraphQLRequestBody | GraphQLRequestBody[] = [];\n try {\n body = createRequestBody(request.body);\n } catch (ex) {\n console.log(`Error while creating the body request.`);\n console.log(formatErrorPayload(ex));\n throw ex;\n }\n\n try {\n const result = await processRequestBody(body, schema, context);\n return reply.code(200).send(result);\n } catch (ex) {\n console.log(`Error while processing the body request.`);\n console.log(formatErrorPayload(ex));\n throw ex;\n }\n });\n\n onOptions(\"/cms/:type(^manage|preview|read$)/:locale\", async (_, reply) => {\n return reply.status(204).send({}).hijack();\n });\n});\n\ncmsRoutes.name = \"headless-cms.graphql.route.default\";\n\nexport const graphQLHandlerFactory = ({ debug }: GraphQLHandlerFactoryParams): PluginCollection => {\n return [\n ...(debug ? debugPlugins() : []),\n cmsRoutes,\n {\n type: \"wcp-telemetry-tracker\"\n }\n ];\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-headless-cms",
|
|
3
|
-
"version": "5.34.3-beta.
|
|
3
|
+
"version": "5.34.3-beta.1",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cms:base"
|
|
@@ -21,22 +21,22 @@
|
|
|
21
21
|
"@babel/runtime": "7.19.0",
|
|
22
22
|
"@commodo/fields": "1.1.2-beta.20",
|
|
23
23
|
"@graphql-tools/schema": "7.1.5",
|
|
24
|
-
"@webiny/api": "5.34.3-beta.
|
|
25
|
-
"@webiny/api-file-manager": "5.34.3-beta.
|
|
26
|
-
"@webiny/api-i18n": "5.34.3-beta.
|
|
27
|
-
"@webiny/api-i18n-ddb": "5.34.3-beta.
|
|
28
|
-
"@webiny/api-security": "5.34.3-beta.
|
|
29
|
-
"@webiny/api-tenancy": "5.34.3-beta.
|
|
30
|
-
"@webiny/api-upgrade": "5.34.3-beta.
|
|
31
|
-
"@webiny/error": "5.34.3-beta.
|
|
32
|
-
"@webiny/handler": "5.34.3-beta.
|
|
33
|
-
"@webiny/handler-aws": "5.34.3-beta.
|
|
34
|
-
"@webiny/handler-db": "5.34.3-beta.
|
|
35
|
-
"@webiny/handler-graphql": "5.34.3-beta.
|
|
36
|
-
"@webiny/plugins": "5.34.3-beta.
|
|
37
|
-
"@webiny/pubsub": "5.34.3-beta.
|
|
38
|
-
"@webiny/utils": "5.34.3-beta.
|
|
39
|
-
"@webiny/validation": "5.34.3-beta.
|
|
24
|
+
"@webiny/api": "5.34.3-beta.1",
|
|
25
|
+
"@webiny/api-file-manager": "5.34.3-beta.1",
|
|
26
|
+
"@webiny/api-i18n": "5.34.3-beta.1",
|
|
27
|
+
"@webiny/api-i18n-ddb": "5.34.3-beta.1",
|
|
28
|
+
"@webiny/api-security": "5.34.3-beta.1",
|
|
29
|
+
"@webiny/api-tenancy": "5.34.3-beta.1",
|
|
30
|
+
"@webiny/api-upgrade": "5.34.3-beta.1",
|
|
31
|
+
"@webiny/error": "5.34.3-beta.1",
|
|
32
|
+
"@webiny/handler": "5.34.3-beta.1",
|
|
33
|
+
"@webiny/handler-aws": "5.34.3-beta.1",
|
|
34
|
+
"@webiny/handler-db": "5.34.3-beta.1",
|
|
35
|
+
"@webiny/handler-graphql": "5.34.3-beta.1",
|
|
36
|
+
"@webiny/plugins": "5.34.3-beta.1",
|
|
37
|
+
"@webiny/pubsub": "5.34.3-beta.1",
|
|
38
|
+
"@webiny/utils": "5.34.3-beta.1",
|
|
39
|
+
"@webiny/validation": "5.34.3-beta.1",
|
|
40
40
|
"code-frame": "5.0.0",
|
|
41
41
|
"commodo-fields-object": "1.0.6",
|
|
42
42
|
"dataloader": "2.1.0",
|
|
@@ -53,11 +53,11 @@
|
|
|
53
53
|
"@babel/cli": "^7.19.3",
|
|
54
54
|
"@babel/core": "^7.19.3",
|
|
55
55
|
"@babel/preset-env": "^7.19.4",
|
|
56
|
-
"@webiny/api-security-so-ddb": "^5.34.3-beta.
|
|
57
|
-
"@webiny/api-tenancy-so-ddb": "^5.34.3-beta.
|
|
58
|
-
"@webiny/api-wcp": "^5.34.3-beta.
|
|
59
|
-
"@webiny/cli": "^5.34.3-beta.
|
|
60
|
-
"@webiny/project-utils": "^5.34.3-beta.
|
|
56
|
+
"@webiny/api-security-so-ddb": "^5.34.3-beta.1",
|
|
57
|
+
"@webiny/api-tenancy-so-ddb": "^5.34.3-beta.1",
|
|
58
|
+
"@webiny/api-wcp": "^5.34.3-beta.1",
|
|
59
|
+
"@webiny/cli": "^5.34.3-beta.1",
|
|
60
|
+
"@webiny/project-utils": "^5.34.3-beta.1",
|
|
61
61
|
"apollo-graphql": "^0.9.5",
|
|
62
62
|
"get-yarn-workspaces": "^1.0.2",
|
|
63
63
|
"graphql": "^15.7.2",
|
|
@@ -77,5 +77,5 @@
|
|
|
77
77
|
"build": "yarn webiny run build",
|
|
78
78
|
"watch": "yarn webiny run watch"
|
|
79
79
|
},
|
|
80
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "1a098125f7fea27f610599e64cd3a82df3ff566b"
|
|
81
81
|
}
|