From cdea92bdd8cd1832455053a03a9661d99bb9cd72 Mon Sep 17 00:00:00 2001 From: Adrian Smijulj Date: Wed, 8 May 2024 14:38:08 +0200 Subject: [PATCH 01/26] fix: improve 5.39.0 meta fields data migration (#4115) --- packages/api-headless-cms/src/constants.ts | 12 +- .../5.39.6/001/ddb-es/001.ddbEsTableData.ts | 562 ++ .../001/ddb-es/001.ddbPrimaryTableData.ts | 2978 +++++++++ ...adless-cms-en-us-acosearchrecord-pbpage.ts | 148 + ...es-index-root-headless-cms-en-us-fmfile.ts | 1150 ++++ ...es-index-root-headless-cms-en-us-modela.ts | 292 + ...es-index-root-headless-cms-en-us-modelb.ts | 133 + .../migrations/5.39.6/001/ddb-es/001.test.ts | 285 + .../001/ddb-es/migrated/001.ddbEsTableData.ts | 3016 +++++++++ .../migrated/001.ddbPrimaryTableData.ts | 5458 +++++++++++++++++ ...adless-cms-en-us-acosearchrecord-pbpage.ts | 200 + ...es-index-root-headless-cms-en-us-fmfile.ts | 1605 +++++ ...es-index-root-headless-cms-en-us-modela.ts | 545 ++ ...es-index-root-headless-cms-en-us-modelb.ts | 236 + packages/migrations/src/ddb-es.ts | 28 +- .../001/utils/ensureAllNonNullableValues.ts | 60 + .../5.39.0/001/utils/getFallbackIdentity.ts | 58 + .../001/utils/hasAllNonNullableValues.ts | 20 + .../001}/utils/hasValidTypeFieldValue.ts | 0 .../src/migrations/5.39.2/001/ddb-es/index.ts | 4 +- .../src/migrations/5.39.6/001/ddb-es/index.ts | 452 ++ 21 files changed, 17232 insertions(+), 10 deletions(-) create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.ddbEsTableData.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.ddbPrimaryTableData.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-acosearchrecord-pbpage.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-fmfile.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-modela.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-modelb.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.test.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.ddbEsTableData.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.ddbPrimaryTableData.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-acosearchrecord-pbpage.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-fmfile.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-modela.ts create mode 100644 packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-modelb.ts create mode 100644 packages/migrations/src/migrations/5.39.0/001/utils/ensureAllNonNullableValues.ts create mode 100644 packages/migrations/src/migrations/5.39.0/001/utils/getFallbackIdentity.ts create mode 100644 packages/migrations/src/migrations/5.39.0/001/utils/hasAllNonNullableValues.ts rename packages/migrations/src/migrations/{5.39.2/001/ddb-es => 5.39.0/001}/utils/hasValidTypeFieldValue.ts (100%) create mode 100644 packages/migrations/src/migrations/5.39.6/001/ddb-es/index.ts diff --git a/packages/api-headless-cms/src/constants.ts b/packages/api-headless-cms/src/constants.ts index 1a6001257be..121d4629d8b 100644 --- a/packages/api-headless-cms/src/constants.ts +++ b/packages/api-headless-cms/src/constants.ts @@ -75,18 +75,22 @@ export const pickEntryMetaFields = ( return pickedEntryMetaFields; }; -export const isNullableEntryMetaField = (fieldName: EntryMetaFieldName) => { - // Only modifiedX and publishedX fields are nullable. +export const isNullableEntryMetaField = (fieldName: string) => { + // Only `modifiedX` and `publishedX` fields are nullable. const lcFieldName = fieldName.toLowerCase(); return lcFieldName.includes("modified") || lcFieldName.includes("published"); }; -export const isDateTimeEntryMetaField = (fieldName: EntryMetaFieldName) => { +export const isNonNullableEntryMetaField = (fieldName: string) => { + return !isNullableEntryMetaField(fieldName); +}; + +export const isDateTimeEntryMetaField = (fieldName: string) => { // Only field ending with "On" are date/time fields. return fieldName.endsWith("On"); }; -export const isIdentityEntryMetaField = (fieldName: EntryMetaFieldName) => { +export const isIdentityEntryMetaField = (fieldName: string) => { // Only field ending with "On" are date/time fields. return fieldName.endsWith("By"); }; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.ddbEsTableData.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.ddbEsTableData.ts new file mode 100644 index 00000000000..d1c5abe7915 --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.ddbEsTableData.ts @@ -0,0 +1,562 @@ +export const ddbEsTableData = [ + { + index: "root-headless-cms-en-us-acosearchrecord-pbpage", + _md: "2023-12-27T12:43:01.141Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61U32/aMBD+VzzvlWT5ARTyxCYxbZrWVoNVWqepsuMDsjo2chxoVPG/7+wQxFrG+tC33PnuvvvuvssjLbUA+VnQjLJcz4CZfPUNcm1EsOZrtgTaoxswVaEVzeIelTpn1huPdKGlAONzjdaW7nq0YhsQV/hKkyhJgzgJkot5nGT9NIuiMEr6t7StIQFjQAXfZ+ioLLN1hQ5h2MKiowTLEAELbpisoXJoFh7sxDZrl3jNr9vWWmdhfblLbclHXSvRPeRaWVD2+Im4RKLQXDjzDZlpY5oe4bUldgXEUSaNrskWDBCp9X2hlhhrSK5rKXwmhzY5JPP3X6bk65R8uipdN5r/htxOjmfk+zgxqH2oYJ5oG1a4gOFglMdcpHk65jyOomjUT2M+yN/iZ9wRW58NPTeXPW5ugFkQH5pT4BdPKvb7XUVRVGvJmktWurpMkLJQB7R2NUw4HzJEamCLEjqsU6pIssE4HA+9Kg7x5zU0HKa3HeRBN+uay6JagWOo6pKDmRyLlmstgSm3mHuMyaypoZsksyss8A73GvilutZbPmyJpX/+Qvuvaf1vUP+a0ZPxoC5N4yWx5U2AtxecXadiXsdePoeGXnBonu+CyQoJ6616ZRJb4IVqbrpR00GYjsIEA4uXEOskjb+gYlG8cmuGbW8O/47nh/n8BE9cxm6HYRLNynaimf+4niJMXlah32AoEfvubo9+7N79AR8950ZcBQAA" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5c", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:43:01.141Z" + }, + { + index: "root-en-us-page-builder", + _md: "2023-12-27T12:43:00.682Z", + data: { + snippet: null, + editor: "page-builder", + images: {}, + savedOn: "2023-12-27T12:43:00.663Z", + publishedOn: "2023-12-27T12:43:00.663Z", + pid: "658c1bd3c39bb10008431b5c", + locale: "en-US", + title: "Not Found", + createdOn: "2023-12-27T12:42:59.964Z", + version: 1, + tags: [], + path: "/not-found", + webinyVersion: "5.38.2", + createdBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + __type: "page", + id: "658c1bd3c39bb10008431b5c#0001", + titleLC: "not found", + category: "static", + locked: true, + ownedBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + tenant: "root", + status: "published", + latest: true + }, + SK: "L", + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5c", + _et: "PbPagesEs", + _ct: "2023-12-27T12:43:00.682Z" + }, + { + index: "root-en-us-page-builder", + _md: "2023-12-27T12:43:00.682Z", + data: { + snippet: null, + editor: "page-builder", + images: {}, + savedOn: "2023-12-27T12:43:00.663Z", + publishedOn: "2023-12-27T12:43:00.663Z", + pid: "658c1bd3c39bb10008431b5c", + published: true, + locale: "en-US", + title: "Not Found", + createdOn: "2023-12-27T12:42:59.964Z", + version: 1, + tags: [], + path: "/not-found", + webinyVersion: "5.38.2", + createdBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + __type: "page", + id: "658c1bd3c39bb10008431b5c#0001", + titleLC: "not found", + category: "static", + locked: true, + ownedBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + tenant: "root", + status: "published" + }, + SK: "P", + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5c", + _et: "PbPagesEs", + _ct: "2023-12-27T12:43:00.682Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.522Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TXY/TMBD8K8g8kqSxk5JeniokkHgBJI6TDoQqO9lU5vxR2U56ocp/Z52kEkLH8cJbdnY9npl1LuQMQprxDpyX1pCabLNilzGSkACGm4CIszZgDSa48X2LwOucsR0tBXQlvynzPN+JQnBW4ZB8rv8SPykOaduCmpk6/U4qQEjZhuNHjbekXz4j0DjgAdqPURLLWZFSlrLqlrK6ZPV2l1Xb8iuOeT78e2jlejOS+rIq3O4aKqqiKW6EoFFhWVBRljjcSn9SfPzAdZTD2xdampjGeFrqWE4JsWfznxkxFdnJhdT0SiVkuC6FzgE9AF7UceUBfQceeo/HW8e7uJ2Bqx58lGPFD2jCPiYa5tMXXOVj2HdWteDm2OeNTsmCm0WXh6Z3MoyZH45kbT3AGK8AbdMTP4Lf/G2zmzOoxmpIg02XB3U4PEW4epYa2TaIv3rUCnum1wLc3suf2KVVRdHwakND4NGCsFYBN/uTkwMuk9TB9XC1EPgRrX/7vpZcSe5hRqblaV2DeCIDx893z2Q3/alkipSowIdFQ0Ju7z+9RcJG+2z+R7Jo6XBYvf4OT78AoS6E/W8DAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba27", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.522Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.706Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TXY+UMBT9K6Y+CgwUEIaniYkmvqiJ6yar2UwKXCZ1+0HawixO+O/eApMYs7u++MY99/b0nHPLhZyh5mq6BWO5VqQieZSWESUBcaCYcogYrR3WoJyZPrYIvI0pLZMs7/ZlmSVxHO/LpClogkP8pf5r/PRDUrcgFqZOfuACEBK6YfhR4S3ht68INAaYg/azl0RjmoYJDWlxk9Aqo1VeRkWefccxy8Z/D21c7yZSXTaFedkkdZE26b6uvcIyS5M6y3C45bYXbPrEpJfD2leSK5/G1K+1L+eA6LP6z4yYCu/4SqoGIQIyXpeSLAE9AF7UMWEBfTvmBovHW8M6v52RiQGsl6Prn9C4g0/ULacvuMpHd+i0aMEssS8bnYMVV6uuFkYQugcT2fFEtt4DTEtL6rBnJ7C751a7O4NotITQ6XB9Ucfjk4ybay6Rbof4m0cpsKcGWYM5WP4Lu7Qo4yy4GpHgmDdRay2AqUNv+IjrJJUzA1xNOHZC8z/ut5IJziwsyLw+rmsUT6Rg2Pn2hfTmv5XMnhIVWLdqCMjN3Zf3SNhIGy1/SeQtHY+b1z/h+TfXujKFcQMAAA==" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c721", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.706Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.361Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTY/TMBD9K8gcSdLESZtsThUSSFwAiWUlQKiyk0kx64/KdtINVf474ySVENpdLtw8b8Zv3ryxL+QMXOjxDqwTRpOabJO8SiiJiAfNtEfEGuMxBu3t+K5FYJdSWmUFL1lZwi5N06or03YXLonn8i/xmGGRMi3ImalTb4UEhKRpGB5q7BJ//oRAY4F5aD8ESTSleZzRmJa3Ga0LWm+rpNwWX7HMseHfRSvX65HUl1XhtmoyXuZNfsN5FhQWecaLAotb4U6Sje+ZCnJY+0IJHdwYT0scwiki5qz/MyO6IjqxkOpeyogM16Vks0H3gI06Jh3g3J753uH11rIubGdgsgcX5Bj+Exq/D476+fYFV/ng952RLdjZ9nmjU7TgetH1A6yJeWgT82PihiNZ8/cwhj6gTHxiR3Cbp9a7OYNsjILYm3h5VYfDk6zr9EIh5QbxVw9KYk73ioPdO/ELs1m1K6LrPAo8C7NwYyQwvT9ZMeBWSe1tD9dZPDuiB9++ryGTgjmYkWl5Y1dHHjHDsvPdMyZOfyuZAiUqcH7REJHbLx/fIGGjXDJ/liRMdDiso/4JT78BE5zmZXgDAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#6022814b7a77e60008f70d62", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.361Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.486Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTY/TMBD9K8gcSdJ8tQk5VUggcQEklpUAoWqSTIpZf1S2k26o8t93nKQSQlAu3Dxvxm/evLEv7Iw1V+M9Gsu1YhXbRlkZpSxgDhUoR4jR2lGMypnxbUvALk7TMsW4gKLAXRzHZVfE7S6jIn4r/5yOCRVJ3aKYmTr5hgskSOgG6FBRl/DTRwIag+Cwfe8lpXGahUkapsVdklZ5Wm3LqNjmX6jMwvDvopXr1ciqy6pwWzZJXWRN9rKuE68wz5I6z6m45fYkYHwH0suB9pnkyrsxnpbYh1PA9Fn9Z0ZyhXd8IVW9EAEbrktJZoMekBp1ICzS3A5cb+l6a6Dz2xlA9Gi9HF3/wMbtvaNuvn2hVT66fadFi2a2fd7oFCy4WnR15FFvMGzAtGF9jOxwZGvFA46+E0odnuCIdvO3BW/OKBotMXQ6XN7V4fAdjQ5vkK82cEnMG8JfPEpBOdXLGs3e8p+ULcsyuM4l0YGfqdZaIKj9yfCBtssqZ3q8zuTgSF58/baGIDhYnJFpeWtXZ/5gioHz/Q0zp9+VTJ6SFFi3aAjY3ecPr4mwkTaaP03kBzoc1kl/hacnhEueWoADAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#602282e07a77e60008f70d63", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.486Z" + }, + { + index: "root-headless-cms-en-us-modela", + _md: "2023-12-27T13:20:25.736Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA62ST3OCMBDFvwqTHitMEkCUU3X00EP/zGidqRcnQGgzDcGSoEXH795NrHV64dRb9u2P5eVtjmjPM6G6FW+0qBVKURyEo4CiATJcMWVAaeraQM2Vabr7AoRhPMppNB4PhzjJOMZ4lJSEDBOARF//Bo4EoKouuHST3GkCkqxzJjkoXPkvCxDyhjPDiydriWIa+oT6NFmSMKU4pXFAw3gNmGa7HijBZH2dNe1Qerw6JFkS5uE4y4h1GIUkiyKAC6G3knWPrLJ2WOFVQtk0uu25tuVpgOq9+ueJkIUoxXmoaqUcoN1lKcQF9MHhR6ZpOVzbMNNq+HrbZlLod+gAzmTLtXVk+Je5K+ln3rYHS81m09v5wvO9B5u3N/HmdpcedcGrN9/xB2qKCsdFH386b8o4V0dU1rLgjdukeyTQbth+dfFhaQhem4vt5evzHNi80oF7TYEEB5vNTxJ/5d+b9W/39A3SUG1TwgIAAA==" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T13:20:25.736Z" + }, + { + index: "root-headless-cms-en-us-modela", + _md: "2023-12-27T13:20:25.737Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61Sy26DMBD8FeQeC8g2r4RTEyWHHPqQ0kZqL5HBmxYVDMUmKYny77UhRDn0cenNHs/Ozs76gIqSQ77gKO5PE2SjLdQyKwWKiY3yMmWquxzQpsw51B23LkuFjjaSbAv8Xr8iiqnnEOrQ6JF4McUxDdwIkxfUa+SgOSCcp6UGpGKqkRqomiTP5Btw05XlDUjTR8GnutnQj7Rp9oY1m02v50vLsW6NQ2tizYWqW4t20uLV6fh7qniBA/4bXxtOa2AK+LTtGrWVscV4kQktxjNZ5ay9Y0WPWj2cGc0wGKUkibzUGycJwRiPfI8kvm80wcgvBhb1x+MwxFEChhVtCAkjraJAMKGG6M5GfsyOesEpu3cdT6zqBmxU7sQ/e99Bkol2NWwcBa43cull5XfzXOkj0aTz/v76AjXbrYb9Hi/qhsEenx/mWiEtpNul6Va6aL0+DXkJH78AOM3x+bMCAAA=" + }, + SK: "P", + PK: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T13:20:25.737Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.543Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TXYvUMBT9KxIfbTtt2jqZPg2Cgi8quC6ssgxpezvEzUdp0s7Wof/dm36AyO764lvuyc3JOecmV3KBUujxFjorjCYFyaOURZQExIHm2iHSGeOwBu268WONwNuYUpZkeXNgLEviOD6wpNrTGJvES/uvcZlgkzI1yJmpUR+EBISkqTguCrwl/PYVgaoD7qD+7CXRmKZhQkO6v0lokdEiZ9E+z75jm+XDv5tWrncjKa6rwpxVSblPq/RQll4hy9KkzDJsroVtJR8/ceXl8PqVEtqnMbZL7cspIOai/zMjpiIasZDqXsqADNtQkjmgB8CLGi4toG/HXW/xeN3xxk9n4LIH6+WY8idU7ugTdfPpK47y0R0bI2vo5tjniU7BgutNF28dLyWEojI6ssOZrA0PMPqLQJmw5Wewu+fmu7uArIyC0JlweVan0/O0q3+hkHOH+JtHJXFP96qE7mjFL9yl7JCwYLOkwHFvpzRGAtfHthMDDpYUruths+P4GWP4cb+WXApuYUam5ZltoTyRR8cvty/kOP2tZPKUqMC6RUNAbu6+vEfCStlo/i+Rt3Q6rV7/hKffjOAaTXsDAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c720", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.543Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.702Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTY/TMBD9K8gcSdLESduQU4UEEhdAYlkJ0Kqyk0ll1h+R7aQbqvx3xkkqoRWUCzfPm/GbN2/sCzkDF3q8B+uE0aQi2yQvE0oi4kEz7RGxxniMQXs7vm8Q2KWUlllR7qApsjZN05LXtGEci8St/Es8ZlikTANyZmrVOyEBIWlqhocKu8RfPiNQW2Aemo9BEk1pHmc0pvu7jFYFrbZlst8W37DMseHfRSvXm5FUl1Xhtqwzvs/r/DXnWVBY5BkvCixuhOskGz8wFeSw5oUSOrgxdkscwiki5qz/MyO6IlqxkOpeyogM16Vks0GPgI1aJh3g3J753uH1xrI2bGdgsgcX5Bj+A2p/CI76+fYFV/nkD62RDdjZ9nmjU7TgetHVgVXChX6xqI1O3HAia8UjjKETKBN37ARu87cFb84ga6Mg9iZe3tXxeIN3dUAoJN0g/upJSczpXnGwByd+Yna3L1IaXYdS4FkYiBsjgelDZ8WAqyWVtz1cB/LshEZ8f1hDJgVzMCPT8tCutvzBEcvO9zecnJ4rmQIlKnB+0RCRu6+f3iJhrVwy/5gkjHQ8rrP+Dk+/AEx3J3R9AwAA" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dab", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.702Z" + }, + { + index: "root-headless-cms-en-us-acosearchrecord-pbpage", + _md: "2023-12-27T12:43:01.123Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61YW3PbNhb+KxjtbPsiceVLmsT7EtVtU8/aiVu7yWx3djogeSRiBQIsAEqrdPzf9zsASVGOnPVDHzyWcDnX73znQH9MaluSvionFxNZ2DuSrqh+psK6ctbkjVzRZDrZkPPKmsnFyXSibSFD/PLHZGl1SS7eddaGycN04uWGyvfYnZzOT89mJ6ez05f3J6cX52cX83k2n3/z6yTJ0IQzZGa/3GHBBxlaj4XSyWXAQk1BQgMEbqRuybO2QP8Nb8Ku4Yu3+W0yLS2qEMV9JF3YmkSw4iPlyuz6A4U1gUw4dkQcW4n/arkmL1QQJP2Ot/NW6VLIptEqxcALaUqxpdyrgKPW4FQj7FKEioQnh7hp8pBhlk764NoitI5EvhONsxtVKrMSO9uKrQqVkMKRLHezWpYkLm/uomwpStqQtk0N8wWk1LS1bp2JO0RQ5pp6Y2GVF4U0wnNo2doK9/kTTKmtDxBUY4VVsgRtZekz8c6KovXB1rhhNW86+r1VjspeMGlVKyPZPxZlCFtDLB7dxXoBJ8KB87BMXLIBtFxSEdTm0GbXGg7c09HaVqqoRAEJXrya/1XEMwHeiQ83XvxM3uoNjBsJKCqpNZkVVjtNjmrLh7AevRidQLaiL2z/odX7LL+lwL6tjd32EpHAEgZ6sUC9IPtFyOBlSZn4jhptd1l/8G4vc7GXKX7oUym+x/YuVD0W+gB3gWQQlFHioUnPxFr2lcl983fxiydGcp+4C/FDq/UMZVesD+TetDqoGWpFAm6IbJu0LW6v/I0qnGVFqiBxDZ4wwBXyszBcIIqc2MpRmRzG0ov7inBY4g8w3I1kI5VBVKSb6D7gMB0chu+1NSpYNxa3bE0Rr06hKgAfZNg3LmLP+iU8R3p3WIlZtYamHKVOvcH3ITsK1g227E3x0RbcJ/7gHsP5iQLuwWXrBjoMwKHVGgG6vJ4KZ6HCrKZiqVCUqBoH/koecjg4ktkIFEskH+nznDgHR1e433gWAyPEV7JGTn1hG3y5o6J1KnS+FEi8klpouUNGlBHSHCBn77kpdFtyTSCgwEKnkRPXyUNjaCOByPA1isoaA5QncLKbnOYwg4a3TjbVT9cMkuwZ5hZyyX2DQ/dTq4o1ErUiQ47RnltExzWaP8fot57PXV5fiUa3K2U8BwmMo2Wdl3IPBTbK0HZsC45eRnpSnyJRDn5xLbADJS0l4C4WH+9QuivG2VQAag7ok8B4TOqZK0UjHYe3REr5fko9/Ezpfb8OcioWbajmU0GhyKCAje4MTkgCW3E76YMfc5xAY45IzkSswwZWk9koZ00d4cRszVEBfYG7xMoiniXIugiaE8rY74mJ4Ty6O6SdQ/lZYwMEezR2tFMf1b9EdGI9QMl/IuW9Nwis+oRgwhbzNVoUxHIhXDFmpGBug4lgfscNzINIQVldj0lCpQB7Vgb4RPmQrNG4UhnDLLemEBsLr8e1nBHBdTjui7x9jHC5iyZaiLH2uOKgZW9PZKY+QS1zpAH3kOGE6F1EQ7ArYvIQsIqBwPajzGxFnltZzx1PqV8I36I9xFtj/uYG3XNeF/4Y2W5SyT5n7JshGmnaSFTdDR8jPr1MEkTV5v0hDbi0rCLdvDLBSYNUNNYFqb34EYNH6pzd3TgT+jHLsy85yhT59fvh4x1jJwREJxUUTxjTpxIhU6MAVIcZpSZYgayY/ZjSt+ZHg8qilE2IOr8l3oIw0ImZeQQNtdoBcoqQAXcDrtEAlqmPSL4vYpuNwY/BtlsT+y3kX6O184zBicIyqrtSDVzQy1mFZdDevuM+3W05II/Gl1ReK7SgeKEhy2U1TFnYhh+ub/W1RBnjL0u0Tt2/klvOiKeyrr60t4OzuEgr1w9faNI9P/3jftHxU1ThMc9pCY75TgY58nXfEf3eaw4osiQTjzlR8h2MDbtUUmD//XIB5DB33ZKrlecHQ8QTeoC4tVtyaDPwdYB/v8eZb4YrnZ6W+whUgEkqvCgyHh92fGyZyE5qtTKpquP5gRbG1NIPPyMgdtR3mCKO4PRw6h+lOMb3hOe6SDjkZkunQBF6eCgwYeVETPFl1zZSOXQXuA1jhi45a914gf26P/Dk2BklQT3cPwXVAu6ig/s+V4mvywPwJLigQmQtP3GxxHbMyE3oy7oasiOJKcedXJzfprcNbdJ0XbeYwZeIGSeYGcYpzF6gR56otukFlYkz3qvr1nAz+0gxddGONPYXwx4P/OixeMfcS73uJwo8OmnGXD6NusG7MVoDtcYuwFOO3jIA00jHPYmb6O94JcawZeKDomFOh6a3KvzY5ngK2pw54s34BRtfh0eesd1RxvVwTPGBb168Kk7y8qw4e53nJ/P5/NX52Un+Iv8LPp70z83mi0ef82rt9HfZ/XZ3zIiXjySfn/eSS+UxwuzeYZrkZ33J6Bu0pge0LHkNnsJFdJWael3H3u6nFy9eZ6/PX/LbfTj/5Zf+y9OzX3uVw+u+aXOtfEUldkxb5+TejH9ayPGMBAw5QWucuUCBUh9RGSoI+FsHtVmw3Pk4Vg+9X3IFFf/6N74fRO3/BeypWD0KE/jE7SJEtvluJgs7+2J6+f3Uw2kw6Bk/i0S/l+B1OM7U/Oc6kUL2oQ/55EV29io7xUH1HMd6iMeuqv5k05zcfhh+6fm8UD8vySMV8vCAY/x28KEHz/0/b7+HmqL2WcxgpqH7t9867ePlh/8BijuEYQoTAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5b", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:43:01.123Z" + }, + { + index: "root-en-us-page-builder", + _md: "2023-12-27T12:43:00.864Z", + data: { + snippet: null, + editor: "page-builder", + images: {}, + savedOn: "2023-12-27T12:43:00.723Z", + publishedOn: "2023-12-27T12:43:00.723Z", + pid: "658c1bd3c39bb10008431b5b", + locale: "en-US", + title: "Welcome to Webiny", + createdOn: "2023-12-27T12:42:59.947Z", + version: 1, + tags: [], + path: "/welcome-to-webiny", + webinyVersion: "5.38.2", + createdBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + __type: "page", + id: "658c1bd3c39bb10008431b5b#0001", + titleLC: "welcome to webiny", + category: "static", + locked: true, + ownedBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + tenant: "root", + status: "published", + latest: true + }, + SK: "L", + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5b", + _et: "PbPagesEs", + _ct: "2023-12-27T12:43:00.864Z" + }, + { + index: "root-en-us-page-builder", + _md: "2023-12-27T12:43:00.864Z", + data: { + snippet: null, + editor: "page-builder", + images: {}, + savedOn: "2023-12-27T12:43:00.723Z", + publishedOn: "2023-12-27T12:43:00.723Z", + pid: "658c1bd3c39bb10008431b5b", + published: true, + locale: "en-US", + title: "Welcome to Webiny", + createdOn: "2023-12-27T12:42:59.947Z", + version: 1, + tags: [], + path: "/welcome-to-webiny", + webinyVersion: "5.38.2", + createdBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + __type: "page", + id: "658c1bd3c39bb10008431b5b#0001", + titleLC: "welcome to webiny", + category: "static", + locked: true, + ownedBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + tenant: "root", + status: "published" + }, + SK: "P", + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5b", + _et: "PbPagesEs", + _ct: "2023-12-27T12:43:00.864Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.525Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TXY+UQBD8K2Z8FFgY2FuOp42JJr6oieclasymB5rNePOxYQb2cMN/twfYxBjvfPGNru6pqaoeLuyMQprxHjsnrWEV2yZ5mXAWMY8GjCeks9ZTjcZ347uGgJuU8zIrBLYF3BZpmpYiF8BvaEg+139JnxkNadugmpla/VYqJEjZGuijolviz58IqDsEj82HIImnPI8zHvPdXcarglfbMtlti6805mD499DK9Xpk1WVVuC3rTOzyOr8VIgsKizwTRUHDjXQnBeN70EEONC+0NCGN8bTUoZwiZs/mPzNSKrKVC6nplYrYcF1KNgf0gHRRC8oh+fbge0fHmw7asJ0BVI8uyLHiB9Z+HxL18+kLrfLR71urGuzm2OeNTtGCm0WXq6ENI9IcEzcc2dp9wDHcgtrGJzii2zy13M0ZVW01xt7Gy5s6HJ7gXJ1LTYQbwl89akU902uB3d7Jn9TN87Iso6sZjR6CEWGtQjD7UycHWimrfNfj1YiHIwXw7ftagpLgcEam5YFd4/hLEh2c759JcPpTyRQoSYHzi4aI3X35+IYIa+2S+U9JgqXDYfX6Ozz9AgsV+EF1AwAA" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba26", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.525Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.561Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTY/TMBD9K8gcSdLYSZtsThUSSFwAiWUlQKvKSSaVWX9UtpNuqPLfGSephFbLcuHm+fCb997YF3KGWujxDqwTRpOKbJOsTBiJiAfNtceMNcZjDNrb8UOLiV3KWEnzckvpTbFL07SkBcs5YJN4qf4ajxSblGlBzkidei9kuCdNw/FQ4ZT46xdMNBa4h/ZToMRSlsWUxay4pazKWbUtk2Kbf8c2x4d/N61Yb0dSXVaG27KhdZE12U1d08Awz2id59jcCneSfPzIVaDD21dK6ODGeFriEE4RMWf9nxHRFdGJBVT3UkZkuC6FzgY9AA7quHSAuj33vcPrreVd2M7AZQ8u0DH1T2j8Pjjq59sXXOWj33dGtmBn2+eNTtGS1wuvxjgfi8boxA1HstYeYAwzQJn4xI/gNn9b7eYMsjEKYm/i5UUdDs8irqqFQrgN5t88Kok13asa7N6JX1jdpTgmugpR4HkQURsjgev9yYoB10kqb3u4ivD8iOJ/3K8hl4I7mDPT8riuVjzjguXnuxfcm54ymQIkMnB+4RCR22+f3wULlUvmX5IESYfDqvXP9PQb9c+2XXEDAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#6022814851197600081724ae", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.561Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.487Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TXavTQBD9K7I+mqTNR9uYpyIo+KKC1wtXkTKbTMra/Qi7m/bGkv/ubJKCiF5BzNPOmdkzZ85sruyCXOjhHq0TRrOKbZK8TDIWMY8atCfEGuMpRu3t8LYhYLvOsjItYN20BV/TV5a7fMM5FYmn8s/pmFKRMg3KialVb4REgqSpgQ4VdYk/fSSgtggem/dBUrbO8jjN4mx3l2ZVkVWbMtltis9U5uD896KF69XAquuicFPWKd/ldf6S8zQoLPKUFwUVN8J1EoZ3oIIcaJ4poYMbQzfHIRwjZi76PzOSK6IVM6nupYzY+baUdDLohNSoBemQ5vbge0fXGwtt2M4ZZI8uyDH8G9Z+Hxz10+0rrfLR71sjG7ST7dNGx2jG9axrfgexQ0ttJToXQ9dJMZPEraWqi7GnxJ2PbLl5wiEoQGXiDo7oVn9a/OqCsjYKY2/iuc/h8A/9FseEomYrwl88Kkk53SuOdu/Ed8rm2y25tXig0EOYnxsjEfS+s+JML4FV3vZ4m9/DkXz78nUJQQpwOCHj/C5vLv7GQAuX+yeMH39VMgZKUuD8rCFidw8fXhNhrVwy/WBJmOhwWEb9GR5/AOAByTisAwAA" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#6022814a0df4b000088735bb", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.487Z" + }, + { + index: "root-headless-cms-en-us-modela", + _md: "2023-12-27T13:20:12.855Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA62ST3OCMBDFvwqTHisMCQiUU3X00EP/zGidqRcnIaHNNAQLQYuO372bWOv0UE+9Zd/+WF7eZo+2gkndL0TTylqjHA2DKAsIGiAjNNUGlKauDdRCm6a/4yAkw6wgccaSJEyZCMMwS0uMkwQgeal/BUcMUFVzodwkdxqBpOqCKgGK0P7zDISiEdQI/mgtkZBEPiY+Sec4ykmYYxxkBC8Ba+nmT4gEaTpcnmeNe5Tvzw4xS6MiumEMW4dxhFkcA8xlu1a0f6CVtUO5V0lt0+jXx9qWhwGqt/qfJ0IWspTHobpTaoA2p6VgF9C7gB+ZphNwbUNN18LX644p2b5BB3CqOtFaR0Z8mtuSfBRdt7PUZDK+ns4837u3eXsjb2p36WEXvH71Hb8jhlfhkF/iD8dNGedqj8pacdG4TbpHAu2GbhcnH5aG4Ftzsj1/eZoCW1Rt4F5ToMDBavWdxG/552aXt3v4AqHf5GfCAgAA" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T13:20:12.855Z" + }, + { + index: "root-headless-cms-en-us-modela", + _md: "2023-12-27T13:20:12.874Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61Sy26DMBD8FeQeCwgbApRTEyWHHPqQkkZqL5GNNy0qGIpNUhLl32tDiHLo49KbPZ6dnZ31ARUlh3zOUdKfxshGW6hlVgqUYBvlZUpVdzmgTZlzqDtuXZYKHW0k6Rb4g35FxCO+g4lDoiX2E+IlmLhRNHpBvUYOmgPCeVpoQCqqGqmBqmF5Jt+Am640b0CaPgo+1e2GfKRNszes6XRyPVtYjnVnHFpjayZU3Vq4kxavTsffE8ULb8R/42vDaQ1UAZ+0XaO2MrYoLzKhxXgmq5y297ToUauHM6MZjuIUs8hP/RvGsOd5ceBjFgRGE4z8fGCRIGZh6EUMDCvaYByGWkWBoEIN0Z2N/JAddmOCT9m963gSVTdgo3In/tn7Dlgm2tWwcTRy/dgll5XfzXOljyb+8/7++gI13a2G/R4v6obBls+PM62QFtLt0nQrXbRen4a8hI9ffhzBm7MCAAA=" + }, + SK: "P", + PK: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T13:20:12.874Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.488Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TXa+UMBD9K6Y+CiwU1u3ytDHRxBc18XoTNWZTYFjr9oO0hb244b87BTYx5np98Y05Mz0950y5kgtUQo/3YJ0wmpRkm+QsoSQiHjTXHhFrjMcatLfj2waBlymlLCtYu2esyNI03bOs3tEch8RT/ef4meGQMg3ImalVb4QEhKSpOX6UeEv86SMCtQXuoXkfJNGU5nFGY7q7y2hZ0HLLkt22+IJjjg//Hlq5Xo2kvK4Kt6zOql1e5/uqCgpZkWdVUeBwI1wn+fiOqyCHN8+U0CGNsVvqUE4RMRf9nxkxFdGKhVT3UkZkuC0lmwM6A17UcukAfXvue4fHG8vbsJ2Byx5ckGOqH1D7Q0jUz6evuMoHf2iNbMDOsc8bnaIF14uuTuhz7L7zDhI3nMjaPMMYLgFl4o6fwG3+ttvNBWRtFMTexMuTOh4fp1x9C4V8G8RfPCiJPd2rCuzBiZ/YzfdpdDOiwPNgojJGAteHzooB10lKb3u4mfD8hOa/fltLLgV3MCPT8rhuUTySguWX+yfSm/5UMgVKVOD8oiEid58/vEbCWrlk/kuSYOh4XJ3+Dk+/APbPY71xAwAA" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c723", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.488Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.527Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTY+bMBD9K5V7LJBgICGcokqttJdtpW5XaldVZMMQueuPyDZkacR/7xiItKra3Us5ed6M37x5Yy7kDFzo4R6sE0aTihRJViaURMSDZtojYo3xGIP2drhpENisKS3TvNxssh1d47drm6wAjkXipfxbPKZYpEwDcmJq1UchASFpaoaHCrvEX78gUFtgHppPQRJd0yxOaUy3dymtcloVZbIt8u9Y5lj/etHC9X4g1WVRWJR1yrdZne04T1FWmWcpz3MsboQ7STbcMhXksOaNEjq4MZzmOIRjRMxZ/2dGdEW0YibVnZQR6a9LSSeDHgEbtUw6wLk9853D641lbdhOz2QHLsgx/CfUfh8c9dPtC67yye9bIxuwk+3TRsdoxvWsy4HFfhKci2vlYmmOJnH9kSxVjzCEbqBMfGJHcKt/LXl1BlkbBbE38fy2DodXuBcnhELiFeLvnpTEnO4UB7t34hdm021RRtfZFHgW5uLGSGB6f7Kixw2TytsOrnN5dkQ/Hn4sIZOCOZiQcX5vV3f+Yoxl5/sXDB3/VDIGSlTg/KwhInffPn9AQhw3mX6cJEx0OCyjPofH377bNOyEAwAA" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35eb", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.527Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.523Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTY/TMBD9K8gcSdLYSbdpThUSSFwAiWUlQKvKSSaVWX9UtpNsqPLfGSephFawcODmeTN+8+aNfSEDVEKPd2CdMJqUZJtkRcJIRDxorj0i1hiPMWhvx3cNAjcpYwXNiz2tGpqlaVrsqoblNRaJ5/Iv8UixSJkG5MzUqrdCAkLS1BwPJXaJP39CoLbAPTQfgiSWsiymLGa7W8rKnJXbItlt869Y5nj/96KV6/VIysuqcFvUtNpldbavKhoU5hmt8hyLG+HOko/vuQpyePNCCR3cGM9LHMIpImbQ/5kRXRGtWEh1J2VE+utS6GzQA2CjlksHOLfnvnN4vbG8DdvpuezABTmm+g61PwRH/Xz7gqt89IfWyAbsbPu80SlacL3oWt5BLHRrufO2q31nITaooRcwJK4/kfXCA4yhMSgTn/kJ3OZP+94MIGujIPYmXuiPx39vs/ojFPbYIP7qUUnM6U5VYA9O/MDsPqU3WXQdWYHnYdzKGAlcH85W9Lh4UmIfuI7r+Qlt+na/hlwK7mBGpuUZXk37jV+WD3fP+Dw9VTIFSlTg/KIhIrdfPr5Bwlq5ZP5PSRjpeFxn/RWefgJvK6+zmwMAAA==" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#6022814891bd1300087bd24c", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.523Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.563Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTW+cMBD9K5V7LLCYj8JyWlVqpFzaSk0jJVG0MjCs3PhjZRs2dMV/7xhYqaqS9NIb82b8/N4bcyYnqLkab8FYrhWpSB6lZZSQgDhQTDlEjNYOa1DOjNctAh/jJClplnfbssxoHMfbkjYF7XCIv9V/j58Uh6RuQcxMnbziAhASumH4UeEt4Y/vCDQGmIP2q5eUxEka0iRMihuaVFlS5WVU5Nk9jlk2/Hto5fo0kuq8KszLhtZF2qTbuvYKyyyldZbhcMvtUbDxC5NeDmvfSa58GuNxqX05BUSf1H9mxFR4xxdS1QsRkOGyFDoH9AR4UceEBfTtmOstHm8N6/x2BiZ6sF6Orn9C43Y+UTefPuMqn92u06IFM8c+b3QKFlwtunTjdIhHIjscyNp6gtFfAVKHR3YAu3lts5sTiEZLCJFjeVD7/UuEq2cukW2D+IdnKbCnelmD2Vn+C7sp0hbBxYYEx7yFWmsBTO2Ohg+4TFI508PFgmMHtP7wuJZMcGZhRqblaV2CeCEDw063b2Q3/a1k8pSowLpFQ0Bu7r59RsJG2mj+RyJvab9fvf4JT78BqJuFQm8DAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c71f", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.563Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.541Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTY+bMBD9K5V7LJBgICGcokqt1EtbqduVuqsqMjCk3vUHsg1ZGvHfOwYiVavd9FJOnjfjN2/emDM5QcnVcAvGcq1IQbIoySNKAuJAMeUQMVo7jEE5M3yqEdisKc3jNN9skh1d47dr6iSDCov4tfxbPMZYJHUNYmJq5EcuACGhK4aHAruE378hUBlgDuovXhJd0ySMaUi3NzEtUlpkebTN0jsss6z/d9HC9X4gxXlRmOVVXG6TKtmVZYyy8jSJyzTF4prbVrDhM5NeDqvfSK68G0M7xz4cA6JP6j8zoiu84TOp6oQISH9ZSjwZ9AjYqGHCAs7tmOssXq8Na/x2eiY6sF6OLh+gcnvvqJtun3GVT27faFGDmWyfNjoGM65mXZW0YQkKGu5saH+xFiLbH8lS9AiDbwZShy07gl29tuPVCUSlJYROh/PTOhyuUy8+cIm8K8TfPUmBOdXJEsze8t+YxR7BZTAJjvmhSq0FMLVvDe9xvaRwpoPLUI4d0Yz7n0vIBGcWJmScH9vFmhdcMex0e8XN8bmS0VOiAutmDQG5+fH1w2xpNP01kR/ocFgm/Rse/wBONimLgQMAAA==" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35ec", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.541Z" + }, + { + index: "root-headless-cms-en-us-modelb", + _md: "2023-12-27T13:22:46.132Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA62SP2+DMBDFvwpyxwaEDQTCVKFk6NA/UtJKzRIZ7DRWjUHYhKIo371np2nUoZm6+d79OJ7f+YAGXgo1vvJOi0ahHCVBlAUETZDhiioDStc0BmquTDfeMxCmSVaRhMSUlRVOwzCchRxThgES1/o3cLRQ3TAu3SR3KkCSTUUlB4Ur/2UJQtVxajh7spZISCIfE5+kKxzlhORxHExTsgZM0/2f0DQIZ3h9mVWMKD9cHOIyjapoVpYYbGVxhMs4BpgJ3Uo6PtLa2qHMq4WyaYztqbblcYKaQf3zRMhCbMVpqOqlnKD9eSnYBfTB4Uem6zlc21DTa/i67Usp9A46gFPZc20dGf5p7mLGWzKQHVDzeXG7WHq+92Dz9gpvYXfpYRe8evcdn1aJyYaBXuOPp00Z5+qAto1kvHObdI8E2h0dXs8+LA3Ba3O2vXp7XgBb1TpwrymQ4GCz+U7it/xzs+vbPX4BgnLwJMICAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T13:22:46.132Z" + }, + { + index: "root-headless-cms-en-us-modelb", + _md: "2023-12-27T13:22:46.134Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61Sy26DMBD8FeQeCwgbCIRThZJDDn1ISSO1l8jgbYMKNsImFEX599oQohz6uPRmj2dnZ3Z9RJVgUK4YSsZTimx0gEYWgqME26gUOVXD5YjeRMmgGbiNEAqdbCTpAdijfkXEI76DiUOiDfYTQpJg5npz/IpGjRI0B7jzvNaAVFS1UgN1m5WF3AMzXWnZgjR9FHyqu4BBTTqy16zFIr1dri3HujcOrdRactX0Fh6k+bsz8KM8VHHX0d/42nDeAFXA0n5o1NfGFmVVwbUYK2Rd0v6BViNqjXBhAs/COMdZ5Of+PMuw53lx4OMsCIwmGPnVxCIhCSjLchxp1twDTJlxqoBTrqbRXYz8MLvAnUXkPLsPPZ5ENS3YSHT8n713kBW8304bR6Hrxy65rvwuz40+mlCX/f31BRrabaf9nq7qpmCbl6elVsgr6Q7TdGtdtNudQ17Dpy+tJHA1swIAAA==" + }, + SK: "P", + PK: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T13:22:46.134Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.528Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TXY+UQBD8K2Z8FFgY2IPjaWOiiS9q4nmJGrNphmYz3nxsmFn2cMN/twfYxBjvfPGNru6pqaoeLuyMjTTjPfZOWsNqtk3yKuEsYh4NGE9Ib62nGo3vx3ctATcp51VWVB3womjTNK1EUYrylobkc/2X9JnRkLYtqpmp02+lQoKUFUAfNd0Sf/5EgOgRPLYfgiSe8jzOeMzLu4zXBa+3VVJui6805mD499DK9Xpk9WVVuK1E1pS5yG+bJgsKizxrioKGW+mOCsb3oIMcaF9oaUIa43GpQzlFzJ7Nf2akVGQnF1JzUipiw3Up2RzQA9JFHSiH5NuDPzk63vbQhe0MoE7oghzb/EDhdyFRP5++0Cof/a6zqsV+jn3e6BQtuFl0OVoANApjKaxJ3HBga/8Bx3APahsf4YBu89R6N2dUwmqMvY2XV7XfP8m6upeaKDeEv3rUinrmpBvsd07+pG5ZpTfR1Y9GD8FLY61CMLtjLwfaKqt9f8KrFw8HyuDb97UEJcHhjEzLG7sm8pcwejjfPxPi9KeSKVCSAucXDRG7+/LxDREK7ZL5Z0mCo/1+tfo7PP0ChLfw5XgDAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c79", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.528Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.684Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTY/TMBT8K8gcSdLESYmbU4UEEhdAYllpQahykpfKrD8i2003VPnvPCephFbs7oWb3/h5PDPPvpAz1EKPt2CdMJpUZJvkLKEkIh401x4Ra4zHGrS348cWgbcppSwrWLdjrMjSNN2xrClpgU3iuf3XuMywSZkW5MzUqQ9CAkLSNBwXFd4Sf/uKQGOBe2g/B0k0pXmc0ZiWNxmtClptWVJui+/Y5vjwctPK9W4k1WVVuGVNVpd5k+/qOihkRZ7VRXDQCtdLPn7iKsjh7SsldEhj7Jc6lFNEzFn/Z0ZMRXRiIdUnKSMyXIeSzQHdA17UcekAfXvuTw6Pt5Z3YToDlydwQY6pf0Hj9yFRP5++4Cgf/L4zsgU7xz5PdIoWXC+6RNsnbjiSFb2HMbCDMnHPj+A2Tw11cwbZGAWxN/Hylg6HR1yrU6GQaIP4mwclcU+fVA1278Rv3KUlK1l0Fa/A8yC8NkYC1/veigFHSCpvT3AV7vkRDf/4uZZcCu5gRqblQV3t/8O55efbZxKbHiuZAiUqcH7REJGbuy/vkbBRLpl/RhIsHQ6r17/h6Q/nB7bbZQMAAA==" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c724", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.684Z" + }, + { + index: "root-headless-cms-en-us-modela", + _md: "2023-12-27T13:20:34.215Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA62Sy27CMBBFfyVylyVRbOdVVgXBoos+JChSu0FO7LRWHYcmDjQg/r1jA626gFV3njsnk+s73qGNyKXuF6JpZa3REMUBzQKCBsgIzbQBpalrA7XQpunvOAhJnBUkYjhJwjQXYRhmaYlxkgEkL/Wv4IgBqmoulJvkTiOQVF0wJUAR2n+egVA0ghnBH60lEhLqY+KTdI7pkIRDSoM0jV8Ba9n6LBQF+AAdZ417NNz9OsR5Sgt6k+fYOowozqMIYC7blWL9A6usHca9SmqbRr861LbcD1C90f88EbKQpTwM1Z1SA7Q+LQW7gD4E/Mg0nYBrG2a6Fr5edbmS7Tt0AGeqE611ZMSXuS3JZ9F1W0tNJuPr6czzvXubtzfypnaXHnXB6zff8VtieBXG/DxPrE27KeNc7VBZKy4at0n3SKDdsM3i5MPSEHxrTrbnL09TYIuqDdxrChQ4WC6PSfyVf252ebv7b3cJr33CAgAA" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T13:20:34.215Z" + }, + { + index: "root-headless-cms-en-us-modela", + _md: "2023-12-27T13:20:34.216Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61Sy26DMBD8FeQeCwjbvMqpiZJDDn1IaSO1l8jgTYsKhmKTlET599pQohwa9dKbPZ6dnZ31AZUVh2LBUTKcJshGW2hkXgmUYBsVVcZUfzmgTVVwaHpuU1UKHW0k2Rb4g35FxCPUwcQh0ROmCfES6rs4Cl7RoFGA5oBwnpcakIqpVmqgbtMil+/ATVdWtCBNHwVf6nZDPrO23RvWbDa9ni8tx7ozDq2JNReq6SzaS4s3p+fvieKlF/DLfGIMZw0wBXza9Y262thivMyFFuO5rAvW3bNyQK0Bzo1mGMQZTiOa0Zs0xZ7nxT7Fqe8bTTDyi5FFfIbD0ItSMKxog3EYaxUFggk1RncyciE76kan7D50PIlqWrBRtRP/7H0HaS661bhxFLg0dsl55W/zXOkj1qTT/v76Ag3brcb9Hs/qxsGeXh7nWiErpdun6da6aL3+GfIcPn4DcthPZ7MCAAA=" + }, + SK: "P", + PK: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T13:20:34.216Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.705Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TXa+UMBD9K6a+AguFFeRpY6KJL2ri9SZqzGaAYVNvP0hbdsUN/90psIkx3uuLb53T6ek5Z9oru2Aj9HSP1gmjWc32SV4lnEXMowbtCbHGeKpRezu97Qh4kXJeZUXVAy+KLk3Tqi3KtgRqEk/tP6dlRk3KdCgXpl69ERIJkqYFWtR0S/zpIwGtRfDYvQ+SeMrzOOMxL+8yXhe83ldJuS++UJuD87+bNq5XE6uvm8J91WZNmbf5y6bJgsIiz5qioOZOuEHC9A5UkAPdMyV0SGMa1jqUc8TMRf9nRkpF9GIl1aOUETvfhpItAT0gXdSDdEi+PfjR0fHOQh+mcwY5ogtyTPMdW38Iifrl9JVG+cMfeiM7tEvsy0TnaMX1qqs1So1a+CkWrdHJoE9sa3jAKVyEysQDnNDtHpvv7oKSaDD2Jl6f1fH4OO3mXyji3K24HlWD9uDET9rJyrzi0c2OQg/BSmOMRNCHwYozDZXV3o54s+LhRBF8/baVIAU4XJB5fWK3QP6ShYXL/RMZzn8qmQMlKXB+1RCxu88fXocglUuWv5JIsnQ8bj5/h+dfsmotBXcDAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c7a", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.705Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.482Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTY/TMBD9K8gcSdLmi4acKiSQuAASy0qAVtU4mVRm/VHZTrqhyn9nnKQSWrHLhRyizPP4+b03zoWdkQs93qJ1wmhWszLJqyRjEfOoQXtCrDGeatTejh9aAl5vs6xKC75tO3rRU1W7vOQNNYnn1l/SZ0pNyrQoZ6ZOvRcSCZKmAfqo6ZT46xcCGovgsf0UJGXbLI/TLM52N2lWF1ldVsmuLL5Tm4Ph300r19uR1ZdVYVk1Kd/lTf6G8zQoLPKUFwU1t8KdJIwfQQU50L5QQoc0xtNSh3KKmDnr/8xIqYhOLKS6lzJiw3Uo6RzQPdJBHUiH5NuD7x1tby10YToDyB5dkGP4T2z8PiTq590XGuWD33dGtmjn2OeJTtGC60XXcg9iaY4mccORrav3OIZTUJn4BEd0m6eGuzmjbIzC2Jt44TocnuBcnQtFhBvCXz0oSWu6Vxzt3olftFpuyzy6elHoIfjgxkgEvT9ZMdBEWe1tj1cfHo7k/8fdWoIU4HBGpuV+XdP4SxAWzrfPBDg9VjIFSlLg/KIhYjffPr8jwka5ZP5RkuDocFit/glPvwF6hmKrdAMAAA==" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#6022814b0df4b000088735bc", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.482Z" + }, + { + index: "root-headless-cms-en-us-modela", + _md: "2023-12-27T13:20:42.214Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61SPW/CMBD9K5E7lkS2E5KQqSAYOvRDokVqF+TEThXVcajtQAPiv/dsQO3ULt18757v3r27A9qJslHDSmjTdAoVaBzFeUTRCFmhmLKA6K6zEAtl9XDLAUjHeUUTxtIUZ6XAGOdZTUg6AVLzW/4KngRIbceF9JX8awqQ7ComBSBChc9LACotmBX8wUmimMYhoSHNnkhcUFwkNCI5fgWaYdu/SedaswEVh2+FpMziKp6UJXEKk5iUSQJk3piNZMM9a50cxoO2Uc6NYXOKXXgcoW6n/rkieNHUzamo6qUcoe1lKcQb9C6gUc2kETC3ZbY38J1rVrvtbJnshXFyrPi0NzX9qPp+7xjz+ex6sQzC4M6ZHUyDhVtkkHjX1Vvo+XtqeYvHbhKnxa3D+tYHVHeSC+3X5S8B0prtVpd+jg3uGrgUq3uQ9vTyuABu1ZrIn0wkodN6fR73J3z8Ah+WbBR+AgAA" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#658c24aa6607be00087f1169", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T13:20:42.214Z" + }, + { + index: "root-headless-cms-en-us-modelb", + _md: "2023-12-27T13:23:15.572Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61STU/DMAz9K1U4slZN0tKuJ5i2Awc+JMYkuKC0cSEiTacmpZSJ/47TMcQBIQ7cbMd+7/k5O9K0EvS5JMU+WpAZeYHOqtaQgs6IbivhpmRH6lZL6Kberm0deZ8RK15AXuErYTHjIWUhy9aUF4wXNI1SfnJP9hgasAdMeHuDBeuE6y0WZCdq5xmF7sF6Dgev7jSRsGUDe8KO5XJxvLoJwuDCqwsWwcq4bgxYcHu9PFuvlhO8eQynuaxKXT4M4i9zKL7qQDiQi9ETK7/WSZpXtMx4xedlSeM4zhNOyyRBFqnsVovxUjR+EyGDRhksu3G7z32KmOBpzg9YLOVUyLKiGWLNY8CE+SEwwriDjV9CfvKRFWkWxfPk08dnQOhaaAsz0g7mn8UPUCozbg7nJ2nE88gLVr8tdIQhxSb8P6pW/yypAYfn3GHUiWHz9U1qpeE0FW77lpueFKbXGls0umjRV9f16M/67nqFUFVjo+kqkUb8h4dPhu/l9w8+vp3CBwMAAA==" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#658c2531adbc1700090e1ad2", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T13:23:15.572Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.544Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TTYvbMBD9K0G92o5lOxuvT6HQQi9toduFbilBtsZBXX0YSU7qBv/3jvwBpXR3L3vzPI3evPdGvpIL1EIP92CdMJpUZJfkZZKRiHjQTHtErDEea9DeDh84AjdplpW0KG+AF7RN07Ssm4wzjk3iufM3+EmxSRkOcmJq1XshASFpGoYfFU6Jv35BoLHAPPBPQVKWZnlMszjb39GsKrJqVyb7XfGAbY6dX25auN4OpLouCndlQ+t93uS3dU2DwiKndVFgMxeuk2z4yFSQw/hGCR3SGLq5DuUYEXPRr8yIqYhWzKS6lzIi53UpdAroEXBQy6QD9O2Z7x1e55a1YTtnJntwQY6pf0LjDyFRP92+4ip/+UNrJAc7xT5tdIxmXM+65ncQO7A4VoJzcaNc0unTZkOWzkcYwkRQJu7YCdz2qUVvLyAboyD2Jp55j8cn+Vf2JQ+hkHo747pXNdiDE7/xhKZleVtGqz8FngVvtTESmD50Vpxxy6TytofVm2cnzOT7j6VkUjAHEzLOb25N6D/hWHa5fybU8V8lY6BEBc7PGiJy9+3zOyQMPqefJ5Ho6XhcjP4Nj38A+G24n4gDAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dad", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.544Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.524Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TXY/TMBD8K8g8kqSNk15zeaqQQOIFkDhOAoSqdbKpzPmjst30QpX/zjpJJYS444W37Ox6PDPrXNgZhTTDPTovrWE122RFlXGWsIAGTCDEWRuoRhPc8K4l4GbNeZWXArsSbsv1el2JQgCvaEg+139JnzkNaduimpg6/VYqJEjZBuijplvSz58IaBxCwPZDlMTXvEhznvLtXc7rktebKttuyq805qH/99DC9Xpg9WVRuKmaXGyLprgVIo8KyyIXZUnDrfRHBcN70FEOtC+0NDGN4TjXsRwTZs/mPzNSKrKTM6k5KZWw/rqUfAroAemiDpRH8h0gnDwdbx10cTs9qBP6KMeKH9iEXUw0TKcvtMrHsOusatFNsU8bHZMZN7MuNL101mhas898f2BL+wGHeA1qmx7hgH711HZXZ1SN1ZgGm86Par9/inTxLjUxrgh/9agV9cxJC3Q7L39SNy/49mabXP1oDBC9CGsVgtkdnexpq6wO7oRXLwEOlMG370sJSoLHCRnnN3ZN5C9hODjfPxPi+KeSMVKSAh9mDQm7+/LxDRE22mfTz5JFT/v9YvZ3ePwFS0oiTngDAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba28", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.524Z" + }, + { + index: "root-headless-cms-en-us-fmfile", + _md: "2023-12-27T12:42:59.703Z", + data: { + compression: "gzip", + value: "H4sIAAAAAAAAA61TXY+UQBD8K2Z8FFgY2FvkaWOiiS9q4nnJacymgWYz3nxsZgb2cMN/twfYxJjzfPGNru6pqaoeLuyMtdDjHVonjGYV2yZ5mXAWMY8atCfEGuOpRu3t+L4l4CblvMyK8gbbIuvSNC3rhrfQ0JB4rv+SPjMaUqZFOTN16p2QSJA0DdBHRbfEXz4T0FgEj+3HIImnPI8zHvPdbcarglfbMtlti6805mD499DK9WZk1WVVuC2brN7lTf66rrOgsMizuihouBXuJGH8ACrIgfaFEjqkMZ6WOpRTxMxZ/2dGSkV0YiHVvZQRG65LyeaAHpAu6kA6JN8efO/oeGuhC9sZQPboghxT/8DG70Oifj59oVU++n1nZIt2jn3e6BQtuF50teAhFo3RiRuObO094BhaqEx8giO6zd9WuzmjbIzC2Jt4eVGHw5OMq2uhiG5D+KtHJamne1Wj3Tvxk7q7PNvm0dWIQg/BRG2MRND7kxUDrZNV3vZ4NeHhSOa/fV9LkAIczsi0PK5rFE+kYOF890x6059KpkBJCpxfNETs9v7TWyJslEvmvyQJlg6H1evv8PQL5bUc+3EDAAA=" + }, + SK: "L", + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dac", + _et: "CmsEntriesElasticsearch", + _ct: "2023-12-27T12:42:59.703Z" + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.ddbPrimaryTableData.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.ddbPrimaryTableData.ts new file mode 100644 index 00000000000..2b550c15fca --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.ddbPrimaryTableData.ts @@ -0,0 +1,2978 @@ +export const ddbPrimaryTableData = [ + { + permissions: [{ name: "*" }], + slug: "full-access", + _et: "SecurityGroup", + name: "Full Access", + _ct: "2023-12-27T12:41:05.020Z", + TYPE: "security.group", + tenant: "root", + system: true, + _md: "2023-12-27T12:41:05.020Z", + createdOn: "2023-12-27T12:41:04.963Z", + GSI1_SK: "full-access", + SK: "A", + description: "Grants full access to all apps.", + webinyVersion: "5.38.2", + id: "658c1b60c39bb10008431b42", + PK: "T#root#GROUP#658c1b60c39bb10008431b42", + GSI1_PK: "T#root#GROUPS" + }, + { + _md: "2023-12-27T12:43:14.870Z", + data: { + path: "/welcome-to-webiny", + value: "658c1bd3c39bb10008431b5b#0001", + tenant: "root", + key: "pb-page" + }, + GSI1_SK: "pb-page#658c1bd3c39bb10008431b5b#0001#/welcome-to-webiny", + SK: "658c1bd3c39bb10008431b5b#0001#/welcome-to-webiny", + PK: "T#root#PS#TAG#pb-page#658c1bd3c39bb10008431b5b#0001#/welcome-to-webiny", + _et: "PrerenderingServiceTagPathLink", + _ct: "2023-12-27T12:43:14.870Z", + TYPE: "ps.tagPathLink", + GSI1_PK: "T#root#PS#TAG" + }, + { + modelId: "acoSearchRecord-pbpage", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:43:00.024Z", + locale: "en-US", + status: "draft", + meta: {}, + values: { + "object@data": { + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@type": "admin", + "text@id": "658c1b73c39bb10008431b44" + }, + "text@id": "658c1bd3c39bb10008431b5c#0001", + "text@title": "Not Found", + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.964Z", + "text@status": "published", + "text@path": "/not-found", + "text@pid": "658c1bd3c39bb10008431b5c", + "datetime@savedOn": "2023-12-27T12:43:00.663Z" + }, + "object@location": { "text@folderId": "root" }, + "text@title": "Not Found", + "text@content": + "Not Found Page not found! Sorry, but the page you were looking for could not be found. TAKE ME HOme", + "text@type": "PbPage", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:43:01.122Z", + TYPE: "L", + entryId: "wby-aco-658c1bd3c39bb10008431b5c", + tenant: "root", + _md: "2023-12-27T12:43:01.122Z", + createdOn: "2023-12-27T12:43:00.024Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "wby-aco-658c1bd3c39bb10008431b5c#0001", + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5c", + modifiedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" } + }, + { + modelId: "acoSearchRecord-pbpage", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:43:00.024Z", + locale: "en-US", + status: "draft", + meta: {}, + values: { + "object@data": { + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@type": "admin", + "text@id": "658c1b73c39bb10008431b44" + }, + "text@id": "658c1bd3c39bb10008431b5c#0001", + "text@title": "Not Found", + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.964Z", + "text@status": "published", + "text@path": "/not-found", + "text@pid": "658c1bd3c39bb10008431b5c", + "datetime@savedOn": "2023-12-27T12:43:00.663Z" + }, + "object@location": { "text@folderId": "root" }, + "text@title": "Not Found", + "text@content": + "Not Found Page not found! Sorry, but the page you were looking for could not be found. TAKE ME HOme", + "text@type": "PbPage", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:43:01.121Z", + TYPE: "cms.entry", + entryId: "wby-aco-658c1bd3c39bb10008431b5c", + tenant: "root", + _md: "2023-12-27T12:43:01.121Z", + createdOn: "2023-12-27T12:43:00.024Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "wby-aco-658c1bd3c39bb10008431b5c#0001", + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5c", + modifiedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" } + }, + { + locale: "en-US", + slug: "static", + layout: "static", + url: "/static/", + _et: "PbCategories", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + name: "Static", + _ct: "2023-12-27T12:42:57.966Z", + TYPE: "pb.category", + tenant: "root", + _md: "2023-12-27T12:42:57.966Z", + createdOn: "2023-12-27T12:42:57.965Z", + SK: "static", + PK: "T#root#L#en-US#PB#C" + }, + { + content: { + compression: "jsonpack", + content: + "id|h0HqpItbGT|type|document|data|settings|elements|ZlkwCyXhhc|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|horizontalAlignFlex|center|verticalAlign|flex-start|pwR8zBN28v|grid|1100px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|6838kMd5Vh|cell|80px|size|iG8DLRffpF|heading|text|typography|heading1|alignment|tag|h1|color|color3|Page+not+found!|9UHkb1nlN1|paragraph|paragraph1|div|Sorry,+but+the+page+you+were+looking+for+could+not+be+found.|PkNZ6zIVWv|button|buttonText|TAKE+ME+HOme|30px|link|href|/|primary^C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|N|$A|O]|P|$A|Q]]]|6|@$0|R|2|S|4|$5|$9|$A|$B|T]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|S|$U|V]|W|$A|$X|Y]|Z|$X|10]]|N|$A|Q]|P|$A|Q]]]|6|@$0|11|2|12|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|E|13]]|S|$14|1U]]]|6|@$0|15|2|16|4|$17|$A|$2|16|18|19|1A|O|1B|1C|1D|1E]|4|$17|1F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|1G|2|1H|4|$17|$A|$2|1H|18|1I|1A|O|1B|1J|1D|1E]|4|$17|1K]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|1L|2|1M|4|$1N|1O|5|$D|$A|$L|F|J|-1|E|1P]]|N|$A|O]]|1Q|$1R|1S]|2|1T]|6|@]]]]]]]]]]" + }, + status: "published", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + TYPE: "pb.page.l", + _md: "2023-12-27T12:43:00.681Z", + SK: "L", + publishedOn: "2023-12-27T12:43:00.663Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5c#0001", + version: 1, + settings: { seo: { meta: [] }, general: { layout: "static" }, social: { meta: [] } }, + path: "/not-found", + savedOn: "2023-12-27T12:43:00.663Z", + locale: "en-US", + pid: "658c1bd3c39bb10008431b5c", + _et: "PbPages", + _ct: "2023-12-27T12:43:00.681Z", + tenant: "root", + createdOn: "2023-12-27T12:42:59.964Z", + locked: true, + category: "static", + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + webinyVersion: "5.38.2", + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5c", + title: "Not Found" + }, + { + content: { + compression: "jsonpack", + content: + "id|h0HqpItbGT|type|document|data|settings|elements|ZlkwCyXhhc|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|horizontalAlignFlex|center|verticalAlign|flex-start|pwR8zBN28v|grid|1100px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|6838kMd5Vh|cell|80px|size|iG8DLRffpF|heading|text|typography|heading1|alignment|tag|h1|color|color3|Page+not+found!|9UHkb1nlN1|paragraph|paragraph1|div|Sorry,+but+the+page+you+were+looking+for+could+not+be+found.|PkNZ6zIVWv|button|buttonText|TAKE+ME+HOme|30px|link|href|/|primary^C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|N|$A|O]|P|$A|Q]]]|6|@$0|R|2|S|4|$5|$9|$A|$B|T]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|S|$U|V]|W|$A|$X|Y]|Z|$X|10]]|N|$A|Q]|P|$A|Q]]]|6|@$0|11|2|12|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|E|13]]|S|$14|1U]]]|6|@$0|15|2|16|4|$17|$A|$2|16|18|19|1A|O|1B|1C|1D|1E]|4|$17|1F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|1G|2|1H|4|$17|$A|$2|1H|18|1I|1A|O|1B|1J|1D|1E]|4|$17|1K]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|1L|2|1M|4|$1N|1O|5|$D|$A|$L|F|J|-1|E|1P]]|N|$A|O]]|1Q|$1R|1S]|2|1T]|6|@]]]]]]]]]]" + }, + status: "published", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + TYPE: "pb.page.p", + _md: "2023-12-27T12:43:00.682Z", + SK: "P", + publishedOn: "2023-12-27T12:43:00.663Z", + id: "658c1bd3c39bb10008431b5c#0001", + editor: "page-builder", + version: 1, + settings: { seo: { meta: [] }, general: { layout: "static" }, social: { meta: [] } }, + path: "/not-found", + locale: "en-US", + savedOn: "2023-12-27T12:43:00.663Z", + pid: "658c1bd3c39bb10008431b5c", + _et: "PbPages", + _ct: "2023-12-27T12:43:00.682Z", + tenant: "root", + createdOn: "2023-12-27T12:42:59.964Z", + locked: true, + category: "static", + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + webinyVersion: "5.38.2", + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5c", + title: "Not Found" + }, + { + content: { + compression: "jsonpack", + content: + "id|h0HqpItbGT|type|document|data|settings|elements|ZlkwCyXhhc|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|horizontalAlignFlex|center|verticalAlign|flex-start|pwR8zBN28v|grid|1100px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|6838kMd5Vh|cell|80px|size|iG8DLRffpF|heading|text|typography|heading1|alignment|tag|h1|color|color3|Page+not+found!|9UHkb1nlN1|paragraph|paragraph1|div|Sorry,+but+the+page+you+were+looking+for+could+not+be+found.|PkNZ6zIVWv|button|buttonText|TAKE+ME+HOme|30px|link|href|/|primary^C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|N|$A|O]|P|$A|Q]]]|6|@$0|R|2|S|4|$5|$9|$A|$B|T]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|S|$U|V]|W|$A|$X|Y]|Z|$X|10]]|N|$A|Q]|P|$A|Q]]]|6|@$0|11|2|12|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|E|13]]|S|$14|1U]]]|6|@$0|15|2|16|4|$17|$A|$2|16|18|19|1A|O|1B|1C|1D|1E]|4|$17|1F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|1G|2|1H|4|$17|$A|$2|1H|18|1I|1A|O|1B|1J|1D|1E]|4|$17|1K]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|1L|2|1M|4|$1N|1O|5|$D|$A|$L|F|J|-1|E|1P]]|N|$A|O]]|1Q|$1R|1S]|2|1T]|6|@]]]]]]]]]]" + }, + status: "published", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + TYPE: "pb.page", + _md: "2023-12-27T12:43:00.681Z", + SK: "REV#0001", + publishedOn: "2023-12-27T12:43:00.663Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5c#0001", + version: 1, + settings: { seo: { meta: [] }, general: { layout: "static" }, social: { meta: [] } }, + path: "/not-found", + savedOn: "2023-12-27T12:43:00.663Z", + locale: "en-US", + pid: "658c1bd3c39bb10008431b5c", + _et: "PbPages", + _ct: "2023-12-27T12:43:00.681Z", + tenant: "root", + createdOn: "2023-12-27T12:42:59.964Z", + locked: true, + category: "static", + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + webinyVersion: "5.38.2", + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5c", + title: "Not Found" + }, + { + locale: "en-US", + slug: "main-menu", + _et: "PbMenus", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + items: [], + _ct: "2023-12-27T12:42:59.821Z", + TYPE: "pb.menu", + tenant: "root", + _md: "2023-12-27T12:42:59.821Z", + createdOn: "2023-12-27T12:42:59.821Z", + SK: "main-menu", + description: "The main menu of the website, containing links to most important pages.", + PK: "T#root#L#en-US#PB#M", + title: "Main Menu" + }, + { + _md: "2023-12-27T12:27:56.881Z", + data: { + context: { + logGroupName: "/aws/lambda/wby-data-migration-db1144d", + logStreamName: "2023/12/27/[$LATEST]4230e2d1a850456aa079f8fd4356284d" + }, + id: "658c184c554a6d00083aa519", + finishedOn: "2023-12-27T12:27:56.881Z", + startedOn: "2023-12-27T12:27:56.797Z", + migrations: [ + { id: "5.35.0-001", status: "not-applicable" }, + { id: "5.35.0-002", status: "not-applicable" }, + { id: "5.35.0-003", status: "not-applicable" }, + { id: "5.35.0-004", status: "not-applicable" }, + { id: "5.35.0-005", status: "not-applicable" }, + { id: "5.35.0-006", status: "not-applicable" }, + { id: "5.36.0-001", status: "not-applicable" }, + { id: "5.37.0-001", status: "not-applicable" }, + { id: "5.37.0-002", status: "not-applicable" }, + { id: "5.37.0-003", status: "not-applicable" }, + { id: "5.37.0-004", status: "not-applicable" }, + { id: "5.37.0-005", status: "not-applicable" }, + { id: "5.38.0-001", status: "not-applicable" }, + { id: "5.38.0-002", status: "not-applicable" }, + { id: "5.38.0-003", status: "not-applicable" } + ], + status: "done" + }, + GSI1_SK: "658c184c554a6d00083aa519", + SK: "A", + PK: "MIGRATION_RUN#658c184c554a6d00083aa519", + _et: "MigrationRun", + _ct: "2023-12-27T12:27:56.881Z", + TYPE: "migration.run", + GSI1_PK: "MIGRATION_RUNS" + }, + { + tenant: "root", + _md: "2023-12-27T12:43:01.966Z", + locale: "en-US", + reCaptcha: { secretKey: null, enabled: null, siteKey: null }, + SK: "default", + PK: "T#root#L#en-US#FB#SETTINGS", + _et: "FormBuilderSettings", + _ct: "2023-12-27T12:43:01.966Z", + domain: "https://d3hohw12noi930.cloudfront.net" + }, + { + _md: "2023-12-27T12:43:19.484Z", + data: { path: "/", value: "main-menu", tenant: "root", key: "pb-menu" }, + GSI1_SK: "pb-menu#main-menu#/", + SK: "main-menu#/", + PK: "T#root#PS#TAG#pb-menu#main-menu#/", + _et: "PrerenderingServiceTagPathLink", + _ct: "2023-12-27T12:43:19.484Z", + TYPE: "ps.tagPathLink", + GSI1_PK: "T#root#PS#TAG" + }, + { + permissions: [], + slug: "anonymous", + _et: "SecurityGroup", + name: "Anonymous", + _ct: "2023-12-27T12:41:05.147Z", + TYPE: "security.group", + tenant: "root", + system: true, + _md: "2023-12-27T12:41:05.147Z", + createdOn: "2023-12-27T12:41:05.146Z", + GSI1_SK: "anonymous", + SK: "A", + description: "Permissions for anonymous users (public access).", + webinyVersion: "5.38.2", + id: "658c1b61c39bb10008431b43", + PK: "T#root#GROUP#658c1b61c39bb10008431b43", + GSI1_PK: "T#root#GROUPS" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg", + "text@aliases": [], + "number@size": 17711, + "text@name": "security.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.007Z", + TYPE: "cms.entry.l", + entryId: "6022814bef4a940008b3ba27", + tenant: "root", + _md: "2023-12-27T12:42:59.007Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "6022814bef4a940008b3ba27#0001", + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba27" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg", + "text@aliases": [], + "number@size": 17711, + "text@name": "security.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.007Z", + TYPE: "cms.entry", + entryId: "6022814bef4a940008b3ba27", + tenant: "root", + _md: "2023-12-27T12:42:59.007Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "6022814bef4a940008b3ba27#0001", + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba27" + }, + { + modelId: "modelA", + pluralApiName: "ModelAs", + group: { name: "Ungrouped", id: "658c1bcbc39bb10008431b45" }, + descriptionFieldId: "description", + imageFieldId: "image", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + name: "ModelA", + TYPE: "cms.model", + titleFieldId: "title", + fields: [ + { + multipleValues: false, + listValidation: [], + settings: {}, + renderer: { name: "text-input" }, + helpText: null, + predefinedValues: { enabled: false, values: [] }, + label: "Title", + type: "text", + tags: [], + placeholderText: null, + id: "f2qcuuzs", + validation: [ + { name: "required", message: "Title is a required field.", settings: {} } + ], + storageId: "text@f2qcuuzs", + fieldId: "title" + }, + { + multipleValues: false, + listValidation: [], + settings: {}, + renderer: { name: "long-text-text-area" }, + helpText: null, + predefinedValues: { enabled: false, values: [] }, + label: "Description", + type: "long-text", + tags: [], + placeholderText: null, + id: "z2tdm05d", + validation: [], + storageId: "long-text@z2tdm05d", + fieldId: "description" + }, + { + multipleValues: false, + listValidation: [], + settings: { imagesOnly: true }, + renderer: { name: "file-input" }, + helpText: null, + predefinedValues: { enabled: false, values: [] }, + label: "Image", + type: "file", + tags: [], + placeholderText: null, + id: "8y67xrmj", + validation: [], + storageId: "file@8y67xrmj", + fieldId: "image" + } + ], + _md: "2023-12-27T13:20:12.156Z", + SK: "modelA", + singularApiName: "ModelA", + tags: ["type:model"], + locale: "en-US", + savedOn: "2023-12-27T13:18:39.298Z", + layout: [["f2qcuuzs"], ["z2tdm05d", "8y67xrmj"]], + lockedFields: [ + { multipleValues: false, type: "text", fieldId: "text@f2qcuuzs" }, + { multipleValues: false, type: "long-text", fieldId: "long-text@z2tdm05d" }, + { multipleValues: false, type: "file", fieldId: "file@8y67xrmj" } + ], + _et: "CmsModels", + _ct: "2023-12-27T13:20:12.156Z", + tenant: "root", + createdOn: "2023-12-27T13:18:26.594Z", + webinyVersion: "5.38.2", + PK: "T#root#L#en-US#CMS#CM" + }, + { + modelId: "modelB", + pluralApiName: "ModelBs", + group: { name: "Ungrouped", id: "658c1bcbc39bb10008431b45" }, + descriptionFieldId: "description", + imageFieldId: "image", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + name: "ModelB", + TYPE: "cms.model", + titleFieldId: "title", + fields: [ + { + multipleValues: false, + listValidation: [], + settings: {}, + renderer: { name: "text-input" }, + helpText: null, + predefinedValues: { enabled: false, values: [] }, + label: "Title", + type: "text", + tags: [], + placeholderText: null, + id: "4dep2w2h", + validation: [ + { name: "required", message: "Title is a required field.", settings: {} } + ], + storageId: "text@4dep2w2h", + fieldId: "title" + }, + { + multipleValues: false, + listValidation: [], + settings: {}, + renderer: { name: "long-text-text-area" }, + helpText: null, + predefinedValues: { enabled: false, values: [] }, + label: "Description", + type: "long-text", + tags: [], + placeholderText: null, + id: "7c5t8wwa", + validation: [], + storageId: "long-text@7c5t8wwa", + fieldId: "description" + }, + { + multipleValues: false, + listValidation: [], + settings: { imagesOnly: true }, + renderer: { name: "file-input" }, + helpText: null, + predefinedValues: { enabled: false, values: [] }, + label: "Image", + type: "file", + tags: [], + placeholderText: null, + id: "5atpz8nu", + validation: [], + storageId: "file@5atpz8nu", + fieldId: "image" + } + ], + _md: "2023-12-27T13:22:45.032Z", + SK: "modelB", + singularApiName: "ModelB", + tags: ["type:model"], + locale: "en-US", + savedOn: "2023-12-27T13:21:46.459Z", + layout: [["4dep2w2h"], ["7c5t8wwa", "5atpz8nu"]], + lockedFields: [ + { multipleValues: false, type: "text", fieldId: "text@4dep2w2h" }, + { multipleValues: false, type: "long-text", fieldId: "long-text@7c5t8wwa" }, + { multipleValues: false, type: "file", fieldId: "file@5atpz8nu" } + ], + _et: "CmsModels", + _ct: "2023-12-27T13:22:45.032Z", + tenant: "root", + createdOn: "2023-12-27T13:21:39.663Z", + webinyVersion: "5.38.2", + PK: "T#root#L#en-US#CMS#CM" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg", + "text@aliases": [], + "number@size": 27804, + "text@name": "developer.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.262Z", + TYPE: "cms.entry.l", + entryId: "60228145f98841000981c721", + tenant: "root", + _md: "2023-12-27T12:42:59.262Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "60228145f98841000981c721#0001", + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c721" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg", + "text@aliases": [], + "number@size": 27804, + "text@name": "developer.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.261Z", + TYPE: "cms.entry", + entryId: "60228145f98841000981c721", + tenant: "root", + _md: "2023-12-27T12:42:59.261Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "60228145f98841000981c721#0001", + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c721" + }, + { + tenant: "root", + version: "5.38.2", + _md: "2023-12-27T12:41:24.444Z", + SK: "ADMIN_USERS", + PK: "T#root#SYSTEM", + _et: "AdminUsers.System", + _ct: "2023-12-27T12:41:24.444Z", + TYPE: "adminUsers.system" + }, + { + tenant: "root", + version: "5.38.2", + _md: "2023-12-27T12:42:51.969Z", + SK: "CMS", + PK: "T#root#SYSTEM", + _et: "CmsSystem", + _ct: "2023-12-27T12:42:51.969Z" + }, + { + tenant: "root", + version: "5.38.2", + _md: "2023-12-27T12:43:01.981Z", + SK: "FB", + PK: "T#root#SYSTEM", + _et: "FormBuilderSystem", + _ct: "2023-12-27T12:43:01.981Z" + }, + { + tenant: "root", + version: "5.38.2", + _md: "2023-12-27T12:42:52.301Z", + SK: "FM", + PK: "T#root#SYSTEM", + _et: "System", + _ct: "2023-12-27T12:42:52.301Z" + }, + { + tenant: "root", + version: "5.38.2", + _md: "2023-12-27T12:42:49.990Z", + SK: "I18N", + PK: "T#root#SYSTEM", + _et: "I18NSystem", + _ct: "2023-12-27T12:42:49.990Z" + }, + { + tenant: "root", + version: "5.38.2", + _md: "2023-12-27T12:43:01.256Z", + SK: "PB", + PK: "T#root#SYSTEM", + _et: "PbSystem", + _ct: "2023-12-27T12:43:01.256Z" + }, + { + tenant: "root", + version: "5.38.2", + installedOn: "2023-12-27T12:41:05.169Z", + _md: "2023-12-27T12:41:05.169Z", + SK: "SECURITY", + PK: "T#root#SYSTEM", + _et: "SecuritySystem", + _ct: "2023-12-27T12:41:05.169Z" + }, + { + version: "5.38.2", + _md: "2023-12-27T12:40:58.981Z", + SK: "TENANCY", + PK: "T#root#SYSTEM", + _et: "TenancySystem", + _ct: "2023-12-27T12:40:58.981Z" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg", + "text@aliases": [], + "number@size": 1864, + "text@name": "hero-block-bg.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:58.903Z", + TYPE: "cms.entry.l", + entryId: "6022814b7a77e60008f70d62", + tenant: "root", + _md: "2023-12-27T12:42:58.903Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "6022814b7a77e60008f70d62#0001", + PK: "T#root#L#en-US#CMS#CME#6022814b7a77e60008f70d62" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg", + "text@aliases": [], + "number@size": 1864, + "text@name": "hero-block-bg.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:58.903Z", + TYPE: "cms.entry", + entryId: "6022814b7a77e60008f70d62", + tenant: "root", + _md: "2023-12-27T12:42:58.903Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "6022814b7a77e60008f70d62#0001", + PK: "T#root#L#en-US#CMS#CME#6022814b7a77e60008f70d62" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg", + "text@aliases": [], + "number@size": 888, + "text@name": "feature-card-bg.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:58.944Z", + TYPE: "cms.entry.l", + entryId: "602282e07a77e60008f70d63", + tenant: "root", + _md: "2023-12-27T12:42:58.944Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "602282e07a77e60008f70d63#0001", + PK: "T#root#L#en-US#CMS#CME#602282e07a77e60008f70d63" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg", + "text@aliases": [], + "number@size": 888, + "text@name": "feature-card-bg.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:58.944Z", + TYPE: "cms.entry", + entryId: "602282e07a77e60008f70d63", + tenant: "root", + _md: "2023-12-27T12:42:58.944Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "602282e07a77e60008f70d63#0001", + PK: "T#root#L#en-US#CMS#CME#602282e07a77e60008f70d63" + }, + { + _md: "2023-12-27T12:43:14.870Z", + data: { path: "/welcome-to-webiny", value: "main-menu", tenant: "root", key: "pb-menu" }, + GSI1_SK: "pb-menu#main-menu#/welcome-to-webiny", + SK: "main-menu#/welcome-to-webiny", + PK: "T#root#PS#TAG#pb-menu#main-menu#/welcome-to-webiny", + _et: "PrerenderingServiceTagPathLink", + _ct: "2023-12-27T12:43:14.870Z", + TYPE: "ps.tagPathLink", + GSI1_PK: "T#root#PS#TAG" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:25.701Z", + locale: "en-US", + status: "published", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 2" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:25.735Z", + entryId: "658c24996607be00087f1167", + tenant: "root", + _md: "2023-12-27T13:20:25.735Z", + createdOn: "2023-12-27T13:20:25.235Z", + locked: true, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + publishedOn: "2023-12-27T13:20:25.701Z", + webinyVersion: "5.38.2", + id: "658c24996607be00087f1167#0001", + PK: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:25.701Z", + locale: "en-US", + status: "published", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 2" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:25.724Z", + TYPE: "cms.entry.p", + entryId: "658c24996607be00087f1167", + tenant: "root", + _md: "2023-12-27T13:20:25.724Z", + createdOn: "2023-12-27T13:20:25.235Z", + locked: true, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "P", + publishedOn: "2023-12-27T13:20:25.701Z", + webinyVersion: "5.38.2", + id: "658c24996607be00087f1167#0001", + PK: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:25.701Z", + locale: "en-US", + status: "published", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 2" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:25.723Z", + TYPE: "cms.entry", + entryId: "658c24996607be00087f1167", + tenant: "root", + _md: "2023-12-27T13:20:25.723Z", + createdOn: "2023-12-27T13:20:25.235Z", + locked: true, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + publishedOn: "2023-12-27T13:20:25.701Z", + webinyVersion: "5.38.2", + id: "658c24996607be00087f1167#0001", + PK: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg", + "text@aliases": [], + "number@size": 28918, + "text@name": "adaptable-icon.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.105Z", + TYPE: "cms.entry.l", + entryId: "60228145f98841000981c720", + tenant: "root", + _md: "2023-12-27T12:42:59.105Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "60228145f98841000981c720#0001", + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c720" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg", + "text@aliases": [], + "number@size": 28918, + "text@name": "adaptable-icon.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.105Z", + TYPE: "cms.entry", + entryId: "60228145f98841000981c720", + tenant: "root", + _md: "2023-12-27T12:42:59.105Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "60228145f98841000981c720#0001", + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c720" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg", + "text@aliases": [], + "number@size": 67402, + "text@name": "permission-icon.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.202Z", + TYPE: "cms.entry.l", + entryId: "602281486ed41f0008bc2dab", + tenant: "root", + _md: "2023-12-27T12:42:59.202Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "602281486ed41f0008bc2dab#0001", + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dab" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg", + "text@aliases": [], + "number@size": 67402, + "text@name": "permission-icon.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.202Z", + TYPE: "cms.entry", + entryId: "602281486ed41f0008bc2dab", + tenant: "root", + _md: "2023-12-27T12:42:59.202Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "602281486ed41f0008bc2dab#0001", + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dab" + }, + { + tenant: "root", + code: "en-US", + _md: "2023-12-27T12:42:49.523Z", + default: true, + createdOn: "2023-12-27T12:42:48.245Z", + SK: "default", + webinyVersion: "5.38.2", + PK: "T#root#I18N#L#D", + _et: "I18NLocale", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:49.523Z" + }, + { + SK: "default", + eventTargetId: "wby-apw-scheduler-event-rule-target-34a2e04", + PK: "APW#SETTINGS", + mainGraphqlFunctionArn: + "arn:aws:lambda:eu-central-1:674320871285:function:wby-graphql-670ccd3", + eventRuleName: "wby-apw-scheduler-event-rule-3889a7f" + }, + { + modelId: "acoSearchRecord-pbpage", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:43:00.006Z", + locale: "en-US", + status: "draft", + meta: {}, + values: { + "object@data": { + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@type": "admin", + "text@id": "658c1b73c39bb10008431b44" + }, + "text@id": "658c1bd3c39bb10008431b5b#0001", + "text@title": "Welcome to Webiny", + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.947Z", + "text@status": "published", + "text@path": "/welcome-to-webiny", + "text@pid": "658c1bd3c39bb10008431b5b", + "datetime@savedOn": "2023-12-27T12:43:00.723Z" + }, + "object@location": { "text@folderId": "root" }, + "text@title": "Welcome to Webiny", + "text@content": + "Welcome to Webiny Welcome to Webiny Webiny makes it easy to build applications and websites on top of the serverless infrastructure by providing you with a ready-made CMS and a development framework. Scalable Webiny apps can scale to handle the most demanding workloads. No custom tooling required Webiny eliminates the need to build custom tooling to create serverless app Cost effective Webiny apps run on serverless infrastructure which costs 80% less than VMs Resolves serverless challenges Webiny removes all the challenges of building serverless applications Get to know Webiny products Architect. Code. Deploy. Webiny Serverless Application Framework Everything you need to create and deploy applications on top of the serverless infrastructure.  Use it to build: Full-stack applicationsMulti-tenant solutions APIsMicroservice Learn more An easier way to build serverless apps There are many solutions that help you run, deploy and monitor serverless functions, but when it comes to actually coding one, there are none. Webiny is a solution that helps you code your serverless app by providing you with all the components like ACL, routing, file storage and many more. Framework features Users, groups, roles & scopes Security is a crucial layer in any application. Webiny includes a full-featured security module that's connected to the built-in GraphQL API.Users, groups, roles & scopes Scaffolding Quickly generate boilerplate code using CLI plugins. From lambda functions to new GraphQL APIs. Customizable security Use the default AWS Cognito, or replace with 3rd party identity providers like Okta, Auth0, etc. Using plugins you can make Webiny work with any identity provider. Multiple environments No code change goes directly into a production environment. Webiny CLI makes it easy to manage and create multiple environments for your project. One size doesn't fit all It's a very different set of requirements a technical team has to a marketing team to a business development team. Webiny Serverless CMS comes with several different apps you can use independently, or together as part of a cohesive solution. Webiny Serverless CMS A suite of applications to help you manage your content. Use it to build: Marketing sites Multi-website solutions Content hubs Multi-language sites Intranet portals Headless content models Learn more CMS benefits Scalable No matter the demand, Webiny Serverless CMS can easily scale to meet even the most challenging workloads. Adaptable Being an open-source project, it's easy to modify and adapt things to your own needs. Low cost of ownership Self-hosted on top of serverless infrastructure. No infrastructure to mange, less people required to operate and maintain. Secure Secured by AWS Cognito. It's also easy to integrate services like OKTA, Auth0 and similar. Data ownership Webiny is self-hosted, it means your data stays within your data center. Permission control Powerful options to control the permissions your users will have. They perfectly align with your business requirements.  Serverless makes infrastructure easy, Webiny makes serverless easy 1. Developer-friendly Webiny has been made with the developer in mind. It helps them develop serverless applications with ease. 2. Open source Webiny is created and maintained by an amazing group of people. Being open source means Webiny grows and evolves much faster. Contributor are welcome. 3. Community We have an active community on slack. Talk to the core-team, and get help. Webiny team is always there for any questions. View Webiny on GitHub", + "text@type": "PbPage", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:43:01.107Z", + TYPE: "L", + entryId: "wby-aco-658c1bd3c39bb10008431b5b", + tenant: "root", + _md: "2023-12-27T12:43:01.107Z", + createdOn: "2023-12-27T12:43:00.006Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "wby-aco-658c1bd3c39bb10008431b5b#0001", + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5b", + modifiedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" } + }, + { + modelId: "acoSearchRecord-pbpage", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:43:00.006Z", + locale: "en-US", + status: "draft", + meta: {}, + values: { + "object@data": { + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@type": "admin", + "text@id": "658c1b73c39bb10008431b44" + }, + "text@id": "658c1bd3c39bb10008431b5b#0001", + "text@title": "Welcome to Webiny", + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.947Z", + "text@status": "published", + "text@path": "/welcome-to-webiny", + "text@pid": "658c1bd3c39bb10008431b5b", + "datetime@savedOn": "2023-12-27T12:43:00.723Z" + }, + "object@location": { "text@folderId": "root" }, + "text@title": "Welcome to Webiny", + "text@content": + "Welcome to Webiny Welcome to Webiny Webiny makes it easy to build applications and websites on top of the serverless infrastructure by providing you with a ready-made CMS and a development framework. Scalable Webiny apps can scale to handle the most demanding workloads. No custom tooling required Webiny eliminates the need to build custom tooling to create serverless app Cost effective Webiny apps run on serverless infrastructure which costs 80% less than VMs Resolves serverless challenges Webiny removes all the challenges of building serverless applications Get to know Webiny products Architect. Code. Deploy. Webiny Serverless Application Framework Everything you need to create and deploy applications on top of the serverless infrastructure.  Use it to build: Full-stack applicationsMulti-tenant solutions APIsMicroservice Learn more An easier way to build serverless apps There are many solutions that help you run, deploy and monitor serverless functions, but when it comes to actually coding one, there are none. Webiny is a solution that helps you code your serverless app by providing you with all the components like ACL, routing, file storage and many more. Framework features Users, groups, roles & scopes Security is a crucial layer in any application. Webiny includes a full-featured security module that's connected to the built-in GraphQL API.Users, groups, roles & scopes Scaffolding Quickly generate boilerplate code using CLI plugins. From lambda functions to new GraphQL APIs. Customizable security Use the default AWS Cognito, or replace with 3rd party identity providers like Okta, Auth0, etc. Using plugins you can make Webiny work with any identity provider. Multiple environments No code change goes directly into a production environment. Webiny CLI makes it easy to manage and create multiple environments for your project. One size doesn't fit all It's a very different set of requirements a technical team has to a marketing team to a business development team. Webiny Serverless CMS comes with several different apps you can use independently, or together as part of a cohesive solution. Webiny Serverless CMS A suite of applications to help you manage your content. Use it to build: Marketing sites Multi-website solutions Content hubs Multi-language sites Intranet portals Headless content models Learn more CMS benefits Scalable No matter the demand, Webiny Serverless CMS can easily scale to meet even the most challenging workloads. Adaptable Being an open-source project, it's easy to modify and adapt things to your own needs. Low cost of ownership Self-hosted on top of serverless infrastructure. No infrastructure to mange, less people required to operate and maintain. Secure Secured by AWS Cognito. It's also easy to integrate services like OKTA, Auth0 and similar. Data ownership Webiny is self-hosted, it means your data stays within your data center. Permission control Powerful options to control the permissions your users will have. They perfectly align with your business requirements.  Serverless makes infrastructure easy, Webiny makes serverless easy 1. Developer-friendly Webiny has been made with the developer in mind. It helps them develop serverless applications with ease. 2. Open source Webiny is created and maintained by an amazing group of people. Being open source means Webiny grows and evolves much faster. Contributor are welcome. 3. Community We have an active community on slack. Talk to the core-team, and get help. Webiny team is always there for any questions. View Webiny on GitHub", + "text@type": "PbPage", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:43:01.107Z", + TYPE: "cms.entry", + entryId: "wby-aco-658c1bd3c39bb10008431b5b", + tenant: "root", + _md: "2023-12-27T12:43:01.107Z", + createdOn: "2023-12-27T12:43:00.006Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "wby-aco-658c1bd3c39bb10008431b5b#0001", + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5b", + modifiedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" } + }, + { + _md: "2023-12-27T12:43:19.454Z", + data: { + path: "/", + files: [ + { + name: "index.html", + type: "text/html", + meta: { + tags: [ + { value: "658c1bd3c39bb10008431b5b#0001", key: "pb-page" }, + { value: "main-menu", key: "pb-menu" } + ] + } + }, + { name: "graphql.json", type: "application/json", meta: {} } + ], + locale: "en-US", + tenant: "root" + }, + GSI1_SK: "/", + SK: "A", + PK: "T#root#PS#RENDER#/", + _et: "PrerenderingServiceRender", + _ct: "2023-12-27T12:43:19.454Z", + TYPE: "ps.render", + GSI1_PK: "T#root#PS#RENDER" + }, + { + content: { + compression: "jsonpack", + content: + 'id|Fv1PpPWu-|type|document|data|settings|elements|xqt7BI4iN9|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|100px|275px|16px|tablet|horizontalAlignFlex|center|verticalAlign|flex-start|background|image|file|6022814b7a77e60008f70d62|src|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg|gdE7Q7rcA|grid|1100px|20px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|_fbQO4Nlpp|cell|size|cdk_pclqE|6022814b0df4b000088735bc|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg|height|44px|ovLRNqyVu3|wmMU13uZ10|1eUZzAvoB|heading|text|typography|heading1|alignment|tag|h1|color|color6|Welcome+to+Webiny|F6ZREnQcc|64px|oEgjDLVXUu|0xYOozhJw|paragraph|paragraph1|div|Webiny+makes+it+easy+to+build+applications+and+websites+on+top+of+the+serverless+infrastructure+by+providing+you+with+a+ready-made+CMS+and+a+development+framework.
|20%25|20%25|gwhTOrZvc|30px|6-6|EaIMtHtOIw|-8px|px|602282e07a77e60008f70d63|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg|8k7zxQUTm|heading6|h6|Scalable|qNngQ1C-5|paragraph2|Webiny+apps+can+scale+to+handle+the+most+demanding+workloads.
|uBv_VRv0i|8px|iQaW4vjKg|No+custom+tooling+required|Wy3Tw-Lb8|Webiny+eliminates+the+need+to+build+custom+tooling+to+create+serverless+app
|uwrjoSZkB|Q39eQZm_8z|zSVZIwnSQ0|Cost+effective|S-Ydr4kX6k|Webiny+apps+run+on+serverless+infrastructure+which+costs+80%25+less+than+VMs
|nUX2JXYjhD|8z0hL8l7ay|Resolves+serverless+challenges|04ZNIcAGE_|Webiny+removes+all+the+challenges+of+building+serverless+applications
|vm0cFfH8KG|100%25|65px|75px|txeqybzKr3|80px|wMjC2uv8cj|Pm7ws20iA|color3|Get+to+know+Webiny+products|6CPpd558B|heading2|h2|Architect.+Code.+Deploy.|1e0_OJgMx|gpYd80MXeg|40px|15px|kAYc-QClR|4-8|border|style|solid|rgba(229,+229,+229,+1)|1|8i803wClVt|p55J-BkDn|6022814a0df4b000088735bb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg|90px|link|8nddxG64r|PR-yiR65n|heading3|h3|Webiny+Serverless+

Application+Framework|pVH9_fFLM|x0SSJvgrdD|b0iE8vr2S|Everything+you+need+to+create+and+deploy+applications+on+top+of+the+serverless+infrastructure. 
|JMSKwWsT_|OU70Y990tA|T_M_Ww4Wb|heading4|h4|Use+it+to+build:|806nmKOyc|g59JmcyM-7|Cyziie_SK|list|

|ST0O1ZeCk|ILrAABWXiX||XxXGeIywO|9H5t3COdbo|mc0_RS9rg|button|buttonText|Learn+more|50px|href|https://www.webiny.com/serverless-application-framework/|newTab|primary|icon|fas|long-arrow-alt-right|svg||position|16|Kg3rMc1Re|LAcQHMs8K|8oaRz-Gko_|9fQ9W-xiB|6022814891bd1300087bd24c|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg|YCG34DB89|xvBXD_QTkN|GqW2LBMzV|An+easier+way+to+build+serverless+apps|9cWYQwXUd|There+are+many+solutions+that+help+you+run,+deploy+and+monitor+serverless+functions,+but+when+it+comes+to+actually+coding+one,+there+are+none.+Webiny+is+a+solution+that+helps+you+code+your+serverless+app+by+providing+you+with+all+the+components+like+ACL,+routing,+file+storage+and+many+more.
|LxqyquKlYy|100%25|60px|177px|60228148f98841000981c723|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg|yqrzxoDllE|70px|bD-TQmZyW8|4ESAx7NxM|Framework+features|Xr7NLMpzm|3-3-3-3|_RtRioPOsj|12px|mOr47ImJK|AlTNw-76F8|r0e8MiCuK|6022814bef4a940008b3ba27|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg|170px|QFwbqHtSh|DH-C0-mBsO|XSN-oY3V3|Users,+groups,+roles+&+scopes|Unyhp8o-a|Security+is+a+crucial+layer+in+any+application.+Webiny+includes+a+full-featured+security+module+that\'s+connected+to+the+built-in+GraphQL+API.Users,+groups,+roles+&+scopes
|Ntcduee0-|0b66dbGkG|PoRqI9i2xE|0ZpnBSqjoz|6022814bef4a940008b3ba26|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg|FFGobMHHI|IWxl_nrRkr|I5btsZceI|Scaffolding|5qvaQSnP6|Quickly+generate+boilerplate+code+using+CLI+plugins.+From+lambda+functions+to+new+GraphQL+APIs.
|YHUznp7ZM5|PlxqV_uS7B|zKQYI-EIFl|frRuzWpRI|60228148f98841000981c724|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg|M1tvv840H|fwreagGdac|6H1tgEViY|Customizable+security|h0Ctka4TED|Use+the+default+AWS+Cognito,+or+replace+with+3rd+party+identity+providers+like+Okta,+Auth0,+etc.+Using+plugins+you+can+make+Webiny+work+with+any+identity+provider.
|SyyrOA60AF|GvU31fd4U|1vAxZAkD9O|dlI-qhVLKy|6022814bef4a940008b3ba28|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg|ftA7NOOxG|WU58SBDPP8|QtYfpt1yoE|Multiple+environments|mmpGUzg6o1|No+code+change+goes+directly+into+a+production+environment.+Webiny+CLI+makes+it+easy+to+manage+and+create+multiple+environments+for+your+project.
|wYK9BhaanZ|100%25|125px|ur1DQFl5BR|TzBvXtU2PH|-PU3iBlQ4|A6sNR3MR-5|Xtqk_itss|602281486ed41f0008bc2dad|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png|495px|bsKTDygik|ev9nhHISRw|1BBr9ACuM|One+size+doesn\'t+fit+all|0olguTqDN|It\'s+a+very+different+set+of+requirements+a+technical+team+has+to+a+marketing+team+to+a+business+development+team.+Webiny+Serverless+CMS+comes+with+several+different+apps+you+can+use+independently,+or+together+as+part+of+a+cohesive+solution.
|BhnYb3VW7D|QYZ290WhC|rgba(238,+238,+238,+1)|ER2SFYwbeK|gZp3Hxm5Js|602281486639200009fd35eb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg|FsOaMudE8|ElruSYJxWM|Webiny+Serverless+

CMS|9HJcM89Am|8Cp2ZC30_H|qrS5wswdQ|heading5|h5|A+suite+of+applications+to+help+you+manage+your+content.+|pLUutc-E2|MGlDcu91q_|A6rStUekq|Use+it+to+build:|jIdakfVZU|5JHsGc_Rq-|SNOFqUK6lI|

    \n++++++++++++++++++++
  • Marketing+sites
  • \n++++++++++++++++++++
  • Multi-website+solutions
  • \n++++++++++++++++++++
  • Content+hubs
  • \n++++++++++++++++
|96dJBnIlc|5cPfb7AwXH|
    \n++++++++++++++++++++
  • Multi-language+sites
  • \n++++++++++++++++++++
  • Intranet+portals
  • \n++++++++++++++++++++
  • Headless+content+models
  • \n++++++++++++++++
|L4dFyzBKMM|Learn+more|https://www.webiny.com/serverless-cms/||mjmNmloeUS|100%25|220px|602281486639200009fd35ec|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg|xUkOEAm5X3|Kgr1ambSuG|AP_uTrgLZ|CMS+benefits|juBaAPJ76|4-4-4|s95PSAToXK|35px|ZECp8jcZD|60228148fa244d0008c47c79|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg|146px|EyKog1RmH|Scalable|_8lCcwhUN|No+matter+the+demand,+Webiny+Serverless+CMS+can+easily+scale+to+meet+even+the+most+challenging+workloads.
|SmrEQ9OZ8|QWM8cmlQEM|60228145f98841000981c720|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg|TYx-A5YCI|Adaptable|SsbWKZz_Z|Being+an+open-source+project,+it\'s+easy+to+modify+and+adapt+things+to+your+own+needs.
|gqdtbKfv7l|jBWaxzt-4|6022814851197600081724ae|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg|NLSOIstf9|Low+cost+of+ownership|kI-neIjkXx|Self-hosted+on+top+of+serverless+infrastructure.+No+infrastructure+to+mange,+less+people+required+to+operate+and+maintain.
|V14HHGmXN|-djsQadY-8|pTVeVoKkTi|bM5b8O7IMY|Secure|l9PuI-TdVA|Secured+by+AWS+Cognito.+It\'s+also+easy+to+integrate+services+like+OKTA,+Auth0+and+similar.
|N1lW0cAasg|W-ub9guhLt|602281486ed41f0008bc2dac|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg|DVhLZfrM53|Data+ownership|shmIumNfIu|Webiny+is+self-hosted,+it+means+your+data+stays+within+your+data+center.+
|8F7J_16a46|2gtT4Mfw6c|602281486ed41f0008bc2dab|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg|5EMJkVWgKW|Permission+control|cdSOjFAWkf|Powerful+options+to+control+the+permissions+your+users+will+have.+They+perfectly+align+with+your+business+requirements. 
|5ggqk561Ka|100%25|C6B8QfkUXs|ChF1iOAbtb|7tRfsJ_SEz|Serverless+makes+infrastructure+easy,+

Webiny+makes+serverless+easy|oYf9t6Uwz|RdazJP-4W1|7jBNW1iTi|60228145f98841000981c721|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg|200px|npNMgLft0|1.+Developer-friendly|DpubDRaGQ|Webiny+has+been+made+with+the+developer+in+mind.+It+helps+them+develop+serverless+applications+with+ease.
|KbQocaayR|KDO-Ja7wS|60228145f98841000981c71f|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg|ETll3nkV4|2.+Open+source|UWPjvO7EC|Webiny+is+created+and+maintained+by+an+amazing+group+of+people.+Being+open+source+means+Webiny+grows+and+evolves+much+faster.+Contributor+are+welcome.
|En4soRn06o|fqxeYbEV4|60228148fa244d0008c47c7a|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png|276px|e5v0LBbfz|3.+Community|p9FWp5yqUy|We+have+an+active+community+on+slack.+Talk+to+the+core-team,+and+get+help.+Webiny+team+is+always+there+for+any+questions.
|OYp5Z-6Xo|woaE-6v5bN|Y8ndbn88hy|View+Webiny+on+GitHub|https://github.com/webiny/webiny-js|secondary|fab|github|^C|C|C|6|6|6|6|C|6|3|9|C|C|6|6|C|6|C|C|C|3|C|C|3|C|C|3|C|C|3|C|C|6|C|C|6|3|9|C|C|6|6|C|4|4|4|4|4|4|C|4|4|4|C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|O|I|P|G|P]|Q|$J|-1|I|M|G|M]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|Y|Z|10]]]]]]|6|@$0|11|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BC]]]|6|@$0|1F|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|1G|Z|1H]|1I|1J]]|6|@]]]]]]|$0|1K|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1L|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BD]]]|6|@$0|1M|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|1V]|4|$1O|1W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|1X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|1Y|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1Z|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BE]]]|6|@$0|20|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|1V]|4|$1O|24]]|5|$D|$A|$L|F]]|K|$A|$L|F|J|-1|I|25|G|26]|Q|$I|F|G|F|J|-1]]]]|6|@]]]]]]|$0|27|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]|Q|$I|2C]]|K|$A|$L|F]]|12|$1E|BF]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2F|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2I]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2J|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2L]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BG]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2O|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2Q|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|2S|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]|1A|$J|-2]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2T|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]]|K|$A|$L|F]]|12|$1E|BH]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2U|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2V]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2W|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2X]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|Q|$J|-1|I|2N|E|F]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BI]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2Z|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|30]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|31|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|32]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|33|2|8|4|$5|$9|$A|$B|34]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|35|H|36|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|37|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|38|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|39|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BJ]]]|6|@$0|3A|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|3C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|3D|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|S|1S|3F|1U|3B]|4|$1O|3G]]|5|$D|$A|$L|F|J|-1|E|P]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|3H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|3I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|BK]]]|6|@$0|3L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|S]|3N|$A|$3O|3P|1U|3Q|9|$L|3R|J|-1|H|3R]]]]]|6|@$0|3S|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BL]]]|6|@$0|3T|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|3U|Z|3V]|1I|3W]|3X|$]]|6|@]]]]|$0|3Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BM]]]|6|@$0|3Z|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41|1U|3B]|4|$1O|42]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|43|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|44|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BN]]]|6|@$0|45|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|46]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|47|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|P|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|48|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BO]]]|6|@$0|49|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|4C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4D|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4E|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BP]]]|6|@$0|4F|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4H]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|4I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BQ]]]|6|@$0|4J|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BR]]]|6|@$0|4N|2|4O|4|$4P|4Q|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|4T|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|50|51|G|9|52]]|6|@]]]]]]]]|$0|53|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$E|F|G|F|H|F|I|F|L|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|BS]]]|6|@$0|54|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|55|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BT]]]|6|@$0|56|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|57|Z|58]]|3X|$]]|6|@]]]]]]|$0|59|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BU]]]|6|@$0|5B|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|5C]]|5|$D|$A|$L|F|J|-1]]|K|$A|$L|F]]]]|6|@]]|$0|5D|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|5E]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]]]]]|$0|5F|2|8|4|$5|$9|$A|$B|5G]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|5H|G|P|H|5I|I|P|J|-1]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|5J|Z|5K]]]]]]|6|@$0|5L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|5M|I|F|J|-1]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BV]]]|6|@$0|5O|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|5P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|5Q|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|5R]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5S|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|5T]|1A|$I|5T|J|-1]]|12|$1E|BW]]]|6|@$0|5U|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5V|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BX]]]|6|@$0|5W|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|5X|Z|5Y]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|60|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|61|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BY]]]|6|@$0|62|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|63]]|5|$D|$A|$L|F|J|-1|H|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|64|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|65]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|66|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|BZ]]]|6|@$0|67|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|68|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C0]]]|6|@$0|69|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6A|Z|6B]|1I|5Z]]|6|@]]]]]]|$0|6C|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6D|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C1]]]|6|@$0|6E|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6G|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6H]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|C2]]]|6|@$0|6J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6K|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C3]]]|6|@$0|6L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|6O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6P|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C4]]]|6|@$0|6Q|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6S|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6T]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|5T]|1A|$G|5T|J|-1]]|12|$1E|C5]]]|6|@$0|6V|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6W|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C6]]]|6|@$0|6X|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6Y|Z|6Z]|1I|5Z]]|6|@]]]]]]|$0|70|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|71|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C7]]]|6|@$0|72|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|73]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|74|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|75]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|76|2|8|4|$5|$9|$A|$B|77]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|78|G|P|H|36|I|P|J|-1]]|R|$A|S]|T|$A|U]]]|6|@$0|79|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7A|2|1D|4|$5|$D|$A|$E|F|G|F|H|38|I|F|J|-1]|1A|$J|-1]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|C8]]]|6|@$0|7B|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C9]]]|6|@$0|7D|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7E|Z|7F]|9|7G]]|6|@]]]]]]|$0|7H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CA]]]|6|@$0|7J|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|7K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7L|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|7M]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|7N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|CB]]]|6|@$0|7O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]|3N|$A|$3O|3P|1U|7P|9|$J|-1|H|3R]]]]]|6|@$0|7Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CC]]]|6|@$0|7R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7S|Z|7T]|1I|3W]|3X|$]]|6|@]]]]|$0|7U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CD]]]|6|@$0|7V|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41]|4|$1O|7W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CE]]]|6|@$0|7Z|2|1N|4|$1O|$A|$2|1N|1P|80|1R|I|1S|81|1U|3B]|4|$1O|82]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|83|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|4R|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|84|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CF]]]|6|@$0|85|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|86]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|87|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|88|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CG]]]|6|@$0|89|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8A]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|8B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CH]]]|6|@$0|8C|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8D]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8E|2|4O|4|$4P|8F|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|8G|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|8H|51|G|9|52]]|6|@]]]]]]]]|$0|8I|2|8|4|$5|$9|$A|$B|8J]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|38|H|8K|I|P|G|P]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|8L|Z|8M]]]]]]|6|@$0|8N|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|5H|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8O|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CI]]]|6|@$0|8P|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|8Q]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8R|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8T|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|G|8U|I|8U]]|12|$1E|CJ]]]|6|@$0|8V|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|8W|Z|8X]|1I|8Y]|3X|$]]|6|@]]|$0|8Z|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|90]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|91|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|92]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|93|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CK]]]|6|@$0|94|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|95|Z|96]|1I|8Y]|3X|$]]|6|@]]|$0|97|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|98]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|99|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9A]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CL]]]|6|@$0|9C|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9D|Z|9E]|1I|8Y]|3X|$]]|6|@]]|$0|9F|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9G]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9H|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9I]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|9J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|5H|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|9K|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|I|8U]]|12|$1E|CM]]]|6|@$0|9L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|8Y]|3X|$]]|6|@]]|$0|9M|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9N]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9O|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9P]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CN]]]|6|@$0|9R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9S|Z|9T]|1I|8Y]|3X|$]]|6|@]]|$0|9U|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9V]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9W|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23]|4|$1O|9X]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CO]]]|6|@$0|9Z|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|A0|Z|A1]|1I|8Y]|3X|$]]|6|@]]|$0|A2|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|A3]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|A4|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|A5]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|A6|2|8|4|$5|$9|$A|$B|A7]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|N|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|A8|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|A9|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CP]]]|6|@$0|AA|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|AB]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|AC|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|38|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|AD|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|4R]|1A|$G|4R|J|-1|I|4R]]|12|$1E|CQ]]]|6|@$0|AE|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AF|Z|AG]|1I|AH]|3X|$]]|6|@]]|$0|AI|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AJ]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AK|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AL]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AM|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|4R|G|4R]]|12|$1E|CR]]]|6|@$0|AN|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AO|Z|AP]|1I|AH]|3X|$]]|6|@]]|$0|AQ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AR]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AS|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AT]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AU|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|4R]]|K|$A|$L|F|J|-1|I|4R]|1A|$J|-1|I|4R|G|4R]]|12|$1E|CS]]]|6|@$0|AV|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AW|Z|AX]|1I|AH|9|AY]|3X|$]]|6|@]]|$0|AZ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|B0]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|B1|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|B2]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|B3|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|3J|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|B4|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CT]]]|6|@$0|B5|2|4O|4|$4P|B6|5|$D|$A|$L|F]]|R|$A|S]]|3X|$4S|B7|4U|-1]|2|B8|4W|$0|@B9|BA]|4Z|BB|9|52]]|6|@]]]]]]]]]]' + }, + status: "published", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + TYPE: "pb.page.l", + _md: "2023-12-27T12:43:00.864Z", + SK: "L", + publishedOn: "2023-12-27T12:43:00.723Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5b#0001", + version: 1, + settings: { seo: { meta: [] }, general: { layout: "static" }, social: { meta: [] } }, + path: "/welcome-to-webiny", + savedOn: "2023-12-27T12:43:00.723Z", + locale: "en-US", + pid: "658c1bd3c39bb10008431b5b", + _et: "PbPages", + _ct: "2023-12-27T12:43:00.864Z", + tenant: "root", + createdOn: "2023-12-27T12:42:59.947Z", + locked: true, + category: "static", + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + webinyVersion: "5.38.2", + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5b", + title: "Welcome to Webiny" + }, + { + content: { + compression: "jsonpack", + content: + 'id|Fv1PpPWu-|type|document|data|settings|elements|xqt7BI4iN9|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|100px|275px|16px|tablet|horizontalAlignFlex|center|verticalAlign|flex-start|background|image|file|6022814b7a77e60008f70d62|src|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg|gdE7Q7rcA|grid|1100px|20px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|_fbQO4Nlpp|cell|size|cdk_pclqE|6022814b0df4b000088735bc|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg|height|44px|ovLRNqyVu3|wmMU13uZ10|1eUZzAvoB|heading|text|typography|heading1|alignment|tag|h1|color|color6|Welcome+to+Webiny|F6ZREnQcc|64px|oEgjDLVXUu|0xYOozhJw|paragraph|paragraph1|div|Webiny+makes+it+easy+to+build+applications+and+websites+on+top+of+the+serverless+infrastructure+by+providing+you+with+a+ready-made+CMS+and+a+development+framework.
|20%25|20%25|gwhTOrZvc|30px|6-6|EaIMtHtOIw|-8px|px|602282e07a77e60008f70d63|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg|8k7zxQUTm|heading6|h6|Scalable|qNngQ1C-5|paragraph2|Webiny+apps+can+scale+to+handle+the+most+demanding+workloads.
|uBv_VRv0i|8px|iQaW4vjKg|No+custom+tooling+required|Wy3Tw-Lb8|Webiny+eliminates+the+need+to+build+custom+tooling+to+create+serverless+app
|uwrjoSZkB|Q39eQZm_8z|zSVZIwnSQ0|Cost+effective|S-Ydr4kX6k|Webiny+apps+run+on+serverless+infrastructure+which+costs+80%25+less+than+VMs
|nUX2JXYjhD|8z0hL8l7ay|Resolves+serverless+challenges|04ZNIcAGE_|Webiny+removes+all+the+challenges+of+building+serverless+applications
|vm0cFfH8KG|100%25|65px|75px|txeqybzKr3|80px|wMjC2uv8cj|Pm7ws20iA|color3|Get+to+know+Webiny+products|6CPpd558B|heading2|h2|Architect.+Code.+Deploy.|1e0_OJgMx|gpYd80MXeg|40px|15px|kAYc-QClR|4-8|border|style|solid|rgba(229,+229,+229,+1)|1|8i803wClVt|p55J-BkDn|6022814a0df4b000088735bb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg|90px|link|8nddxG64r|PR-yiR65n|heading3|h3|Webiny+Serverless+

Application+Framework|pVH9_fFLM|x0SSJvgrdD|b0iE8vr2S|Everything+you+need+to+create+and+deploy+applications+on+top+of+the+serverless+infrastructure. 
|JMSKwWsT_|OU70Y990tA|T_M_Ww4Wb|heading4|h4|Use+it+to+build:|806nmKOyc|g59JmcyM-7|Cyziie_SK|list|

    \n++++++++++++++++++++
  • Full-stack+applications
  • Multi-tenant+solutions
  • \n++++++++++++++++
|ST0O1ZeCk|ILrAABWXiX|
    \n++++++++++++++++++++
  • APIs
  • Microservice
  • \n++++++++++++++++
|XxXGeIywO|9H5t3COdbo|mc0_RS9rg|button|buttonText|Learn+more|50px|href|https://www.webiny.com/serverless-application-framework/|newTab|primary|icon|fas|long-arrow-alt-right|svg||position|16|Kg3rMc1Re|LAcQHMs8K|8oaRz-Gko_|9fQ9W-xiB|6022814891bd1300087bd24c|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg|YCG34DB89|xvBXD_QTkN|GqW2LBMzV|An+easier+way+to+build+serverless+apps|9cWYQwXUd|There+are+many+solutions+that+help+you+run,+deploy+and+monitor+serverless+functions,+but+when+it+comes+to+actually+coding+one,+there+are+none.+Webiny+is+a+solution+that+helps+you+code+your+serverless+app+by+providing+you+with+all+the+components+like+ACL,+routing,+file+storage+and+many+more.
|LxqyquKlYy|100%25|60px|177px|60228148f98841000981c723|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg|yqrzxoDllE|70px|bD-TQmZyW8|4ESAx7NxM|Framework+features|Xr7NLMpzm|3-3-3-3|_RtRioPOsj|12px|mOr47ImJK|AlTNw-76F8|r0e8MiCuK|6022814bef4a940008b3ba27|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg|170px|QFwbqHtSh|DH-C0-mBsO|XSN-oY3V3|Users,+groups,+roles+&+scopes|Unyhp8o-a|Security+is+a+crucial+layer+in+any+application.+Webiny+includes+a+full-featured+security+module+that\'s+connected+to+the+built-in+GraphQL+API.Users,+groups,+roles+&+scopes
|Ntcduee0-|0b66dbGkG|PoRqI9i2xE|0ZpnBSqjoz|6022814bef4a940008b3ba26|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg|FFGobMHHI|IWxl_nrRkr|I5btsZceI|Scaffolding|5qvaQSnP6|Quickly+generate+boilerplate+code+using+CLI+plugins.+From+lambda+functions+to+new+GraphQL+APIs.
|YHUznp7ZM5|PlxqV_uS7B|zKQYI-EIFl|frRuzWpRI|60228148f98841000981c724|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg|M1tvv840H|fwreagGdac|6H1tgEViY|Customizable+security|h0Ctka4TED|Use+the+default+AWS+Cognito,+or+replace+with+3rd+party+identity+providers+like+Okta,+Auth0,+etc.+Using+plugins+you+can+make+Webiny+work+with+any+identity+provider.
|SyyrOA60AF|GvU31fd4U|1vAxZAkD9O|dlI-qhVLKy|6022814bef4a940008b3ba28|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg|ftA7NOOxG|WU58SBDPP8|QtYfpt1yoE|Multiple+environments|mmpGUzg6o1|No+code+change+goes+directly+into+a+production+environment.+Webiny+CLI+makes+it+easy+to+manage+and+create+multiple+environments+for+your+project.
|wYK9BhaanZ|100%25|125px|ur1DQFl5BR|TzBvXtU2PH|-PU3iBlQ4|A6sNR3MR-5|Xtqk_itss|602281486ed41f0008bc2dad|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png|495px|bsKTDygik|ev9nhHISRw|1BBr9ACuM|One+size+doesn\'t+fit+all|0olguTqDN|It\'s+a+very+different+set+of+requirements+a+technical+team+has+to+a+marketing+team+to+a+business+development+team.+Webiny+Serverless+CMS+comes+with+several+different+apps+you+can+use+independently,+or+together+as+part+of+a+cohesive+solution.
|BhnYb3VW7D|QYZ290WhC|rgba(238,+238,+238,+1)|ER2SFYwbeK|gZp3Hxm5Js|602281486639200009fd35eb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg|FsOaMudE8|ElruSYJxWM|Webiny+Serverless+

CMS|9HJcM89Am|8Cp2ZC30_H|qrS5wswdQ|heading5|h5|A+suite+of+applications+to+help+you+manage+your+content.+|pLUutc-E2|MGlDcu91q_|A6rStUekq|Use+it+to+build:|jIdakfVZU|5JHsGc_Rq-|SNOFqUK6lI|

    \n++++++++++++++++++++
  • Marketing+sites
  • \n++++++++++++++++++++
  • Multi-website+solutions
  • \n++++++++++++++++++++
  • Content+hubs
  • \n++++++++++++++++
|96dJBnIlc|5cPfb7AwXH|
    \n++++++++++++++++++++
  • Multi-language+sites
  • \n++++++++++++++++++++
  • Intranet+portals
  • \n++++++++++++++++++++
  • Headless+content+models
  • \n++++++++++++++++
|L4dFyzBKMM|Learn+more|https://www.webiny.com/serverless-cms/||mjmNmloeUS|100%25|220px|602281486639200009fd35ec|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg|xUkOEAm5X3|Kgr1ambSuG|AP_uTrgLZ|CMS+benefits|juBaAPJ76|4-4-4|s95PSAToXK|35px|ZECp8jcZD|60228148fa244d0008c47c79|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg|146px|EyKog1RmH|Scalable|_8lCcwhUN|No+matter+the+demand,+Webiny+Serverless+CMS+can+easily+scale+to+meet+even+the+most+challenging+workloads.
|SmrEQ9OZ8|QWM8cmlQEM|60228145f98841000981c720|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg|TYx-A5YCI|Adaptable|SsbWKZz_Z|Being+an+open-source+project,+it\'s+easy+to+modify+and+adapt+things+to+your+own+needs.
|gqdtbKfv7l|jBWaxzt-4|6022814851197600081724ae|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg|NLSOIstf9|Low+cost+of+ownership|kI-neIjkXx|Self-hosted+on+top+of+serverless+infrastructure.+No+infrastructure+to+mange,+less+people+required+to+operate+and+maintain.
|V14HHGmXN|-djsQadY-8|pTVeVoKkTi|bM5b8O7IMY|Secure|l9PuI-TdVA|Secured+by+AWS+Cognito.+It\'s+also+easy+to+integrate+services+like+OKTA,+Auth0+and+similar.
|N1lW0cAasg|W-ub9guhLt|602281486ed41f0008bc2dac|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg|DVhLZfrM53|Data+ownership|shmIumNfIu|Webiny+is+self-hosted,+it+means+your+data+stays+within+your+data+center.+
|8F7J_16a46|2gtT4Mfw6c|602281486ed41f0008bc2dab|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg|5EMJkVWgKW|Permission+control|cdSOjFAWkf|Powerful+options+to+control+the+permissions+your+users+will+have.+They+perfectly+align+with+your+business+requirements. 
|5ggqk561Ka|100%25|C6B8QfkUXs|ChF1iOAbtb|7tRfsJ_SEz|Serverless+makes+infrastructure+easy,+

Webiny+makes+serverless+easy|oYf9t6Uwz|RdazJP-4W1|7jBNW1iTi|60228145f98841000981c721|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg|200px|npNMgLft0|1.+Developer-friendly|DpubDRaGQ|Webiny+has+been+made+with+the+developer+in+mind.+It+helps+them+develop+serverless+applications+with+ease.
|KbQocaayR|KDO-Ja7wS|60228145f98841000981c71f|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg|ETll3nkV4|2.+Open+source|UWPjvO7EC|Webiny+is+created+and+maintained+by+an+amazing+group+of+people.+Being+open+source+means+Webiny+grows+and+evolves+much+faster.+Contributor+are+welcome.
|En4soRn06o|fqxeYbEV4|60228148fa244d0008c47c7a|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png|276px|e5v0LBbfz|3.+Community|p9FWp5yqUy|We+have+an+active+community+on+slack.+Talk+to+the+core-team,+and+get+help.+Webiny+team+is+always+there+for+any+questions.
|OYp5Z-6Xo|woaE-6v5bN|Y8ndbn88hy|View+Webiny+on+GitHub|https://github.com/webiny/webiny-js|secondary|fab|github|^C|C|C|6|6|6|6|C|6|3|9|C|C|6|6|C|6|C|C|C|3|C|C|3|C|C|3|C|C|3|C|C|6|C|C|6|3|9|C|C|6|6|C|4|4|4|4|4|4|C|4|4|4|C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|O|I|P|G|P]|Q|$J|-1|I|M|G|M]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|Y|Z|10]]]]]]|6|@$0|11|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BC]]]|6|@$0|1F|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|1G|Z|1H]|1I|1J]]|6|@]]]]]]|$0|1K|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1L|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BD]]]|6|@$0|1M|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|1V]|4|$1O|1W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|1X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|1Y|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1Z|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BE]]]|6|@$0|20|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|1V]|4|$1O|24]]|5|$D|$A|$L|F]]|K|$A|$L|F|J|-1|I|25|G|26]|Q|$I|F|G|F|J|-1]]]]|6|@]]]]]]|$0|27|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]|Q|$I|2C]]|K|$A|$L|F]]|12|$1E|BF]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2F|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2I]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2J|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2L]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BG]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2O|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2Q|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|2S|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]|1A|$J|-2]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2T|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]]|K|$A|$L|F]]|12|$1E|BH]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2U|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2V]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2W|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2X]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|Q|$J|-1|I|2N|E|F]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BI]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2Z|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|30]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|31|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|32]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|33|2|8|4|$5|$9|$A|$B|34]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|35|H|36|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|37|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|38|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|39|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BJ]]]|6|@$0|3A|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|3C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|3D|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|S|1S|3F|1U|3B]|4|$1O|3G]]|5|$D|$A|$L|F|J|-1|E|P]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|3H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|3I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|BK]]]|6|@$0|3L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|S]|3N|$A|$3O|3P|1U|3Q|9|$L|3R|J|-1|H|3R]]]]]|6|@$0|3S|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BL]]]|6|@$0|3T|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|3U|Z|3V]|1I|3W]|3X|$]]|6|@]]]]|$0|3Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BM]]]|6|@$0|3Z|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41|1U|3B]|4|$1O|42]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|43|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|44|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BN]]]|6|@$0|45|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|46]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|47|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|P|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|48|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BO]]]|6|@$0|49|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|4C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4D|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4E|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BP]]]|6|@$0|4F|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4H]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|4I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BQ]]]|6|@$0|4J|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BR]]]|6|@$0|4N|2|4O|4|$4P|4Q|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|4T|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|50|51|G|9|52]]|6|@]]]]]]]]|$0|53|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$E|F|G|F|H|F|I|F|L|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|BS]]]|6|@$0|54|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|55|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BT]]]|6|@$0|56|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|57|Z|58]]|3X|$]]|6|@]]]]]]|$0|59|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BU]]]|6|@$0|5B|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|5C]]|5|$D|$A|$L|F|J|-1]]|K|$A|$L|F]]]]|6|@]]|$0|5D|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|5E]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]]]]]|$0|5F|2|8|4|$5|$9|$A|$B|5G]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|5H|G|P|H|5I|I|P|J|-1]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|5J|Z|5K]]]]]]|6|@$0|5L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|5M|I|F|J|-1]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BV]]]|6|@$0|5O|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|5P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|5Q|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|5R]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5S|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|5T]|1A|$I|5T|J|-1]]|12|$1E|BW]]]|6|@$0|5U|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5V|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BX]]]|6|@$0|5W|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|5X|Z|5Y]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|60|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|61|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BY]]]|6|@$0|62|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|63]]|5|$D|$A|$L|F|J|-1|H|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|64|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|65]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|66|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|BZ]]]|6|@$0|67|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|68|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C0]]]|6|@$0|69|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6A|Z|6B]|1I|5Z]]|6|@]]]]]]|$0|6C|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6D|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C1]]]|6|@$0|6E|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6G|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6H]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|C2]]]|6|@$0|6J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6K|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C3]]]|6|@$0|6L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|6O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6P|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C4]]]|6|@$0|6Q|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6S|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6T]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|5T]|1A|$G|5T|J|-1]]|12|$1E|C5]]]|6|@$0|6V|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6W|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C6]]]|6|@$0|6X|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6Y|Z|6Z]|1I|5Z]]|6|@]]]]]]|$0|70|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|71|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C7]]]|6|@$0|72|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|73]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|74|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|75]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|76|2|8|4|$5|$9|$A|$B|77]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|78|G|P|H|36|I|P|J|-1]]|R|$A|S]|T|$A|U]]]|6|@$0|79|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7A|2|1D|4|$5|$D|$A|$E|F|G|F|H|38|I|F|J|-1]|1A|$J|-1]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|C8]]]|6|@$0|7B|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C9]]]|6|@$0|7D|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7E|Z|7F]|9|7G]]|6|@]]]]]]|$0|7H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CA]]]|6|@$0|7J|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|7K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7L|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|7M]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|7N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|CB]]]|6|@$0|7O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]|3N|$A|$3O|3P|1U|7P|9|$J|-1|H|3R]]]]]|6|@$0|7Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CC]]]|6|@$0|7R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7S|Z|7T]|1I|3W]|3X|$]]|6|@]]]]|$0|7U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CD]]]|6|@$0|7V|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41]|4|$1O|7W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CE]]]|6|@$0|7Z|2|1N|4|$1O|$A|$2|1N|1P|80|1R|I|1S|81|1U|3B]|4|$1O|82]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|83|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|4R|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|84|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CF]]]|6|@$0|85|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|86]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|87|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|88|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CG]]]|6|@$0|89|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8A]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|8B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CH]]]|6|@$0|8C|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8D]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8E|2|4O|4|$4P|8F|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|8G|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|8H|51|G|9|52]]|6|@]]]]]]]]|$0|8I|2|8|4|$5|$9|$A|$B|8J]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|38|H|8K|I|P|G|P]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|8L|Z|8M]]]]]]|6|@$0|8N|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|5H|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8O|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CI]]]|6|@$0|8P|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|8Q]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8R|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8T|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|G|8U|I|8U]]|12|$1E|CJ]]]|6|@$0|8V|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|8W|Z|8X]|1I|8Y]|3X|$]]|6|@]]|$0|8Z|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|90]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|91|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|92]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|93|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CK]]]|6|@$0|94|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|95|Z|96]|1I|8Y]|3X|$]]|6|@]]|$0|97|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|98]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|99|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9A]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CL]]]|6|@$0|9C|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9D|Z|9E]|1I|8Y]|3X|$]]|6|@]]|$0|9F|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9G]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9H|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9I]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|9J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|5H|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|9K|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|I|8U]]|12|$1E|CM]]]|6|@$0|9L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|8Y]|3X|$]]|6|@]]|$0|9M|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9N]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9O|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9P]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CN]]]|6|@$0|9R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9S|Z|9T]|1I|8Y]|3X|$]]|6|@]]|$0|9U|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9V]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9W|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23]|4|$1O|9X]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CO]]]|6|@$0|9Z|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|A0|Z|A1]|1I|8Y]|3X|$]]|6|@]]|$0|A2|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|A3]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|A4|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|A5]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|A6|2|8|4|$5|$9|$A|$B|A7]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|N|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|A8|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|A9|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CP]]]|6|@$0|AA|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|AB]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|AC|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|38|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|AD|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|4R]|1A|$G|4R|J|-1|I|4R]]|12|$1E|CQ]]]|6|@$0|AE|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AF|Z|AG]|1I|AH]|3X|$]]|6|@]]|$0|AI|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AJ]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AK|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AL]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AM|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|4R|G|4R]]|12|$1E|CR]]]|6|@$0|AN|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AO|Z|AP]|1I|AH]|3X|$]]|6|@]]|$0|AQ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AR]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AS|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AT]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AU|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|4R]]|K|$A|$L|F|J|-1|I|4R]|1A|$J|-1|I|4R|G|4R]]|12|$1E|CS]]]|6|@$0|AV|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AW|Z|AX]|1I|AH|9|AY]|3X|$]]|6|@]]|$0|AZ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|B0]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|B1|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|B2]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|B3|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|3J|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|B4|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CT]]]|6|@$0|B5|2|4O|4|$4P|B6|5|$D|$A|$L|F]]|R|$A|S]]|3X|$4S|B7|4U|-1]|2|B8|4W|$0|@B9|BA]|4Z|BB|9|52]]|6|@]]]]]]]]]]' + }, + status: "published", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + TYPE: "pb.page.p", + _md: "2023-12-27T12:43:00.881Z", + SK: "P", + publishedOn: "2023-12-27T12:43:00.723Z", + id: "658c1bd3c39bb10008431b5b#0001", + editor: "page-builder", + version: 1, + settings: { seo: { meta: [] }, general: { layout: "static" }, social: { meta: [] } }, + path: "/welcome-to-webiny", + locale: "en-US", + savedOn: "2023-12-27T12:43:00.723Z", + pid: "658c1bd3c39bb10008431b5b", + _et: "PbPages", + _ct: "2023-12-27T12:43:00.881Z", + tenant: "root", + createdOn: "2023-12-27T12:42:59.947Z", + locked: true, + category: "static", + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + webinyVersion: "5.38.2", + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5b", + title: "Welcome to Webiny" + }, + { + content: { + compression: "jsonpack", + content: + 'id|Fv1PpPWu-|type|document|data|settings|elements|xqt7BI4iN9|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|100px|275px|16px|tablet|horizontalAlignFlex|center|verticalAlign|flex-start|background|image|file|6022814b7a77e60008f70d62|src|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg|gdE7Q7rcA|grid|1100px|20px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|_fbQO4Nlpp|cell|size|cdk_pclqE|6022814b0df4b000088735bc|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg|height|44px|ovLRNqyVu3|wmMU13uZ10|1eUZzAvoB|heading|text|typography|heading1|alignment|tag|h1|color|color6|Welcome+to+Webiny|F6ZREnQcc|64px|oEgjDLVXUu|0xYOozhJw|paragraph|paragraph1|div|Webiny+makes+it+easy+to+build+applications+and+websites+on+top+of+the+serverless+infrastructure+by+providing+you+with+a+ready-made+CMS+and+a+development+framework.
|20%25|20%25|gwhTOrZvc|30px|6-6|EaIMtHtOIw|-8px|px|602282e07a77e60008f70d63|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg|8k7zxQUTm|heading6|h6|Scalable|qNngQ1C-5|paragraph2|Webiny+apps+can+scale+to+handle+the+most+demanding+workloads.
|uBv_VRv0i|8px|iQaW4vjKg|No+custom+tooling+required|Wy3Tw-Lb8|Webiny+eliminates+the+need+to+build+custom+tooling+to+create+serverless+app
|uwrjoSZkB|Q39eQZm_8z|zSVZIwnSQ0|Cost+effective|S-Ydr4kX6k|Webiny+apps+run+on+serverless+infrastructure+which+costs+80%25+less+than+VMs
|nUX2JXYjhD|8z0hL8l7ay|Resolves+serverless+challenges|04ZNIcAGE_|Webiny+removes+all+the+challenges+of+building+serverless+applications
|vm0cFfH8KG|100%25|65px|75px|txeqybzKr3|80px|wMjC2uv8cj|Pm7ws20iA|color3|Get+to+know+Webiny+products|6CPpd558B|heading2|h2|Architect.+Code.+Deploy.|1e0_OJgMx|gpYd80MXeg|40px|15px|kAYc-QClR|4-8|border|style|solid|rgba(229,+229,+229,+1)|1|8i803wClVt|p55J-BkDn|6022814a0df4b000088735bb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg|90px|link|8nddxG64r|PR-yiR65n|heading3|h3|Webiny+Serverless+

Application+Framework|pVH9_fFLM|x0SSJvgrdD|b0iE8vr2S|Everything+you+need+to+create+and+deploy+applications+on+top+of+the+serverless+infrastructure. 
|JMSKwWsT_|OU70Y990tA|T_M_Ww4Wb|heading4|h4|Use+it+to+build:|806nmKOyc|g59JmcyM-7|Cyziie_SK|list|

    \n++++++++++++++++++++
  • Full-stack+applications
  • Multi-tenant+solutions
  • \n++++++++++++++++
|ST0O1ZeCk|ILrAABWXiX|
    \n++++++++++++++++++++
  • APIs
  • Microservice
  • \n++++++++++++++++
|XxXGeIywO|9H5t3COdbo|mc0_RS9rg|button|buttonText|Learn+more|50px|href|https://www.webiny.com/serverless-application-framework/|newTab|primary|icon|fas|long-arrow-alt-right|svg||position|16|Kg3rMc1Re|LAcQHMs8K|8oaRz-Gko_|9fQ9W-xiB|6022814891bd1300087bd24c|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg|YCG34DB89|xvBXD_QTkN|GqW2LBMzV|An+easier+way+to+build+serverless+apps|9cWYQwXUd|There+are+many+solutions+that+help+you+run,+deploy+and+monitor+serverless+functions,+but+when+it+comes+to+actually+coding+one,+there+are+none.+Webiny+is+a+solution+that+helps+you+code+your+serverless+app+by+providing+you+with+all+the+components+like+ACL,+routing,+file+storage+and+many+more.
|LxqyquKlYy|100%25|60px|177px|60228148f98841000981c723|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg|yqrzxoDllE|70px|bD-TQmZyW8|4ESAx7NxM|Framework+features|Xr7NLMpzm|3-3-3-3|_RtRioPOsj|12px|mOr47ImJK|AlTNw-76F8|r0e8MiCuK|6022814bef4a940008b3ba27|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg|170px|QFwbqHtSh|DH-C0-mBsO|XSN-oY3V3|Users,+groups,+roles+&+scopes|Unyhp8o-a|Security+is+a+crucial+layer+in+any+application.+Webiny+includes+a+full-featured+security+module+that\'s+connected+to+the+built-in+GraphQL+API.Users,+groups,+roles+&+scopes
|Ntcduee0-|0b66dbGkG|PoRqI9i2xE|0ZpnBSqjoz|6022814bef4a940008b3ba26|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg|FFGobMHHI|IWxl_nrRkr|I5btsZceI|Scaffolding|5qvaQSnP6|Quickly+generate+boilerplate+code+using+CLI+plugins.+From+lambda+functions+to+new+GraphQL+APIs.
|YHUznp7ZM5|PlxqV_uS7B|zKQYI-EIFl|frRuzWpRI|60228148f98841000981c724|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg|M1tvv840H|fwreagGdac|6H1tgEViY|Customizable+security|h0Ctka4TED|Use+the+default+AWS+Cognito,+or+replace+with+3rd+party+identity+providers+like+Okta,+Auth0,+etc.+Using+plugins+you+can+make+Webiny+work+with+any+identity+provider.
|SyyrOA60AF|GvU31fd4U|1vAxZAkD9O|dlI-qhVLKy|6022814bef4a940008b3ba28|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg|ftA7NOOxG|WU58SBDPP8|QtYfpt1yoE|Multiple+environments|mmpGUzg6o1|No+code+change+goes+directly+into+a+production+environment.+Webiny+CLI+makes+it+easy+to+manage+and+create+multiple+environments+for+your+project.
|wYK9BhaanZ|100%25|125px|ur1DQFl5BR|TzBvXtU2PH|-PU3iBlQ4|A6sNR3MR-5|Xtqk_itss|602281486ed41f0008bc2dad|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png|495px|bsKTDygik|ev9nhHISRw|1BBr9ACuM|One+size+doesn\'t+fit+all|0olguTqDN|It\'s+a+very+different+set+of+requirements+a+technical+team+has+to+a+marketing+team+to+a+business+development+team.+Webiny+Serverless+CMS+comes+with+several+different+apps+you+can+use+independently,+or+together+as+part+of+a+cohesive+solution.
|BhnYb3VW7D|QYZ290WhC|rgba(238,+238,+238,+1)|ER2SFYwbeK|gZp3Hxm5Js|602281486639200009fd35eb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg|FsOaMudE8|ElruSYJxWM|Webiny+Serverless+

CMS|9HJcM89Am|8Cp2ZC30_H|qrS5wswdQ|heading5|h5|A+suite+of+applications+to+help+you+manage+your+content.+|pLUutc-E2|MGlDcu91q_|A6rStUekq|Use+it+to+build:|jIdakfVZU|5JHsGc_Rq-|SNOFqUK6lI|

    \n++++++++++++++++++++
  • Marketing+sites
  • \n++++++++++++++++++++
  • Multi-website+solutions
  • \n++++++++++++++++++++
  • Content+hubs
  • \n++++++++++++++++
|96dJBnIlc|5cPfb7AwXH|
    \n++++++++++++++++++++
  • Multi-language+sites
  • \n++++++++++++++++++++
  • Intranet+portals
  • \n++++++++++++++++++++
  • Headless+content+models
  • \n++++++++++++++++
|L4dFyzBKMM|Learn+more|https://www.webiny.com/serverless-cms/||mjmNmloeUS|100%25|220px|602281486639200009fd35ec|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg|xUkOEAm5X3|Kgr1ambSuG|AP_uTrgLZ|CMS+benefits|juBaAPJ76|4-4-4|s95PSAToXK|35px|ZECp8jcZD|60228148fa244d0008c47c79|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg|146px|EyKog1RmH|Scalable|_8lCcwhUN|No+matter+the+demand,+Webiny+Serverless+CMS+can+easily+scale+to+meet+even+the+most+challenging+workloads.
|SmrEQ9OZ8|QWM8cmlQEM|60228145f98841000981c720|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg|TYx-A5YCI|Adaptable|SsbWKZz_Z|Being+an+open-source+project,+it\'s+easy+to+modify+and+adapt+things+to+your+own+needs.
|gqdtbKfv7l|jBWaxzt-4|6022814851197600081724ae|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg|NLSOIstf9|Low+cost+of+ownership|kI-neIjkXx|Self-hosted+on+top+of+serverless+infrastructure.+No+infrastructure+to+mange,+less+people+required+to+operate+and+maintain.
|V14HHGmXN|-djsQadY-8|pTVeVoKkTi|bM5b8O7IMY|Secure|l9PuI-TdVA|Secured+by+AWS+Cognito.+It\'s+also+easy+to+integrate+services+like+OKTA,+Auth0+and+similar.
|N1lW0cAasg|W-ub9guhLt|602281486ed41f0008bc2dac|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg|DVhLZfrM53|Data+ownership|shmIumNfIu|Webiny+is+self-hosted,+it+means+your+data+stays+within+your+data+center.+
|8F7J_16a46|2gtT4Mfw6c|602281486ed41f0008bc2dab|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg|5EMJkVWgKW|Permission+control|cdSOjFAWkf|Powerful+options+to+control+the+permissions+your+users+will+have.+They+perfectly+align+with+your+business+requirements. 
|5ggqk561Ka|100%25|C6B8QfkUXs|ChF1iOAbtb|7tRfsJ_SEz|Serverless+makes+infrastructure+easy,+

Webiny+makes+serverless+easy|oYf9t6Uwz|RdazJP-4W1|7jBNW1iTi|60228145f98841000981c721|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg|200px|npNMgLft0|1.+Developer-friendly|DpubDRaGQ|Webiny+has+been+made+with+the+developer+in+mind.+It+helps+them+develop+serverless+applications+with+ease.
|KbQocaayR|KDO-Ja7wS|60228145f98841000981c71f|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg|ETll3nkV4|2.+Open+source|UWPjvO7EC|Webiny+is+created+and+maintained+by+an+amazing+group+of+people.+Being+open+source+means+Webiny+grows+and+evolves+much+faster.+Contributor+are+welcome.
|En4soRn06o|fqxeYbEV4|60228148fa244d0008c47c7a|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png|276px|e5v0LBbfz|3.+Community|p9FWp5yqUy|We+have+an+active+community+on+slack.+Talk+to+the+core-team,+and+get+help.+Webiny+team+is+always+there+for+any+questions.
|OYp5Z-6Xo|woaE-6v5bN|Y8ndbn88hy|View+Webiny+on+GitHub|https://github.com/webiny/webiny-js|secondary|fab|github|^C|C|C|6|6|6|6|C|6|3|9|C|C|6|6|C|6|C|C|C|3|C|C|3|C|C|3|C|C|3|C|C|6|C|C|6|3|9|C|C|6|6|C|4|4|4|4|4|4|C|4|4|4|C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|O|I|P|G|P]|Q|$J|-1|I|M|G|M]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|Y|Z|10]]]]]]|6|@$0|11|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BC]]]|6|@$0|1F|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|1G|Z|1H]|1I|1J]]|6|@]]]]]]|$0|1K|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1L|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BD]]]|6|@$0|1M|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|1V]|4|$1O|1W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|1X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|1Y|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1Z|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BE]]]|6|@$0|20|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|1V]|4|$1O|24]]|5|$D|$A|$L|F]]|K|$A|$L|F|J|-1|I|25|G|26]|Q|$I|F|G|F|J|-1]]]]|6|@]]]]]]|$0|27|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]|Q|$I|2C]]|K|$A|$L|F]]|12|$1E|BF]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2F|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2I]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2J|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2L]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BG]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2O|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2Q|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|2S|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]|1A|$J|-2]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2T|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]]|K|$A|$L|F]]|12|$1E|BH]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2U|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2V]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2W|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2X]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|Q|$J|-1|I|2N|E|F]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BI]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2Z|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|30]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|31|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|32]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|33|2|8|4|$5|$9|$A|$B|34]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|35|H|36|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|37|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|38|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|39|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BJ]]]|6|@$0|3A|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|3C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|3D|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|S|1S|3F|1U|3B]|4|$1O|3G]]|5|$D|$A|$L|F|J|-1|E|P]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|3H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|3I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|BK]]]|6|@$0|3L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|S]|3N|$A|$3O|3P|1U|3Q|9|$L|3R|J|-1|H|3R]]]]]|6|@$0|3S|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BL]]]|6|@$0|3T|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|3U|Z|3V]|1I|3W]|3X|$]]|6|@]]]]|$0|3Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BM]]]|6|@$0|3Z|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41|1U|3B]|4|$1O|42]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|43|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|44|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BN]]]|6|@$0|45|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|46]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|47|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|P|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|48|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BO]]]|6|@$0|49|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|4C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4D|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4E|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BP]]]|6|@$0|4F|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4H]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|4I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BQ]]]|6|@$0|4J|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BR]]]|6|@$0|4N|2|4O|4|$4P|4Q|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|4T|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|50|51|G|9|52]]|6|@]]]]]]]]|$0|53|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$E|F|G|F|H|F|I|F|L|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|BS]]]|6|@$0|54|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|55|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BT]]]|6|@$0|56|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|57|Z|58]]|3X|$]]|6|@]]]]]]|$0|59|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BU]]]|6|@$0|5B|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|5C]]|5|$D|$A|$L|F|J|-1]]|K|$A|$L|F]]]]|6|@]]|$0|5D|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|5E]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]]]]]|$0|5F|2|8|4|$5|$9|$A|$B|5G]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|5H|G|P|H|5I|I|P|J|-1]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|5J|Z|5K]]]]]]|6|@$0|5L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|5M|I|F|J|-1]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BV]]]|6|@$0|5O|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|5P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|5Q|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|5R]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5S|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|5T]|1A|$I|5T|J|-1]]|12|$1E|BW]]]|6|@$0|5U|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5V|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BX]]]|6|@$0|5W|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|5X|Z|5Y]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|60|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|61|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BY]]]|6|@$0|62|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|63]]|5|$D|$A|$L|F|J|-1|H|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|64|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|65]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|66|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|BZ]]]|6|@$0|67|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|68|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C0]]]|6|@$0|69|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6A|Z|6B]|1I|5Z]]|6|@]]]]]]|$0|6C|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6D|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C1]]]|6|@$0|6E|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6G|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6H]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|C2]]]|6|@$0|6J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6K|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C3]]]|6|@$0|6L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|6O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6P|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C4]]]|6|@$0|6Q|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6S|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6T]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|5T]|1A|$G|5T|J|-1]]|12|$1E|C5]]]|6|@$0|6V|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6W|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C6]]]|6|@$0|6X|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6Y|Z|6Z]|1I|5Z]]|6|@]]]]]]|$0|70|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|71|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C7]]]|6|@$0|72|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|73]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|74|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|75]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|76|2|8|4|$5|$9|$A|$B|77]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|78|G|P|H|36|I|P|J|-1]]|R|$A|S]|T|$A|U]]]|6|@$0|79|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7A|2|1D|4|$5|$D|$A|$E|F|G|F|H|38|I|F|J|-1]|1A|$J|-1]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|C8]]]|6|@$0|7B|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C9]]]|6|@$0|7D|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7E|Z|7F]|9|7G]]|6|@]]]]]]|$0|7H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CA]]]|6|@$0|7J|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|7K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7L|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|7M]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|7N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|CB]]]|6|@$0|7O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]|3N|$A|$3O|3P|1U|7P|9|$J|-1|H|3R]]]]]|6|@$0|7Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CC]]]|6|@$0|7R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7S|Z|7T]|1I|3W]|3X|$]]|6|@]]]]|$0|7U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CD]]]|6|@$0|7V|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41]|4|$1O|7W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CE]]]|6|@$0|7Z|2|1N|4|$1O|$A|$2|1N|1P|80|1R|I|1S|81|1U|3B]|4|$1O|82]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|83|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|4R|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|84|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CF]]]|6|@$0|85|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|86]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|87|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|88|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CG]]]|6|@$0|89|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8A]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|8B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CH]]]|6|@$0|8C|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8D]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8E|2|4O|4|$4P|8F|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|8G|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|8H|51|G|9|52]]|6|@]]]]]]]]|$0|8I|2|8|4|$5|$9|$A|$B|8J]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|38|H|8K|I|P|G|P]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|8L|Z|8M]]]]]]|6|@$0|8N|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|5H|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8O|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CI]]]|6|@$0|8P|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|8Q]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8R|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8T|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|G|8U|I|8U]]|12|$1E|CJ]]]|6|@$0|8V|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|8W|Z|8X]|1I|8Y]|3X|$]]|6|@]]|$0|8Z|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|90]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|91|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|92]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|93|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CK]]]|6|@$0|94|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|95|Z|96]|1I|8Y]|3X|$]]|6|@]]|$0|97|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|98]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|99|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9A]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CL]]]|6|@$0|9C|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9D|Z|9E]|1I|8Y]|3X|$]]|6|@]]|$0|9F|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9G]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9H|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9I]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|9J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|5H|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|9K|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|I|8U]]|12|$1E|CM]]]|6|@$0|9L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|8Y]|3X|$]]|6|@]]|$0|9M|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9N]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9O|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9P]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CN]]]|6|@$0|9R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9S|Z|9T]|1I|8Y]|3X|$]]|6|@]]|$0|9U|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9V]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9W|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23]|4|$1O|9X]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CO]]]|6|@$0|9Z|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|A0|Z|A1]|1I|8Y]|3X|$]]|6|@]]|$0|A2|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|A3]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|A4|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|A5]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|A6|2|8|4|$5|$9|$A|$B|A7]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|N|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|A8|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|A9|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CP]]]|6|@$0|AA|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|AB]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|AC|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|38|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|AD|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|4R]|1A|$G|4R|J|-1|I|4R]]|12|$1E|CQ]]]|6|@$0|AE|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AF|Z|AG]|1I|AH]|3X|$]]|6|@]]|$0|AI|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AJ]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AK|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AL]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AM|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|4R|G|4R]]|12|$1E|CR]]]|6|@$0|AN|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AO|Z|AP]|1I|AH]|3X|$]]|6|@]]|$0|AQ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AR]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AS|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AT]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AU|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|4R]]|K|$A|$L|F|J|-1|I|4R]|1A|$J|-1|I|4R|G|4R]]|12|$1E|CS]]]|6|@$0|AV|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AW|Z|AX]|1I|AH|9|AY]|3X|$]]|6|@]]|$0|AZ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|B0]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|B1|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|B2]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|B3|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|3J|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|B4|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CT]]]|6|@$0|B5|2|4O|4|$4P|B6|5|$D|$A|$L|F]]|R|$A|S]]|3X|$4S|B7|4U|-1]|2|B8|4W|$0|@B9|BA]|4Z|BB|9|52]]|6|@]]]]]]]]]]' + }, + status: "published", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + TYPE: "pb.page", + _md: "2023-12-27T12:43:00.864Z", + SK: "REV#0001", + publishedOn: "2023-12-27T12:43:00.723Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5b#0001", + version: 1, + settings: { seo: { meta: [] }, general: { layout: "static" }, social: { meta: [] } }, + path: "/welcome-to-webiny", + savedOn: "2023-12-27T12:43:00.723Z", + locale: "en-US", + pid: "658c1bd3c39bb10008431b5b", + _et: "PbPages", + _ct: "2023-12-27T12:43:00.864Z", + tenant: "root", + createdOn: "2023-12-27T12:42:59.947Z", + locked: true, + category: "static", + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + webinyVersion: "5.38.2", + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5b", + title: "Welcome to Webiny" + }, + { + _et: "SecurityIdentity2Tenant", + _ct: "2023-12-27T12:41:24.428Z", + tenant: "root", + identity: "658c1b73c39bb10008431b44", + _md: "2023-12-27T12:41:24.428Z", + createdOn: "2023-12-27T12:41:24.428Z", + data: { + teams: [], + groups: [{ permissions: [{ name: "*" }], id: "658c1b60c39bb10008431b42" }] + }, + GSI1_SK: "TYPE#group#IDENTITY#658c1b73c39bb10008431b44", + SK: "LINK#T#root", + webinyVersion: "5.38.2", + PK: "IDENTITY#658c1b73c39bb10008431b44", + type: "group", + GSI1_PK: "T#root" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg", + "text@aliases": [], + "number@size": 33888, + "text@name": "scaffolding.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.041Z", + TYPE: "cms.entry.l", + entryId: "6022814bef4a940008b3ba26", + tenant: "root", + _md: "2023-12-27T12:42:59.041Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "6022814bef4a940008b3ba26#0001", + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba26" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg", + "text@aliases": [], + "number@size": 33888, + "text@name": "scaffolding.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.023Z", + TYPE: "cms.entry", + entryId: "6022814bef4a940008b3ba26", + tenant: "root", + _md: "2023-12-27T12:42:59.023Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "6022814bef4a940008b3ba26#0001", + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba26" + }, + { + _md: "2023-12-27T12:43:23.802Z", + data: { + path: "/not-found", + files: [ + { + name: "index.html", + type: "text/html", + meta: { + tags: [ + { value: "658c1bd3c39bb10008431b5c#0001", key: "pb-page" }, + { value: "main-menu", key: "pb-menu" } + ] + } + }, + { name: "graphql.json", type: "application/json", meta: {} } + ], + locale: "en-US", + tenant: "root", + tags: [{ value: true, key: "notFoundPage" }] + }, + GSI1_SK: "/not-found", + SK: "A", + PK: "T#root#PS#RENDER#/not-found", + _et: "PrerenderingServiceRender", + _ct: "2023-12-27T12:43:23.802Z", + TYPE: "ps.render", + GSI1_PK: "T#root#PS#RENDER" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg", + "text@aliases": [], + "number@size": 60602, + "text@name": "cost-icon.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.122Z", + TYPE: "cms.entry.l", + entryId: "6022814851197600081724ae", + tenant: "root", + _md: "2023-12-27T12:42:59.122Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "6022814851197600081724ae#0001", + PK: "T#root#L#en-US#CMS#CME#6022814851197600081724ae" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg", + "text@aliases": [], + "number@size": 60602, + "text@name": "cost-icon.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.121Z", + TYPE: "cms.entry", + entryId: "6022814851197600081724ae", + tenant: "root", + _md: "2023-12-27T12:42:59.121Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "6022814851197600081724ae#0001", + PK: "T#root#L#en-US#CMS#CME#6022814851197600081724ae" + }, + { + icon: "fas/star", + savedOn: "2023-12-27T12:42:51.921Z", + locale: "en-US", + slug: "ungrouped", + _et: "CmsGroups", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + name: "Ungrouped", + _ct: "2023-12-27T12:42:51.962Z", + TYPE: "cms.group", + tenant: "root", + _md: "2023-12-27T12:42:51.962Z", + createdOn: "2023-12-27T12:42:51.921Z", + SK: "658c1bcbc39bb10008431b45", + description: "A generic content model group", + webinyVersion: "5.38.2", + id: "658c1bcbc39bb10008431b45", + PK: "T#root#L#en-US#CMS#CMG" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg", + "text@aliases": [], + "number@size": 3661, + "text@name": "webiny-serverless-application-framework.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:58.964Z", + TYPE: "cms.entry.l", + entryId: "6022814a0df4b000088735bb", + tenant: "root", + _md: "2023-12-27T12:42:58.964Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "6022814a0df4b000088735bb#0001", + PK: "T#root#L#en-US#CMS#CME#6022814a0df4b000088735bb" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg", + "text@aliases": [], + "number@size": 3661, + "text@name": "webiny-serverless-application-framework.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:58.964Z", + TYPE: "cms.entry", + entryId: "6022814a0df4b000088735bb", + tenant: "root", + _md: "2023-12-27T12:42:58.964Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "6022814a0df4b000088735bb#0001", + PK: "T#root#L#en-US#CMS#CME#6022814a0df4b000088735bb" + }, + { + _md: "2023-12-27T12:43:14.832Z", + data: { + path: "/welcome-to-webiny", + files: [ + { + name: "index.html", + type: "text/html", + meta: { + tags: [ + { value: "658c1bd3c39bb10008431b5b#0001", key: "pb-page" }, + { value: "main-menu", key: "pb-menu" } + ] + } + }, + { name: "graphql.json", type: "application/json", meta: {} } + ], + locale: "en-US", + tenant: "root" + }, + GSI1_SK: "/welcome-to-webiny", + SK: "A", + PK: "T#root#PS#RENDER#/welcome-to-webiny", + _et: "PrerenderingServiceRender", + _ct: "2023-12-27T12:43:14.831Z", + TYPE: "ps.render", + GSI1_PK: "T#root#PS#RENDER" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:12.775Z", + locale: "en-US", + status: "published", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAQArKdlkBgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 1" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:12.835Z", + entryId: "658c248b6607be00087f1166", + tenant: "root", + _md: "2023-12-27T13:20:12.835Z", + createdOn: "2023-12-27T13:20:11.821Z", + locked: true, + + // We've deliberately removed the `ownedBy` field here, just so we can see how + // the data migration code will behave / what operations will be performed on the record. + // ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + + SK: "L", + publishedOn: "2023-12-27T13:20:12.775Z", + webinyVersion: "5.38.2", + id: "658c248b6607be00087f1166#0001", + PK: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:12.775Z", + locale: "en-US", + status: "published", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAQArKdlkBgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 1" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:12.803Z", + TYPE: "cms.entry.p", + entryId: "658c248b6607be00087f1166", + tenant: "root", + _md: "2023-12-27T13:20:12.803Z", + createdOn: "2023-12-27T13:20:11.821Z", + locked: true, + + // We've deliberately removed the `ownedBy` field here, just so we can see how + // the data migration code will behave / what operations will be performed on the record. + // ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + + SK: "P", + publishedOn: "2023-12-27T13:20:12.775Z", + webinyVersion: "5.38.2", + id: "658c248b6607be00087f1166#0001", + PK: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:12.775Z", + locale: "en-US", + status: "published", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAQArKdlkBgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 1" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:12.803Z", + TYPE: "cms.entry", + entryId: "658c248b6607be00087f1166", + tenant: "root", + _md: "2023-12-27T13:20:12.803Z", + createdOn: "2023-12-27T13:20:11.821Z", + locked: true, + + // We've deliberately removed the `ownedBy` field here, just so we can see how + // the data migration code will behave / what operations will be performed on the record. + // ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + + SK: "REV#0001", + publishedOn: "2023-12-27T13:20:12.775Z", + webinyVersion: "5.38.2", + id: "658c248b6607be00087f1166#0001", + PK: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg", + "text@aliases": [], + "number@size": 390, + "text@name": "pink-shape.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.004Z", + TYPE: "cms.entry.l", + entryId: "60228148f98841000981c723", + tenant: "root", + _md: "2023-12-27T12:42:59.004Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "60228148f98841000981c723#0001", + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c723" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg", + "text@aliases": [], + "number@size": 390, + "text@name": "pink-shape.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.004Z", + TYPE: "cms.entry", + entryId: "60228148f98841000981c723", + tenant: "root", + _md: "2023-12-27T12:42:59.004Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "60228148f98841000981c723#0001", + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c723" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg", + "text@aliases": [], + "number@size": 1758, + "text@name": "serverless-cms-logo.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.065Z", + TYPE: "cms.entry.l", + entryId: "602281486639200009fd35eb", + tenant: "root", + _md: "2023-12-27T12:42:59.065Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "602281486639200009fd35eb#0001", + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35eb" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg", + "text@aliases": [], + "number@size": 1758, + "text@name": "serverless-cms-logo.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.065Z", + TYPE: "cms.entry", + entryId: "602281486639200009fd35eb", + tenant: "root", + _md: "2023-12-27T12:42:59.065Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "602281486639200009fd35eb#0001", + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35eb" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg", + "text@aliases": [], + "number@size": 90163, + "text@name": "webiny-infrastructure-overview.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:58.984Z", + TYPE: "cms.entry.l", + entryId: "6022814891bd1300087bd24c", + tenant: "root", + _md: "2023-12-27T12:42:58.984Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "6022814891bd1300087bd24c#0001", + PK: "T#root#L#en-US#CMS#CME#6022814891bd1300087bd24c" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg", + "text@aliases": [], + "number@size": 90163, + "text@name": "webiny-infrastructure-overview.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:58.984Z", + TYPE: "cms.entry", + entryId: "6022814891bd1300087bd24c", + tenant: "root", + _md: "2023-12-27T12:42:58.984Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "6022814891bd1300087bd24c#0001", + PK: "T#root#L#en-US#CMS#CME#6022814891bd1300087bd24c" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg", + "text@aliases": [], + "number@size": 30007, + "text@name": "octo-cat.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.281Z", + TYPE: "cms.entry.l", + entryId: "60228145f98841000981c71f", + tenant: "root", + _md: "2023-12-27T12:42:59.281Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "60228145f98841000981c71f#0001", + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c71f" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg", + "text@aliases": [], + "number@size": 30007, + "text@name": "octo-cat.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.281Z", + TYPE: "cms.entry", + entryId: "60228145f98841000981c71f", + tenant: "root", + _md: "2023-12-27T12:42:59.281Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "60228145f98841000981c71f#0001", + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c71f" + }, + { + _md: "2023-12-27T12:27:56.852Z", + data: { + description: "starting point for applicable migrations detection", + reason: "initial migration", + id: "5.38.2-000", + finishedOn: "2023-12-27T12:27:56.852Z", + startedOn: "2023-12-27T12:27:56.852Z" + }, + GSI1_SK: "5.38.2-000", + SK: "A", + PK: "MIGRATION#5.38.2-000", + _et: "Migration", + _ct: "2023-12-27T12:27:56.852Z", + TYPE: "migration", + GSI1_PK: "MIGRATIONS" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg", + "text@aliases": [], + "number@size": 392, + "text@name": "cms-benefits-shape.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.081Z", + TYPE: "cms.entry.l", + entryId: "602281486639200009fd35ec", + tenant: "root", + _md: "2023-12-27T12:42:59.081Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "602281486639200009fd35ec#0001", + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35ec" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg", + "text@aliases": [], + "number@size": 392, + "text@name": "cms-benefits-shape.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.068Z", + TYPE: "cms.entry", + entryId: "602281486639200009fd35ec", + tenant: "root", + _md: "2023-12-27T12:42:59.068Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "602281486639200009fd35ec#0001", + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35ec" + }, + { + _md: "2023-12-27T12:43:23.860Z", + data: { + path: "/not-found", + value: "658c1bd3c39bb10008431b5c#0001", + tenant: "root", + key: "pb-page" + }, + GSI1_SK: "pb-page#658c1bd3c39bb10008431b5c#0001#/not-found", + SK: "658c1bd3c39bb10008431b5c#0001#/not-found", + PK: "T#root#PS#TAG#pb-page#658c1bd3c39bb10008431b5c#0001#/not-found", + _et: "PrerenderingServiceTagPathLink", + _ct: "2023-12-27T12:43:23.860Z", + TYPE: "ps.tagPathLink", + GSI1_PK: "T#root#PS#TAG" + }, + { + modelId: "modelB", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:22:46.091Z", + locale: "en-US", + status: "published", + values: { + "text@4dep2w2h": "DDB+ES - Model B Entry 1", + "long-text@7c5t8wwa": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBScM0rKapUMAQAaZvoqRgAAAA=" + } + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:22:46.130Z", + entryId: "658c2524adbc1700090e1ad1", + tenant: "root", + _md: "2023-12-27T13:22:46.130Z", + createdOn: "2023-12-27T13:22:44.672Z", + locked: true, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + publishedOn: "2023-12-27T13:22:46.091Z", + webinyVersion: "5.38.2", + id: "658c2524adbc1700090e1ad1#0001", + PK: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1" + }, + { + modelId: "modelB", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:22:46.091Z", + locale: "en-US", + status: "published", + values: { + "text@4dep2w2h": "DDB+ES - Model B Entry 1", + "long-text@7c5t8wwa": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBScM0rKapUMAQAaZvoqRgAAAA=" + } + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:22:46.115Z", + TYPE: "cms.entry.p", + entryId: "658c2524adbc1700090e1ad1", + tenant: "root", + _md: "2023-12-27T13:22:46.115Z", + createdOn: "2023-12-27T13:22:44.672Z", + locked: true, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "P", + publishedOn: "2023-12-27T13:22:46.091Z", + webinyVersion: "5.38.2", + id: "658c2524adbc1700090e1ad1#0001", + PK: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1" + }, + { + modelId: "modelB", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:22:46.091Z", + locale: "en-US", + status: "published", + values: { + "text@4dep2w2h": "DDB+ES - Model B Entry 1", + "long-text@7c5t8wwa": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBScM0rKapUMAQAaZvoqRgAAAA=" + } + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:22:46.114Z", + TYPE: "cms.entry", + entryId: "658c2524adbc1700090e1ad1", + tenant: "root", + _md: "2023-12-27T13:22:46.114Z", + createdOn: "2023-12-27T13:22:44.672Z", + locked: true, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + publishedOn: "2023-12-27T13:22:46.091Z", + webinyVersion: "5.38.2", + id: "658c2524adbc1700090e1ad1#0001", + PK: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg", + "text@aliases": [], + "number@size": 7806, + "text@name": "scalable-icon.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.102Z", + TYPE: "cms.entry.l", + entryId: "60228148fa244d0008c47c79", + tenant: "root", + _md: "2023-12-27T12:42:59.102Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "60228148fa244d0008c47c79#0001", + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c79" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg", + "text@aliases": [], + "number@size": 7806, + "text@name": "scalable-icon.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.101Z", + TYPE: "cms.entry", + entryId: "60228148fa244d0008c47c79", + tenant: "root", + _md: "2023-12-27T12:42:59.101Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "60228148fa244d0008c47c79#0001", + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c79" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg", + "text@aliases": [], + "number@size": 27878, + "text@name": "idp.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.146Z", + TYPE: "cms.entry.l", + entryId: "60228148f98841000981c724", + tenant: "root", + _md: "2023-12-27T12:42:59.146Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "60228148f98841000981c724#0001", + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c724" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg", + "text@aliases": [], + "number@size": 27878, + "text@name": "idp.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.146Z", + TYPE: "cms.entry", + entryId: "60228148f98841000981c724", + tenant: "root", + _md: "2023-12-27T12:42:59.146Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "60228148f98841000981c724#0001", + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c724" + }, + { + _md: "2023-12-27T12:43:19.484Z", + data: { path: "/", value: "658c1bd3c39bb10008431b5b#0001", tenant: "root", key: "pb-page" }, + GSI1_SK: "pb-page#658c1bd3c39bb10008431b5b#0001#/", + SK: "658c1bd3c39bb10008431b5b#0001#/", + PK: "T#root#PS#TAG#pb-page#658c1bd3c39bb10008431b5b#0001#/", + _et: "PrerenderingServiceTagPathLink", + _ct: "2023-12-27T12:43:19.484Z", + TYPE: "ps.tagPathLink", + GSI1_PK: "T#root#PS#TAG" + }, + { + tenant: "root", + code: "en-US", + _md: "2023-12-27T12:42:49.523Z", + default: true, + createdOn: "2023-12-27T12:42:48.245Z", + SK: "en-US", + webinyVersion: "5.38.2", + PK: "T#root#I18N#L", + _et: "I18NLocale", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:49.523Z" + }, + { + SK: "default", + PK: "ADMIN#SETTINGS", + data: { appUrl: "https://d3hohw12noi930.cloudfront.net" } + }, + { + content: { + compression: "jsonpack", + content: + "id|h0HqpItbGT|type|document|data|settings|elements|ZlkwCyXhhc|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|horizontalAlignFlex|center|verticalAlign|flex-start|pwR8zBN28v|grid|1100px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|6838kMd5Vh|cell|80px|size|iG8DLRffpF|heading|text|typography|heading1|alignment|tag|h1|color|color3|Page+not+found!|9UHkb1nlN1|paragraph|paragraph1|div|Sorry,+but+the+page+you+were+looking+for+could+not+be+found.|PkNZ6zIVWv|button|buttonText|TAKE+ME+HOme|30px|link|href|/|primary^C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|N|$A|O]|P|$A|Q]]]|6|@$0|R|2|S|4|$5|$9|$A|$B|T]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|S|$U|V]|W|$A|$X|Y]|Z|$X|10]]|N|$A|Q]|P|$A|Q]]]|6|@$0|11|2|12|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|E|13]]|S|$14|1U]]]|6|@$0|15|2|16|4|$17|$A|$2|16|18|19|1A|O|1B|1C|1D|1E]|4|$17|1F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|1G|2|1H|4|$17|$A|$2|1H|18|1I|1A|O|1B|1J|1D|1E]|4|$17|1K]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|1L|2|1M|4|$1N|1O|5|$D|$A|$L|F|J|-1|E|1P]]|N|$A|O]]|1Q|$1R|1S]|2|1T]|6|@]]]]]]]]]]" + }, + status: "published", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + TYPE: "pb.page.p.path", + _md: "2023-12-27T12:43:00.682Z", + SK: "/not-found", + publishedOn: "2023-12-27T12:43:00.663Z", + id: "658c1bd3c39bb10008431b5c#0001", + editor: "page-builder", + version: 1, + settings: { seo: { meta: [] }, general: { layout: "static" }, social: { meta: [] } }, + path: "/not-found", + locale: "en-US", + savedOn: "2023-12-27T12:43:00.663Z", + pid: "658c1bd3c39bb10008431b5c", + _et: "PbPages", + _ct: "2023-12-27T12:43:00.682Z", + tenant: "root", + createdOn: "2023-12-27T12:42:59.964Z", + locked: true, + category: "static", + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + webinyVersion: "5.38.2", + PK: "T#root#L#en-US#PB#PATH", + title: "Not Found" + }, + { + content: { + compression: "jsonpack", + content: + 'id|Fv1PpPWu-|type|document|data|settings|elements|xqt7BI4iN9|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|100px|275px|16px|tablet|horizontalAlignFlex|center|verticalAlign|flex-start|background|image|file|6022814b7a77e60008f70d62|src|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg|gdE7Q7rcA|grid|1100px|20px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|_fbQO4Nlpp|cell|size|cdk_pclqE|6022814b0df4b000088735bc|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg|height|44px|ovLRNqyVu3|wmMU13uZ10|1eUZzAvoB|heading|text|typography|heading1|alignment|tag|h1|color|color6|Welcome+to+Webiny|F6ZREnQcc|64px|oEgjDLVXUu|0xYOozhJw|paragraph|paragraph1|div|Webiny+makes+it+easy+to+build+applications+and+websites+on+top+of+the+serverless+infrastructure+by+providing+you+with+a+ready-made+CMS+and+a+development+framework.
|20%25|20%25|gwhTOrZvc|30px|6-6|EaIMtHtOIw|-8px|px|602282e07a77e60008f70d63|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg|8k7zxQUTm|heading6|h6|Scalable|qNngQ1C-5|paragraph2|Webiny+apps+can+scale+to+handle+the+most+demanding+workloads.
|uBv_VRv0i|8px|iQaW4vjKg|No+custom+tooling+required|Wy3Tw-Lb8|Webiny+eliminates+the+need+to+build+custom+tooling+to+create+serverless+app
|uwrjoSZkB|Q39eQZm_8z|zSVZIwnSQ0|Cost+effective|S-Ydr4kX6k|Webiny+apps+run+on+serverless+infrastructure+which+costs+80%25+less+than+VMs
|nUX2JXYjhD|8z0hL8l7ay|Resolves+serverless+challenges|04ZNIcAGE_|Webiny+removes+all+the+challenges+of+building+serverless+applications
|vm0cFfH8KG|100%25|65px|75px|txeqybzKr3|80px|wMjC2uv8cj|Pm7ws20iA|color3|Get+to+know+Webiny+products|6CPpd558B|heading2|h2|Architect.+Code.+Deploy.|1e0_OJgMx|gpYd80MXeg|40px|15px|kAYc-QClR|4-8|border|style|solid|rgba(229,+229,+229,+1)|1|8i803wClVt|p55J-BkDn|6022814a0df4b000088735bb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg|90px|link|8nddxG64r|PR-yiR65n|heading3|h3|Webiny+Serverless+

Application+Framework|pVH9_fFLM|x0SSJvgrdD|b0iE8vr2S|Everything+you+need+to+create+and+deploy+applications+on+top+of+the+serverless+infrastructure. 
|JMSKwWsT_|OU70Y990tA|T_M_Ww4Wb|heading4|h4|Use+it+to+build:|806nmKOyc|g59JmcyM-7|Cyziie_SK|list|

    \n++++++++++++++++++++
  • Full-stack+applications
  • Multi-tenant+solutions
  • \n++++++++++++++++
|ST0O1ZeCk|ILrAABWXiX|
    \n++++++++++++++++++++
  • APIs
  • Microservice
  • \n++++++++++++++++
|XxXGeIywO|9H5t3COdbo|mc0_RS9rg|button|buttonText|Learn+more|50px|href|https://www.webiny.com/serverless-application-framework/|newTab|primary|icon|fas|long-arrow-alt-right|svg||position|16|Kg3rMc1Re|LAcQHMs8K|8oaRz-Gko_|9fQ9W-xiB|6022814891bd1300087bd24c|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg|YCG34DB89|xvBXD_QTkN|GqW2LBMzV|An+easier+way+to+build+serverless+apps|9cWYQwXUd|There+are+many+solutions+that+help+you+run,+deploy+and+monitor+serverless+functions,+but+when+it+comes+to+actually+coding+one,+there+are+none.+Webiny+is+a+solution+that+helps+you+code+your+serverless+app+by+providing+you+with+all+the+components+like+ACL,+routing,+file+storage+and+many+more.
|LxqyquKlYy|100%25|60px|177px|60228148f98841000981c723|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg|yqrzxoDllE|70px|bD-TQmZyW8|4ESAx7NxM|Framework+features|Xr7NLMpzm|3-3-3-3|_RtRioPOsj|12px|mOr47ImJK|AlTNw-76F8|r0e8MiCuK|6022814bef4a940008b3ba27|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg|170px|QFwbqHtSh|DH-C0-mBsO|XSN-oY3V3|Users,+groups,+roles+&+scopes|Unyhp8o-a|Security+is+a+crucial+layer+in+any+application.+Webiny+includes+a+full-featured+security+module+that\'s+connected+to+the+built-in+GraphQL+API.Users,+groups,+roles+&+scopes
|Ntcduee0-|0b66dbGkG|PoRqI9i2xE|0ZpnBSqjoz|6022814bef4a940008b3ba26|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg|FFGobMHHI|IWxl_nrRkr|I5btsZceI|Scaffolding|5qvaQSnP6|Quickly+generate+boilerplate+code+using+CLI+plugins.+From+lambda+functions+to+new+GraphQL+APIs.
|YHUznp7ZM5|PlxqV_uS7B|zKQYI-EIFl|frRuzWpRI|60228148f98841000981c724|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg|M1tvv840H|fwreagGdac|6H1tgEViY|Customizable+security|h0Ctka4TED|Use+the+default+AWS+Cognito,+or+replace+with+3rd+party+identity+providers+like+Okta,+Auth0,+etc.+Using+plugins+you+can+make+Webiny+work+with+any+identity+provider.
|SyyrOA60AF|GvU31fd4U|1vAxZAkD9O|dlI-qhVLKy|6022814bef4a940008b3ba28|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg|ftA7NOOxG|WU58SBDPP8|QtYfpt1yoE|Multiple+environments|mmpGUzg6o1|No+code+change+goes+directly+into+a+production+environment.+Webiny+CLI+makes+it+easy+to+manage+and+create+multiple+environments+for+your+project.
|wYK9BhaanZ|100%25|125px|ur1DQFl5BR|TzBvXtU2PH|-PU3iBlQ4|A6sNR3MR-5|Xtqk_itss|602281486ed41f0008bc2dad|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png|495px|bsKTDygik|ev9nhHISRw|1BBr9ACuM|One+size+doesn\'t+fit+all|0olguTqDN|It\'s+a+very+different+set+of+requirements+a+technical+team+has+to+a+marketing+team+to+a+business+development+team.+Webiny+Serverless+CMS+comes+with+several+different+apps+you+can+use+independently,+or+together+as+part+of+a+cohesive+solution.
|BhnYb3VW7D|QYZ290WhC|rgba(238,+238,+238,+1)|ER2SFYwbeK|gZp3Hxm5Js|602281486639200009fd35eb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg|FsOaMudE8|ElruSYJxWM|Webiny+Serverless+

CMS|9HJcM89Am|8Cp2ZC30_H|qrS5wswdQ|heading5|h5|A+suite+of+applications+to+help+you+manage+your+content.+|pLUutc-E2|MGlDcu91q_|A6rStUekq|Use+it+to+build:|jIdakfVZU|5JHsGc_Rq-|SNOFqUK6lI|

    \n++++++++++++++++++++
  • Marketing+sites
  • \n++++++++++++++++++++
  • Multi-website+solutions
  • \n++++++++++++++++++++
  • Content+hubs
  • \n++++++++++++++++
|96dJBnIlc|5cPfb7AwXH|
    \n++++++++++++++++++++
  • Multi-language+sites
  • \n++++++++++++++++++++
  • Intranet+portals
  • \n++++++++++++++++++++
  • Headless+content+models
  • \n++++++++++++++++
|L4dFyzBKMM|Learn+more|https://www.webiny.com/serverless-cms/||mjmNmloeUS|100%25|220px|602281486639200009fd35ec|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg|xUkOEAm5X3|Kgr1ambSuG|AP_uTrgLZ|CMS+benefits|juBaAPJ76|4-4-4|s95PSAToXK|35px|ZECp8jcZD|60228148fa244d0008c47c79|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg|146px|EyKog1RmH|Scalable|_8lCcwhUN|No+matter+the+demand,+Webiny+Serverless+CMS+can+easily+scale+to+meet+even+the+most+challenging+workloads.
|SmrEQ9OZ8|QWM8cmlQEM|60228145f98841000981c720|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg|TYx-A5YCI|Adaptable|SsbWKZz_Z|Being+an+open-source+project,+it\'s+easy+to+modify+and+adapt+things+to+your+own+needs.
|gqdtbKfv7l|jBWaxzt-4|6022814851197600081724ae|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg|NLSOIstf9|Low+cost+of+ownership|kI-neIjkXx|Self-hosted+on+top+of+serverless+infrastructure.+No+infrastructure+to+mange,+less+people+required+to+operate+and+maintain.
|V14HHGmXN|-djsQadY-8|pTVeVoKkTi|bM5b8O7IMY|Secure|l9PuI-TdVA|Secured+by+AWS+Cognito.+It\'s+also+easy+to+integrate+services+like+OKTA,+Auth0+and+similar.
|N1lW0cAasg|W-ub9guhLt|602281486ed41f0008bc2dac|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg|DVhLZfrM53|Data+ownership|shmIumNfIu|Webiny+is+self-hosted,+it+means+your+data+stays+within+your+data+center.+
|8F7J_16a46|2gtT4Mfw6c|602281486ed41f0008bc2dab|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg|5EMJkVWgKW|Permission+control|cdSOjFAWkf|Powerful+options+to+control+the+permissions+your+users+will+have.+They+perfectly+align+with+your+business+requirements. 
|5ggqk561Ka|100%25|C6B8QfkUXs|ChF1iOAbtb|7tRfsJ_SEz|Serverless+makes+infrastructure+easy,+

Webiny+makes+serverless+easy|oYf9t6Uwz|RdazJP-4W1|7jBNW1iTi|60228145f98841000981c721|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg|200px|npNMgLft0|1.+Developer-friendly|DpubDRaGQ|Webiny+has+been+made+with+the+developer+in+mind.+It+helps+them+develop+serverless+applications+with+ease.
|KbQocaayR|KDO-Ja7wS|60228145f98841000981c71f|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg|ETll3nkV4|2.+Open+source|UWPjvO7EC|Webiny+is+created+and+maintained+by+an+amazing+group+of+people.+Being+open+source+means+Webiny+grows+and+evolves+much+faster.+Contributor+are+welcome.
|En4soRn06o|fqxeYbEV4|60228148fa244d0008c47c7a|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png|276px|e5v0LBbfz|3.+Community|p9FWp5yqUy|We+have+an+active+community+on+slack.+Talk+to+the+core-team,+and+get+help.+Webiny+team+is+always+there+for+any+questions.
|OYp5Z-6Xo|woaE-6v5bN|Y8ndbn88hy|View+Webiny+on+GitHub|https://github.com/webiny/webiny-js|secondary|fab|github|^C|C|C|6|6|6|6|C|6|3|9|C|C|6|6|C|6|C|C|C|3|C|C|3|C|C|3|C|C|3|C|C|6|C|C|6|3|9|C|C|6|6|C|4|4|4|4|4|4|C|4|4|4|C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|O|I|P|G|P]|Q|$J|-1|I|M|G|M]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|Y|Z|10]]]]]]|6|@$0|11|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BC]]]|6|@$0|1F|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|1G|Z|1H]|1I|1J]]|6|@]]]]]]|$0|1K|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1L|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BD]]]|6|@$0|1M|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|1V]|4|$1O|1W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|1X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|1Y|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1Z|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BE]]]|6|@$0|20|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|1V]|4|$1O|24]]|5|$D|$A|$L|F]]|K|$A|$L|F|J|-1|I|25|G|26]|Q|$I|F|G|F|J|-1]]]]|6|@]]]]]]|$0|27|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]|Q|$I|2C]]|K|$A|$L|F]]|12|$1E|BF]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2F|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2I]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2J|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2L]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BG]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2O|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2Q|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|2S|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]|1A|$J|-2]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2T|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]]|K|$A|$L|F]]|12|$1E|BH]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2U|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2V]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2W|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2X]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|Q|$J|-1|I|2N|E|F]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BI]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2Z|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|30]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|31|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|32]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|33|2|8|4|$5|$9|$A|$B|34]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|35|H|36|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|37|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|38|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|39|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BJ]]]|6|@$0|3A|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|3C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|3D|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|S|1S|3F|1U|3B]|4|$1O|3G]]|5|$D|$A|$L|F|J|-1|E|P]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|3H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|3I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|BK]]]|6|@$0|3L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|S]|3N|$A|$3O|3P|1U|3Q|9|$L|3R|J|-1|H|3R]]]]]|6|@$0|3S|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BL]]]|6|@$0|3T|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|3U|Z|3V]|1I|3W]|3X|$]]|6|@]]]]|$0|3Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BM]]]|6|@$0|3Z|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41|1U|3B]|4|$1O|42]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|43|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|44|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BN]]]|6|@$0|45|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|46]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|47|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|P|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|48|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BO]]]|6|@$0|49|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|4C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4D|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4E|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BP]]]|6|@$0|4F|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4H]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|4I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BQ]]]|6|@$0|4J|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BR]]]|6|@$0|4N|2|4O|4|$4P|4Q|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|4T|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|50|51|G|9|52]]|6|@]]]]]]]]|$0|53|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$E|F|G|F|H|F|I|F|L|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|BS]]]|6|@$0|54|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|55|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BT]]]|6|@$0|56|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|57|Z|58]]|3X|$]]|6|@]]]]]]|$0|59|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BU]]]|6|@$0|5B|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|5C]]|5|$D|$A|$L|F|J|-1]]|K|$A|$L|F]]]]|6|@]]|$0|5D|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|5E]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]]]]]|$0|5F|2|8|4|$5|$9|$A|$B|5G]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|5H|G|P|H|5I|I|P|J|-1]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|5J|Z|5K]]]]]]|6|@$0|5L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|5M|I|F|J|-1]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BV]]]|6|@$0|5O|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|5P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|5Q|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|5R]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5S|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|5T]|1A|$I|5T|J|-1]]|12|$1E|BW]]]|6|@$0|5U|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5V|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BX]]]|6|@$0|5W|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|5X|Z|5Y]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|60|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|61|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BY]]]|6|@$0|62|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|63]]|5|$D|$A|$L|F|J|-1|H|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|64|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|65]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|66|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|BZ]]]|6|@$0|67|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|68|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C0]]]|6|@$0|69|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6A|Z|6B]|1I|5Z]]|6|@]]]]]]|$0|6C|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6D|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C1]]]|6|@$0|6E|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6G|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6H]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|C2]]]|6|@$0|6J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6K|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C3]]]|6|@$0|6L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|6O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6P|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C4]]]|6|@$0|6Q|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6S|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6T]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|5T]|1A|$G|5T|J|-1]]|12|$1E|C5]]]|6|@$0|6V|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6W|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C6]]]|6|@$0|6X|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6Y|Z|6Z]|1I|5Z]]|6|@]]]]]]|$0|70|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|71|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C7]]]|6|@$0|72|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|73]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|74|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|75]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|76|2|8|4|$5|$9|$A|$B|77]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|78|G|P|H|36|I|P|J|-1]]|R|$A|S]|T|$A|U]]]|6|@$0|79|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7A|2|1D|4|$5|$D|$A|$E|F|G|F|H|38|I|F|J|-1]|1A|$J|-1]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|C8]]]|6|@$0|7B|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C9]]]|6|@$0|7D|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7E|Z|7F]|9|7G]]|6|@]]]]]]|$0|7H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CA]]]|6|@$0|7J|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|7K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7L|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|7M]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|7N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|CB]]]|6|@$0|7O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]|3N|$A|$3O|3P|1U|7P|9|$J|-1|H|3R]]]]]|6|@$0|7Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CC]]]|6|@$0|7R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7S|Z|7T]|1I|3W]|3X|$]]|6|@]]]]|$0|7U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CD]]]|6|@$0|7V|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41]|4|$1O|7W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CE]]]|6|@$0|7Z|2|1N|4|$1O|$A|$2|1N|1P|80|1R|I|1S|81|1U|3B]|4|$1O|82]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|83|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|4R|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|84|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CF]]]|6|@$0|85|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|86]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|87|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|88|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CG]]]|6|@$0|89|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8A]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|8B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CH]]]|6|@$0|8C|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8D]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8E|2|4O|4|$4P|8F|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|8G|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|8H|51|G|9|52]]|6|@]]]]]]]]|$0|8I|2|8|4|$5|$9|$A|$B|8J]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|38|H|8K|I|P|G|P]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|8L|Z|8M]]]]]]|6|@$0|8N|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|5H|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8O|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CI]]]|6|@$0|8P|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|8Q]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8R|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8T|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|G|8U|I|8U]]|12|$1E|CJ]]]|6|@$0|8V|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|8W|Z|8X]|1I|8Y]|3X|$]]|6|@]]|$0|8Z|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|90]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|91|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|92]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|93|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CK]]]|6|@$0|94|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|95|Z|96]|1I|8Y]|3X|$]]|6|@]]|$0|97|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|98]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|99|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9A]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CL]]]|6|@$0|9C|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9D|Z|9E]|1I|8Y]|3X|$]]|6|@]]|$0|9F|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9G]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9H|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9I]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|9J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|5H|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|9K|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|I|8U]]|12|$1E|CM]]]|6|@$0|9L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|8Y]|3X|$]]|6|@]]|$0|9M|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9N]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9O|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9P]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CN]]]|6|@$0|9R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9S|Z|9T]|1I|8Y]|3X|$]]|6|@]]|$0|9U|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9V]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9W|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23]|4|$1O|9X]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CO]]]|6|@$0|9Z|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|A0|Z|A1]|1I|8Y]|3X|$]]|6|@]]|$0|A2|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|A3]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|A4|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|A5]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|A6|2|8|4|$5|$9|$A|$B|A7]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|N|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|A8|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|A9|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CP]]]|6|@$0|AA|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|AB]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|AC|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|38|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|AD|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|4R]|1A|$G|4R|J|-1|I|4R]]|12|$1E|CQ]]]|6|@$0|AE|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AF|Z|AG]|1I|AH]|3X|$]]|6|@]]|$0|AI|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AJ]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AK|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AL]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AM|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|4R|G|4R]]|12|$1E|CR]]]|6|@$0|AN|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AO|Z|AP]|1I|AH]|3X|$]]|6|@]]|$0|AQ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AR]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AS|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AT]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AU|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|4R]]|K|$A|$L|F|J|-1|I|4R]|1A|$J|-1|I|4R|G|4R]]|12|$1E|CS]]]|6|@$0|AV|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AW|Z|AX]|1I|AH|9|AY]|3X|$]]|6|@]]|$0|AZ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|B0]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|B1|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|B2]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|B3|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|3J|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|B4|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CT]]]|6|@$0|B5|2|4O|4|$4P|B6|5|$D|$A|$L|F]]|R|$A|S]]|3X|$4S|B7|4U|-1]|2|B8|4W|$0|@B9|BA]|4Z|BB|9|52]]|6|@]]]]]]]]]]' + }, + status: "published", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + TYPE: "pb.page.p.path", + _md: "2023-12-27T12:43:00.881Z", + SK: "/welcome-to-webiny", + publishedOn: "2023-12-27T12:43:00.723Z", + id: "658c1bd3c39bb10008431b5b#0001", + editor: "page-builder", + version: 1, + settings: { seo: { meta: [] }, general: { layout: "static" }, social: { meta: [] } }, + path: "/welcome-to-webiny", + locale: "en-US", + savedOn: "2023-12-27T12:43:00.723Z", + pid: "658c1bd3c39bb10008431b5b", + _et: "PbPages", + _ct: "2023-12-27T12:43:00.881Z", + tenant: "root", + createdOn: "2023-12-27T12:42:59.947Z", + locked: true, + category: "static", + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + webinyVersion: "5.38.2", + PK: "T#root#L#en-US#PB#PATH", + title: "Welcome to Webiny" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:34.175Z", + locale: "en-US", + status: "published", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 3" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:34.204Z", + entryId: "658c24a16607be00087f1168", + tenant: "root", + _md: "2023-12-27T13:20:34.204Z", + createdOn: "2023-12-27T13:20:33.775Z", + locked: true, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + publishedOn: "2023-12-27T13:20:34.175Z", + webinyVersion: "5.38.2", + id: "658c24a16607be00087f1168#0001", + PK: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:34.175Z", + locale: "en-US", + status: "published", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 3" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:34.199Z", + TYPE: "cms.entry.p", + entryId: "658c24a16607be00087f1168", + tenant: "root", + _md: "2023-12-27T13:20:34.199Z", + createdOn: "2023-12-27T13:20:33.775Z", + locked: true, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "P", + publishedOn: "2023-12-27T13:20:34.175Z", + webinyVersion: "5.38.2", + id: "658c24a16607be00087f1168#0001", + PK: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:34.175Z", + locale: "en-US", + status: "published", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 3" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:34.199Z", + TYPE: "cms.entry", + entryId: "658c24a16607be00087f1168", + tenant: "root", + _md: "2023-12-27T13:20:34.199Z", + createdOn: "2023-12-27T13:20:33.775Z", + locked: true, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + publishedOn: "2023-12-27T13:20:34.175Z", + webinyVersion: "5.38.2", + id: "658c24a16607be00087f1168#0001", + PK: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png", + "text@aliases": [], + "number@size": 17382, + "text@name": "community-icon.png", + "text@type": "image/png", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.301Z", + TYPE: "cms.entry.l", + entryId: "60228148fa244d0008c47c7a", + tenant: "root", + _md: "2023-12-27T12:42:59.301Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "60228148fa244d0008c47c7a#0001", + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c7a" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png", + "text@aliases": [], + "number@size": 17382, + "text@name": "community-icon.png", + "text@type": "image/png", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.301Z", + TYPE: "cms.entry", + entryId: "60228148fa244d0008c47c7a", + tenant: "root", + _md: "2023-12-27T12:42:59.301Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "60228148fa244d0008c47c7a#0001", + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c7a" + }, + { + _md: "2023-12-27T12:40:58.922Z", + data: { + parent: null, + settings: { domains: [] }, + webinyVersion: "5.38.2", + savedOn: "2023-12-27T12:40:58.921Z", + name: "Root", + description: "The top-level Webiny tenant.", + id: "root", + createdOn: "2023-12-27T12:40:58.921Z", + tags: [], + status: "active" + }, + GSI1_SK: "T#null#2023-12-27T12:40:58.921Z", + SK: "A", + PK: "T#root", + _et: "TenancyTenant", + _ct: "2023-12-27T12:40:58.922Z", + TYPE: "tenancy.tenant", + GSI1_PK: "TENANTS" + }, + { + _md: "2023-12-27T12:43:01.222Z", + data: { + pages: { notFound: "658c1bd3c39bb10008431b5c", home: "658c1bd3c39bb10008431b5b" }, + websiteUrl: null, + name: "devr", + prerendering: { app: { url: null }, meta: {}, storage: { name: null } }, + locale: "en-US", + type: "default", + tenant: "root" + }, + SK: "A", + PK: "T#root#L#en-US#PB#SETTINGS", + _et: "PbSettings", + _ct: "2023-12-27T12:43:01.222Z", + TYPE: "pb.settings" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg", + "text@aliases": [], + "number@size": 5053, + "text@name": "webiny-logo.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:58.924Z", + TYPE: "cms.entry.l", + entryId: "6022814b0df4b000088735bc", + tenant: "root", + _md: "2023-12-27T12:42:58.924Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "6022814b0df4b000088735bc#0001", + PK: "T#root#L#en-US#CMS#CME#6022814b0df4b000088735bc" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg", + "text@aliases": [], + "number@size": 5053, + "text@name": "webiny-logo.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:58.924Z", + TYPE: "cms.entry", + entryId: "6022814b0df4b000088735bc", + tenant: "root", + _md: "2023-12-27T12:42:58.924Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "6022814b0df4b000088735bc#0001", + PK: "T#root#L#en-US#CMS#CME#6022814b0df4b000088735bc" + }, + { + _md: "2023-12-27T12:42:52.281Z", + data: { + srcPrefix: "https://d3oted5odtbsmd.cloudfront.net/files/", + uploadMinFileSize: 0, + uploadMaxFileSize: 10737418240, + tenant: "root" + }, + SK: "A", + PK: "T#root#FM#SETTINGS", + _et: "FM.Settings", + _ct: "2023-12-27T12:42:52.281Z", + TYPE: "fm.settings" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:42.180Z", + locale: "en-US", + status: "draft", + values: { + "long-text@z2tdm05d": { compression: "gzip", value: "H4sIAAAAAAAAAwMAAAAAAAAAAAA=" }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 4" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:42.181Z", + TYPE: "cms.entry.l", + entryId: "658c24aa6607be00087f1169", + tenant: "root", + _md: "2023-12-27T13:20:42.181Z", + createdOn: "2023-12-27T13:20:42.180Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "658c24aa6607be00087f1169#0001", + PK: "T#root#L#en-US#CMS#CME#658c24aa6607be00087f1169" + }, + { + modelId: "modelA", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:20:42.180Z", + locale: "en-US", + status: "draft", + values: { + "long-text@z2tdm05d": { compression: "gzip", value: "H4sIAAAAAAAAAwMAAAAAAAAAAAA=" }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 4" + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:20:42.181Z", + TYPE: "cms.entry", + entryId: "658c24aa6607be00087f1169", + tenant: "root", + _md: "2023-12-27T13:20:42.181Z", + createdOn: "2023-12-27T13:20:42.180Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "658c24aa6607be00087f1169#0001", + PK: "T#root#L#en-US#CMS#CME#658c24aa6607be00087f1169" + }, + { + SK: "default", + PK: "PS#SETTINGS", + data: { + bucket: "wby-delivery-68ac55a", + cloudfrontId: "E12G8OCR2J2BDW", + appUrl: "https://d1c9xtq19d4x6u.cloudfront.net", + deliveryUrl: "https://d1jwcc7rxvj5th.cloudfront.net", + sqsQueueUrl: + "https://sqs.eu-central-1.amazonaws.com/674320871285/wby-ps-render-queue-bcd2dfd.fifo" + } + }, + { + modelId: "modelB", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:23:15.536Z", + locale: "en-US", + status: "draft", + meta: {}, + values: { + "file@5atpz8nu": null, + "text@4dep2w2h": "DDB+ES - Model B Entry 2 UPDATED", + "long-text@7c5t8wwa": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBScM0rKapUMFIIDXBxDHF1AQA3yyBkIAAAAA==" + } + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:23:15.570Z", + TYPE: "L", + entryId: "658c2531adbc1700090e1ad2", + tenant: "root", + _md: "2023-12-27T13:23:15.570Z", + createdOn: "2023-12-27T13:22:57.094Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "658c2531adbc1700090e1ad2#0001", + PK: "T#root#L#en-US#CMS#CME#658c2531adbc1700090e1ad2", + modifiedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" } + }, + { + modelId: "modelB", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T13:23:15.536Z", + locale: "en-US", + status: "draft", + meta: {}, + values: { + "file@5atpz8nu": null, + "text@4dep2w2h": "DDB+ES - Model B Entry 2 UPDATED", + "long-text@7c5t8wwa": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBScM0rKapUMFIIDXBxDHF1AQA3yyBkIAAAAA==" + } + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T13:23:15.570Z", + TYPE: "cms.entry", + entryId: "658c2531adbc1700090e1ad2", + tenant: "root", + _md: "2023-12-27T13:23:15.570Z", + createdOn: "2023-12-27T13:22:57.094Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "658c2531adbc1700090e1ad2#0001", + PK: "T#root#L#en-US#CMS#CME#658c2531adbc1700090e1ad2", + modifiedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" } + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png", + "text@aliases": [], + "number@size": 108898, + "text@name": "webiny-serverless-cms.png ", + "text@type": "image/png", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.062Z", + TYPE: "cms.entry.l", + entryId: "602281486ed41f0008bc2dad", + tenant: "root", + _md: "2023-12-27T12:42:59.062Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "602281486ed41f0008bc2dad#0001", + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dad" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": + "demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png", + "text@aliases": [], + "number@size": 108898, + "text@name": "webiny-serverless-cms.png ", + "text@type": "image/png", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.061Z", + TYPE: "cms.entry", + entryId: "602281486ed41f0008bc2dad", + tenant: "root", + _md: "2023-12-27T12:42:59.061Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "602281486ed41f0008bc2dad#0001", + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dad" + }, + { + _md: "2023-12-27T12:43:23.860Z", + data: { path: "/not-found", value: "main-menu", tenant: "root", key: "pb-menu" }, + GSI1_SK: "pb-menu#main-menu#/not-found", + SK: "main-menu#/not-found", + PK: "T#root#PS#TAG#pb-menu#main-menu#/not-found", + _et: "PrerenderingServiceTagPathLink", + _ct: "2023-12-27T12:43:23.860Z", + TYPE: "ps.tagPathLink", + GSI1_PK: "T#root#PS#TAG" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg", + "text@aliases": [], + "number@size": 132767, + "text@name": "environments.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.045Z", + TYPE: "cms.entry.l", + entryId: "6022814bef4a940008b3ba28", + tenant: "root", + _md: "2023-12-27T12:42:59.045Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "6022814bef4a940008b3ba28#0001", + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba28" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg", + "text@aliases": [], + "number@size": 132767, + "text@name": "environments.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.045Z", + TYPE: "cms.entry", + entryId: "6022814bef4a940008b3ba28", + tenant: "root", + _md: "2023-12-27T12:42:59.045Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "6022814bef4a940008b3ba28#0001", + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba28" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg", + "text@aliases": [], + "number@size": 73153, + "text@name": "data-icon.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.161Z", + TYPE: "cms.entry.l", + entryId: "602281486ed41f0008bc2dac", + tenant: "root", + _md: "2023-12-27T12:42:59.161Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "L", + webinyVersion: "5.38.2", + id: "602281486ed41f0008bc2dac#0001", + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dac" + }, + { + modelId: "fmFile", + version: 1, + location: { folderId: "root" }, + savedOn: "2023-12-27T12:42:58.754Z", + locale: "en-US", + status: "draft", + values: { + "object@meta": { "boolean@private": true }, + "object@location": { "text@folderId": "root" }, + "text@key": "demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg", + "text@aliases": [], + "number@size": 73153, + "text@name": "data-icon.svg", + "text@type": "image/svg+xml", + "text@tags": [] + }, + _et: "CmsEntries", + createdBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + _ct: "2023-12-27T12:42:59.161Z", + TYPE: "cms.entry", + entryId: "602281486ed41f0008bc2dac", + tenant: "root", + _md: "2023-12-27T12:42:59.161Z", + createdOn: "2023-12-27T12:42:58.754Z", + locked: false, + ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + SK: "REV#0001", + webinyVersion: "5.38.2", + id: "602281486ed41f0008bc2dac#0001", + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dac" + }, + { + _md: "2023-12-27T12:41:24.417Z", + data: { + firstName: "ad", + lastName: "min", + createdBy: null, + webinyVersion: "5.38.2", + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + createdOn: "2023-12-27T12:41:23.982Z", + email: "admin@webiny.com", + tenant: "root", + group: "658c1b60c39bb10008431b42" + }, + GSI1_SK: "admin@webiny.com", + SK: "A", + PK: "T#root#ADMIN_USER#658c1b73c39bb10008431b44", + _et: "AdminUsers.User", + _ct: "2023-12-27T12:41:24.417Z", + TYPE: "adminUsers.user", + GSI1_PK: "T#root#ADMIN_USERS" + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-acosearchrecord-pbpage.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-acosearchrecord-pbpage.ts new file mode 100644 index 00000000000..01ef5abf8d9 --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-acosearchrecord-pbpage.ts @@ -0,0 +1,148 @@ +export const headlessCmsAcoSearchRecordPbPage = [ + { + _index: "root-headless-cms-en-us-acosearchrecord-pbpage", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5b:L", + _score: 1.0, + _source: { + modelId: "acoSearchRecord-pbpage", + version: 1, + location: { + folderId: "root" + }, + savedOn: "2023-12-27T12:43:00.006Z", + locale: "en-US", + status: "draft", + meta: {}, + values: { + "text@type": "PbPage", + "text@title": "Welcome to Webiny", + "text@content": + "Welcome to Webiny Welcome to Webiny Webiny makes it easy to build applications and websites on top of the serverless infrastructure by providing you with a ready-made CMS and a development framework. Scalable Webiny apps can scale to handle the most demanding workloads. No custom tooling required Webiny eliminates the need to build custom tooling to create serverless app Cost effective Webiny apps run on serverless infrastructure which costs 80% less than VMs Resolves serverless challenges Webiny removes all the challenges of building serverless applications Get to know Webiny products Architect. Code. Deploy. Webiny Serverless Application Framework Everything you need to create and deploy applications on top of the serverless infrastructure.  Use it to build: Full-stack applicationsMulti-tenant solutions APIsMicroservice Learn more An easier way to build serverless apps There are many solutions that help you run, deploy and monitor serverless functions, but when it comes to actually coding one, there are none. Webiny is a solution that helps you code your serverless app by providing you with all the components like ACL, routing, file storage and many more. Framework features Users, groups, roles & scopes Security is a crucial layer in any application. Webiny includes a full-featured security module that's connected to the built-in GraphQL API.Users, groups, roles & scopes Scaffolding Quickly generate boilerplate code using CLI plugins. From lambda functions to new GraphQL APIs. Customizable security Use the default AWS Cognito, or replace with 3rd party identity providers like Okta, Auth0, etc. Using plugins you can make Webiny work with any identity provider. Multiple environments No code change goes directly into a production environment. Webiny CLI makes it easy to manage and create multiple environments for your project. One size doesn't fit all It's a very different set of requirements a technical team has to a marketing team to a business development team. Webiny Serverless CMS comes with several different apps you can use independently, or together as part of a cohesive solution. Webiny Serverless CMS A suite of applications to help you manage your content. Use it to build: Marketing sites Multi-website solutions Content hubs Multi-language sites Intranet portals Headless content models Learn more CMS benefits Scalable No matter the demand, Webiny Serverless CMS can easily scale to meet even the most challenging workloads. Adaptable Being an open-source project, it's easy to modify and adapt things to your own needs. Low cost of ownership Self-hosted on top of serverless infrastructure. No infrastructure to mange, less people required to operate and maintain. Secure Secured by AWS Cognito. It's also easy to integrate services like OKTA, Auth0 and similar. Data ownership Webiny is self-hosted, it means your data stays within your data center. Permission control Powerful options to control the permissions your users will have. They perfectly align with your business requirements.  Serverless makes infrastructure easy, Webiny makes serverless easy 1. Developer-friendly Webiny has been made with the developer in mind. It helps them develop serverless applications with ease. 2. Open source Webiny is created and maintained by an amazing group of people. Being open source means Webiny grows and evolves much faster. Contributor are welcome. 3. Community We have an active community on slack. Talk to the core-team, and get help. Webiny team is always there for any questions. View Webiny on GitHub", + "object@location": { + "text@folderId": "root" + }, + "object@data": { + "text@id": "658c1bd3c39bb10008431b5b#0001", + "text@pid": "658c1bd3c39bb10008431b5b", + "text@title": "Welcome to Webiny", + "object@createdBy": { + "text@id": "658c1b73c39bb10008431b44", + "text@displayName": "ad min", + "text@type": "admin" + }, + "datetime@createdOn": "2023-12-27T12:42:59.947Z", + "datetime@savedOn": "2023-12-27T12:43:00.723Z", + "text@status": "published", + "number@version": 1, + "boolean@locked": true, + "text@path": "/welcome-to-webiny" + }, + "text@tags": [] + }, + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + entryId: "wby-aco-658c1bd3c39bb10008431b5b", + tenant: "root", + createdOn: "2023-12-27T12:43:00.006Z", + locked: false, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + webinyVersion: "5.38.2", + id: "wby-aco-658c1bd3c39bb10008431b5b#0001", + modifiedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@data": { + "object@createdBy": {} + } + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-acosearchrecord-pbpage", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5c:L", + _score: 1.0, + _source: { + modelId: "acoSearchRecord-pbpage", + version: 1, + location: { + folderId: "root" + }, + savedOn: "2023-12-27T12:43:00.024Z", + locale: "en-US", + status: "draft", + meta: {}, + values: { + "text@type": "PbPage", + "text@title": "Not Found", + "text@content": + "Not Found Page not found! Sorry, but the page you were looking for could not be found. TAKE ME HOme", + "object@location": { + "text@folderId": "root" + }, + "object@data": { + "text@id": "658c1bd3c39bb10008431b5c#0001", + "text@pid": "658c1bd3c39bb10008431b5c", + "text@title": "Not Found", + "object@createdBy": { + "text@id": "658c1b73c39bb10008431b44", + "text@displayName": "ad min", + "text@type": "admin" + }, + "datetime@createdOn": "2023-12-27T12:42:59.964Z", + "datetime@savedOn": "2023-12-27T12:43:00.663Z", + "text@status": "published", + "number@version": 1, + "boolean@locked": true, + "text@path": "/not-found" + }, + "text@tags": [] + }, + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + entryId: "wby-aco-658c1bd3c39bb10008431b5c", + tenant: "root", + createdOn: "2023-12-27T12:43:00.024Z", + locked: false, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + webinyVersion: "5.38.2", + id: "wby-aco-658c1bd3c39bb10008431b5c#0001", + modifiedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@data": { + "object@createdBy": {} + } + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-fmfile.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-fmfile.ts new file mode 100644 index 00000000000..6da9a8108bb --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-fmfile.ts @@ -0,0 +1,1150 @@ +export const headlessCmsFmFile = [ + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#6022814b0df4b000088735bc:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "6022814b0df4b000088735bc", + id: "6022814b0df4b000088735bc#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "webiny-logo.svg", + "text@key": + "demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg", + "text@type": "image/svg+xml", + "number@size": 5053, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#602281486639200009fd35ec:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "602281486639200009fd35ec", + id: "602281486639200009fd35ec#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "cms-benefits-shape.svg", + "text@key": + "demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg", + "text@type": "image/svg+xml", + "number@size": 392, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#60228148f98841000981c723:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "60228148f98841000981c723", + id: "60228148f98841000981c723#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "pink-shape.svg", + "text@key": "demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg", + "text@type": "image/svg+xml", + "number@size": 390, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#602282e07a77e60008f70d63:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "602282e07a77e60008f70d63", + id: "602282e07a77e60008f70d63#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "feature-card-bg.svg", + "text@key": + "demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg", + "text@type": "image/svg+xml", + "number@size": 888, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#60228145f98841000981c720:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "60228145f98841000981c720", + id: "60228145f98841000981c720#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "adaptable-icon.svg", + "text@key": + "demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg", + "text@type": "image/svg+xml", + "number@size": 28918, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dab:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "602281486ed41f0008bc2dab", + id: "602281486ed41f0008bc2dab#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "permission-icon.svg", + "text@key": + "demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg", + "text@type": "image/svg+xml", + "number@size": 67402, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#602281486639200009fd35eb:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "602281486639200009fd35eb", + id: "602281486639200009fd35eb#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "serverless-cms-logo.svg", + "text@key": + "demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg", + "text@type": "image/svg+xml", + "number@size": 1758, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba28:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "6022814bef4a940008b3ba28", + id: "6022814bef4a940008b3ba28#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "environments.svg", + "text@key": + "demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg", + "text@type": "image/svg+xml", + "number@size": 132767, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dad:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "602281486ed41f0008bc2dad", + id: "602281486ed41f0008bc2dad#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "webiny-serverless-cms.png ", + "text@key": + "demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png", + "text@type": "image/png", + "number@size": 108898, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c7a:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "60228148fa244d0008c47c7a", + id: "60228148fa244d0008c47c7a#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "community-icon.png", + "text@key": + "demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png", + "text@type": "image/png", + "number@size": 17382, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#60228145f98841000981c721:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "60228145f98841000981c721", + id: "60228145f98841000981c721#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "developer.svg", + "text@key": "demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg", + "text@type": "image/svg+xml", + "number@size": 27804, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#60228145f98841000981c71f:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "60228145f98841000981c71f", + id: "60228145f98841000981c71f#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "octo-cat.svg", + "text@key": "demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg", + "text@type": "image/svg+xml", + "number@size": 30007, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dac:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "602281486ed41f0008bc2dac", + id: "602281486ed41f0008bc2dac#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "data-icon.svg", + "text@key": "demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg", + "text@type": "image/svg+xml", + "number@size": 73153, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#6022814891bd1300087bd24c:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "6022814891bd1300087bd24c", + id: "6022814891bd1300087bd24c#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "webiny-infrastructure-overview.svg", + "text@key": + "demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg", + "text@type": "image/svg+xml", + "number@size": 90163, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#6022814b7a77e60008f70d62:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "6022814b7a77e60008f70d62", + id: "6022814b7a77e60008f70d62#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "hero-block-bg.svg", + "text@key": + "demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg", + "text@type": "image/svg+xml", + "number@size": 1864, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba26:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "6022814bef4a940008b3ba26", + id: "6022814bef4a940008b3ba26#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "scaffolding.svg", + "text@key": + "demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg", + "text@type": "image/svg+xml", + "number@size": 33888, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#6022814851197600081724ae:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "6022814851197600081724ae", + id: "6022814851197600081724ae#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "cost-icon.svg", + "text@key": "demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg", + "text@type": "image/svg+xml", + "number@size": 60602, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c79:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "60228148fa244d0008c47c79", + id: "60228148fa244d0008c47c79#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "scalable-icon.svg", + "text@key": + "demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg", + "text@type": "image/svg+xml", + "number@size": 7806, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba27:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "6022814bef4a940008b3ba27", + id: "6022814bef4a940008b3ba27#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "security.svg", + "text@key": "demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg", + "text@type": "image/svg+xml", + "number@size": 17711, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#60228148f98841000981c724:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "60228148f98841000981c724", + id: "60228148f98841000981c724#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "idp.svg", + "text@key": "demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg", + "text@type": "image/svg+xml", + "number@size": 27878, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-fmfile", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#6022814a0df4b000088735bb:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "6022814a0df4b000088735bb", + id: "6022814a0df4b000088735bb#0001", + modelId: "fmFile", + locale: "en-US", + createdOn: "2023-12-27T12:42:58.754Z", + savedOn: "2023-12-27T12:42:58.754Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "object@location": { + "text@folderId": "root" + }, + "text@name": "webiny-serverless-application-framework.svg", + "text@key": + "demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg", + "text@type": "image/svg+xml", + "number@size": 3661, + "object@meta": { + "boolean@private": true + }, + "text@tags": [], + "text@aliases": [] + }, + location: { + folderId: "root" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-modela.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-modela.ts new file mode 100644 index 00000000000..01c1fe4eab5 --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-modela.ts @@ -0,0 +1,292 @@ +export const headlessCmsModelA = [ + { + _index: "root-headless-cms-en-us-modela", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167:P", + _score: 1.0, + _source: { + modelId: "modelA", + version: 1, + location: { + folderId: "root" + }, + savedOn: "2023-12-27T13:20:25.701Z", + locale: "en-US", + status: "published", + values: { + "text@f2qcuuzs": "DDB+ES - Model A Entry 2", + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2" + }, + createdBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + entryId: "658c24996607be00087f1167", + tenant: "root", + createdOn: "2023-12-27T13:20:25.235Z", + locked: true, + ownedBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + webinyVersion: "5.38.2", + id: "658c24996607be00087f1167#0001", + publishedOn: "2023-12-27T13:20:25.701Z", + rawValues: {}, + published: true, + TYPE: "cms.entry.p", + __type: "cms.entry.p" + } + }, + { + _index: "root-headless-cms-en-us-modela", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166:P", + _score: 1.0, + _source: { + modelId: "modelA", + version: 1, + location: { + folderId: "root" + }, + savedOn: "2023-12-27T13:20:12.775Z", + locale: "en-US", + status: "published", + values: { + "text@f2qcuuzs": "DDB+ES - Model A Entry 1", + "long-text@z2tdm05d": "DDB+ES - Model A Entry 1" + }, + createdBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + entryId: "658c248b6607be00087f1166", + tenant: "root", + createdOn: "2023-12-27T13:20:11.821Z", + locked: true, + ownedBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + webinyVersion: "5.38.2", + id: "658c248b6607be00087f1166#0001", + publishedOn: "2023-12-27T13:20:12.775Z", + rawValues: {}, + published: true, + TYPE: "cms.entry.p", + __type: "cms.entry.p" + } + }, + { + _index: "root-headless-cms-en-us-modela", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "658c248b6607be00087f1166", + id: "658c248b6607be00087f1166#0001", + modelId: "modelA", + locale: "en-US", + createdOn: "2023-12-27T13:20:11.821Z", + savedOn: "2023-12-27T13:20:12.775Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: true, + status: "published", + values: { + "text@f2qcuuzs": "DDB+ES - Model A Entry 1", + "long-text@z2tdm05d": "DDB+ES - Model A Entry 1" + }, + location: { + folderId: "root" + }, + rawValues: {}, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l", + publishedOn: "2023-12-27T13:20:12.775Z" + } + }, + { + _index: "root-headless-cms-en-us-modela", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "658c24a16607be00087f1168", + id: "658c24a16607be00087f1168#0001", + modelId: "modelA", + locale: "en-US", + createdOn: "2023-12-27T13:20:33.775Z", + savedOn: "2023-12-27T13:20:34.175Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: true, + status: "published", + values: { + "text@f2qcuuzs": "DDB+ES - Model A Entry 3", + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2" + }, + location: { + folderId: "root" + }, + rawValues: {}, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l", + publishedOn: "2023-12-27T13:20:34.175Z" + } + }, + { + _index: "root-headless-cms-en-us-modela", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#658c24aa6607be00087f1169:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "658c24aa6607be00087f1169", + id: "658c24aa6607be00087f1169#0001", + modelId: "modelA", + locale: "en-US", + createdOn: "2023-12-27T13:20:42.180Z", + savedOn: "2023-12-27T13:20:42.180Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: false, + status: "draft", + values: { + "text@f2qcuuzs": "DDB+ES - Model A Entry 4", + "long-text@z2tdm05d": "" + }, + location: { + folderId: "root" + }, + rawValues: {}, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + }, + { + _index: "root-headless-cms-en-us-modela", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168:P", + _score: 1.0, + _source: { + modelId: "modelA", + version: 1, + location: { + folderId: "root" + }, + savedOn: "2023-12-27T13:20:34.175Z", + locale: "en-US", + status: "published", + values: { + "text@f2qcuuzs": "DDB+ES - Model A Entry 3", + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2" + }, + createdBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + entryId: "658c24a16607be00087f1168", + tenant: "root", + createdOn: "2023-12-27T13:20:33.775Z", + locked: true, + ownedBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + webinyVersion: "5.38.2", + id: "658c24a16607be00087f1168#0001", + publishedOn: "2023-12-27T13:20:34.175Z", + rawValues: {}, + published: true, + TYPE: "cms.entry.p", + __type: "cms.entry.p" + } + }, + { + _index: "root-headless-cms-en-us-modela", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "658c24996607be00087f1167", + id: "658c24996607be00087f1167#0001", + modelId: "modelA", + locale: "en-US", + createdOn: "2023-12-27T13:20:25.235Z", + savedOn: "2023-12-27T13:20:25.701Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: true, + status: "published", + values: { + "text@f2qcuuzs": "DDB+ES - Model A Entry 2", + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2" + }, + location: { + folderId: "root" + }, + rawValues: {}, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l", + publishedOn: "2023-12-27T13:20:25.701Z" + } + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-modelb.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-modelb.ts new file mode 100644 index 00000000000..2242004e3dc --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.es-index-root-headless-cms-en-us-modelb.ts @@ -0,0 +1,133 @@ +export const headlessCmsModelB = [ + { + _index: "root-headless-cms-en-us-modelb", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1:L", + _score: 1.0, + _source: { + webinyVersion: "5.38.2", + tenant: "root", + entryId: "658c2524adbc1700090e1ad1", + id: "658c2524adbc1700090e1ad1#0001", + modelId: "modelB", + locale: "en-US", + createdOn: "2023-12-27T13:22:44.672Z", + savedOn: "2023-12-27T13:22:46.091Z", + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + modifiedBy: null, + version: 1, + locked: true, + status: "published", + values: { + "text@4dep2w2h": "DDB+ES - Model B Entry 1", + "long-text@7c5t8wwa": "DDB+ES - Model B Entry 1" + }, + location: { + folderId: "root" + }, + rawValues: {}, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l", + publishedOn: "2023-12-27T13:22:46.091Z" + } + }, + { + _index: "root-headless-cms-en-us-modelb", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1:P", + _score: 1.0, + _source: { + modelId: "modelB", + version: 1, + location: { + folderId: "root" + }, + savedOn: "2023-12-27T13:22:46.091Z", + locale: "en-US", + status: "published", + values: { + "text@4dep2w2h": "DDB+ES - Model B Entry 1", + "long-text@7c5t8wwa": "DDB+ES - Model B Entry 1" + }, + createdBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + entryId: "658c2524adbc1700090e1ad1", + tenant: "root", + createdOn: "2023-12-27T13:22:44.672Z", + locked: true, + ownedBy: { + type: "admin", + displayName: "ad min", + id: "658c1b73c39bb10008431b44" + }, + webinyVersion: "5.38.2", + id: "658c2524adbc1700090e1ad1#0001", + publishedOn: "2023-12-27T13:22:46.091Z", + rawValues: {}, + published: true, + TYPE: "cms.entry.p", + __type: "cms.entry.p" + } + }, + { + _index: "root-headless-cms-en-us-modelb", + _type: "_doc", + _id: "T#root#L#en-US#CMS#CME#658c2531adbc1700090e1ad2:L", + _score: 1.0, + _source: { + modelId: "modelB", + version: 1, + location: { + folderId: "root" + }, + savedOn: "2023-12-27T13:23:15.536Z", + locale: "en-US", + status: "draft", + values: { + "text@4dep2w2h": "DDB+ES - Model B Entry 2 UPDATED", + "long-text@7c5t8wwa": "DDB+ES - Model B Entry 2 UPDATED" + }, + createdBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + entryId: "658c2531adbc1700090e1ad2", + tenant: "root", + createdOn: "2023-12-27T13:22:57.094Z", + locked: false, + ownedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + webinyVersion: "5.38.2", + id: "658c2531adbc1700090e1ad2#0001", + modifiedBy: { + id: "658c1b73c39bb10008431b44", + displayName: "ad min", + type: "admin" + }, + meta: {}, + rawValues: { + "file@5atpz8nu": null + }, + latest: true, + TYPE: "cms.entry.l", + __type: "cms.entry.l" + } + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.test.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.test.ts new file mode 100644 index 00000000000..d23626a1fd2 --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.test.ts @@ -0,0 +1,285 @@ +import { Sort as ElasticsearchSort } from "elastic-ts"; +import { + assertNotError, + createDdbEsMigrationHandler, + getDynamoToEsTable, + importElasticsearchTestData, + getPrimaryDynamoDbTable, + groupMigrations, + insertDynamoDbTestData as insertTestData, + logTestNameBeforeEachTest, + scanTable +} from "~tests/utils"; +import { CmsEntriesInitNewMetaFields_5_39_6_001 } from "~/migrations/5.39.6/001/ddb-es"; + +import { transferDynamoDbToElasticsearch } from "~tests/utils/insertElasticsearchTestData"; +import { esGetIndexSettings } from "~/utils"; +import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; +import { getRecordIndexName } from "~tests/migrations/5.37.0/002/ddb-es/helpers"; +import { listElasticsearchItems } from "~tests/utils/listElasticsearchItems"; +import { getDecompressedData } from "~tests/migrations/5.37.0/003/ddb-es/getDecompressedData"; + +// Test data. +import { ddbPrimaryTableData } from "./001.ddbPrimaryTableData"; +import { ddbEsTableData } from "./001.ddbEsTableData"; +import { headlessCmsAcoSearchRecordPbPage } from "./001.es-index-root-headless-cms-en-us-acosearchrecord-pbpage"; +import { headlessCmsFmFile } from "./001.es-index-root-headless-cms-en-us-fmfile"; +import { headlessCmsModelA } from "./001.es-index-root-headless-cms-en-us-modela"; +import { headlessCmsModelB } from "./001.es-index-root-headless-cms-en-us-modelb"; + +// Migrated test data. +import { ddbPrimaryTableDataMigrated } from "./migrated/001.ddbPrimaryTableData"; +import { ddbEsTableDataMigrated } from "./migrated/001.ddbEsTableData"; +import { headlessCmsAcoSearchRecordPbPageMigrated } from "./migrated/001.es-index-root-headless-cms-en-us-acosearchrecord-pbpage"; +import { headlessCmsFmFileMigrated } from "./migrated/001.es-index-root-headless-cms-en-us-fmfile"; +import { headlessCmsModelAMigrated } from "./migrated/001.es-index-root-headless-cms-en-us-modela"; +import { headlessCmsModelBMigrated } from "./migrated/001.es-index-root-headless-cms-en-us-modelb"; + +jest.retryTimes(0); +jest.setTimeout(900000); + +// Ensures that either both modifiedOn and modifiedBy fields are set or none is set. +const expectModifiedFieldsAreSynced = (entry: Record) => { + const hasRevisionModifiedOn = !!entry.revisionModifiedOn; + const hasRevisionModifiedBy = !!entry.revisionModifiedBy; + expect(hasRevisionModifiedBy).toBe(hasRevisionModifiedOn); + + const hasEntryModifiedOn = !!entry.entryModifiedOn; + const hasEntryModifiedBy = !!entry.entryModifiedBy; + expect(hasEntryModifiedOn).toBe(hasEntryModifiedBy); +}; + +describe("5.39.2-001", () => { + const primaryTable = getPrimaryDynamoDbTable(); + const dynamoToEsTable = getDynamoToEsTable(); + const elasticsearchClient = createElasticsearchClient(); + + const insertAllTestData = async () => { + await insertTestData(primaryTable, ddbPrimaryTableData); + await insertTestData(dynamoToEsTable, ddbEsTableData); + + const esIndexData = { + "acosearchrecord-pbpage": headlessCmsAcoSearchRecordPbPage, + fmfile: headlessCmsFmFile, + modela: headlessCmsModelA, + modelb: headlessCmsModelB + }; + + for (const indexName in esIndexData) { + await importElasticsearchTestData( + elasticsearchClient, + esIndexData[indexName as keyof typeof esIndexData] + ); + } + + await elasticsearchClient.indices.refreshAll(); + }; + + beforeAll(async () => { + process.env.ELASTIC_SEARCH_INDEX_PREFIX = + new Date().toISOString().replace(/\.|\:/g, "-").toLowerCase() + "-"; + + await elasticsearchClient.indices.deleteAll(); + }); + afterEach(async () => { + await elasticsearchClient.indices.deleteAll(); + }); + + logTestNameBeforeEachTest(); + + it("should not run if no entries without new meta fields were found", async () => { + const handler = createDdbEsMigrationHandler({ + primaryTable, + dynamoToEsTable, + elasticsearchClient, + migrations: [CmsEntriesInitNewMetaFields_5_39_6_001] + }); + + const { data, error } = await handler(); + + assertNotError(error); + const grouped = groupMigrations(data.migrations); + + expect(grouped.executed.length).toBe(0); + expect(grouped.skipped.length).toBe(1); + expect(grouped.notApplicable.length).toBe(0); + }); + + it("should execute migration", async () => { + await insertAllTestData(); + + const handler = createDdbEsMigrationHandler({ + primaryTable, + dynamoToEsTable, + elasticsearchClient, + migrations: [CmsEntriesInitNewMetaFields_5_39_6_001] + }); + + const { data, error } = await handler(); + + assertNotError(error); + const grouped = groupMigrations(data.migrations); + + expect(grouped.executed.length).toBe(1); + expect(grouped.skipped.length).toBe(0); + expect(grouped.notApplicable.length).toBe(0); + + const primaryTableData = await scanTable(primaryTable, { + limit: 1_000_000 + }); + + // Primary DynamoDB table test data has migration-related items + // filtered out. We need to do the same here. + expect(primaryTableData.filter(item => !item.TYPE?.startsWith("migration"))).toEqual( + ddbPrimaryTableDataMigrated + ); + + const ddbEsTableRecordsCompressed = await scanTable(dynamoToEsTable, { + limit: 1_000_000 + }); + + const ddbEsTableRecordsDecompressed = await Promise.all( + ddbEsTableRecordsCompressed.map(async item => { + if (!item.PK.includes("#CMS#CME#")) { + return item; + } + + const decompressed = await getDecompressedData(item.data); + return { + ...item, + data: decompressed + }; + }) + ); + + expect(ddbEsTableRecordsDecompressed).toEqual(ddbEsTableDataMigrated); + + // In the following lines, we're going to check if the data in Elasticsearch is correct. + await transferDynamoDbToElasticsearch( + elasticsearchClient, + dynamoToEsTable, + getRecordIndexName + ); + + const indexes = new Set(); + for (const record of ddbEsTableData) { + const entry = await getDecompressedData(record.data); + if (entry && entry.modelId) { + indexes.add(getRecordIndexName(entry)); + } + } + + expect(indexes.size).toBe(4); + + const [ + headlessCmsAcoSearchRecordPbPageIndexName, + headlessCmsFmFileIndexName, + headlessCmsModelAIndexName, + headlessCmsModelBIndexName + ] = indexes; + + // Ensure correct data ended up in Elasticsearch. + const sort = [ + { + "id.keyword": { order: "desc", unmapped_type: "keyword" }, + "TYPE.keyword": { order: "asc", unmapped_type: "keyword" } + } + ] as ElasticsearchSort; + + // 1. Check ACO Search Record PB Page index. + const migratedHeadlessCmsAcoSearchRecordPbPageRecords = await listElasticsearchItems({ + client: elasticsearchClient, + index: headlessCmsAcoSearchRecordPbPageIndexName, + body: { sort } + }); + + expect(migratedHeadlessCmsAcoSearchRecordPbPageRecords).toBeArrayOfSize(2); + expect(migratedHeadlessCmsAcoSearchRecordPbPageRecords).toEqual( + headlessCmsAcoSearchRecordPbPageMigrated + ); + + headlessCmsAcoSearchRecordPbPageMigrated.forEach(expectModifiedFieldsAreSynced); + + // 2. Check FM File index. + const migratedHeadlessCmsFmFileRecords = await listElasticsearchItems({ + client: elasticsearchClient, + index: headlessCmsFmFileIndexName, + body: { sort } + }); + + expect(migratedHeadlessCmsFmFileRecords).toBeArrayOfSize(21); + expect(migratedHeadlessCmsFmFileRecords).toEqual(headlessCmsFmFileMigrated); + + headlessCmsFmFileMigrated.forEach(expectModifiedFieldsAreSynced); + + // 3. Check Model A index. + const migratedHeadlessCmsModelARecords = await listElasticsearchItems({ + client: elasticsearchClient, + index: headlessCmsModelAIndexName, + body: { sort } + }); + + expect(migratedHeadlessCmsModelARecords).toBeArrayOfSize(7); + expect(migratedHeadlessCmsModelARecords).toEqual(headlessCmsModelAMigrated); + + headlessCmsModelAMigrated.forEach(expectModifiedFieldsAreSynced); + + // 4. Check Model B index. + const migratedHeadlessCmsModelBRecords = await listElasticsearchItems({ + client: elasticsearchClient, + index: headlessCmsModelBIndexName, + body: { sort } + }); + + expect(migratedHeadlessCmsModelBRecords).toBeArrayOfSize(3); + expect(migratedHeadlessCmsModelBRecords).toEqual(headlessCmsModelBMigrated); + + headlessCmsModelBMigrated.forEach(expectModifiedFieldsAreSynced); + + /** + * Test that all indexes have the expected settings after the migration. + */ + for (const index of indexes) { + const settings = await esGetIndexSettings({ + elasticsearchClient, + index, + fields: ["number_of_replicas", "refresh_interval"] + }); + expect(Number(settings?.number_of_replicas)).toBeGreaterThanOrEqual(1); + expect(settings?.refresh_interval).not.toBe(-1); + const interval = parseInt((settings?.refresh_interval as string).replace("s", "")); + expect(interval).toBeGreaterThanOrEqual(1); + } + }); + + it("should not run migration if data is already in the expected shape", async () => { + await insertAllTestData(); + + const handler = createDdbEsMigrationHandler({ + primaryTable, + dynamoToEsTable, + elasticsearchClient, + migrations: [CmsEntriesInitNewMetaFields_5_39_6_001] + }); + + // Should run the migration + { + process.stdout.write("[First run]\n"); + const { data, error } = await handler(); + assertNotError(error); + const grouped = groupMigrations(data.migrations); + expect(grouped.executed.length).toBe(1); + } + + // Should skip the migration + { + process.stdout.write("[Second run]\n"); + const { data, error } = await handler(); + assertNotError(error); + const grouped = groupMigrations(data.migrations); + expect(grouped.executed.length).toBe(0); + expect(grouped.skipped.length).toBe(1); + expect(grouped.notApplicable.length).toBe(0); + } + }); +}); diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.ddbEsTableData.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.ddbEsTableData.ts new file mode 100644 index 00000000000..ef3ea1c02ff --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.ddbEsTableData.ts @@ -0,0 +1,3016 @@ +// Note that the data is decompressed. +export const ddbEsTableDataMigrated = [ + { + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5c", + SK: "L", + created: "2023-12-27T12:43:01.141Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:43:00.024Z", + entryId: "wby-aco-658c1bd3c39bb10008431b5c", + firstPublishedBy: null, + firstPublishedOn: null, + id: "wby-aco-658c1bd3c39bb10008431b5c#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "acoSearchRecord-pbpage", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T12:43:00.024Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@data": { + "object@createdBy": {} + }, + "object@location": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:43:00.024Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T12:43:00.024Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:43:00.024Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:43:00.024Z", + status: "draft", + tenant: "root", + values: { + "object@data": { + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.964Z", + "datetime@savedOn": "2023-12-27T12:43:00.663Z", + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@id": "658c1b73c39bb10008431b44", + "text@type": "admin" + }, + "text@id": "658c1bd3c39bb10008431b5c#0001", + "text@path": "/not-found", + "text@pid": "658c1bd3c39bb10008431b5c", + "text@status": "published", + "text@title": "Not Found" + }, + "object@location": { + "text@folderId": "root" + }, + "text@content": + "Not Found Page not found! Sorry, but the page you were looking for could not be found. TAKE ME HOme", + "text@tags": [], + "text@title": "Not Found", + "text@type": "PbPage" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-acosearchrecord-pbpage", + modified: "2023-12-27T12:43:01.141Z" + }, + { + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5c", + SK: "L", + _ct: "2023-12-27T12:43:00.682Z", + _et: "PbPagesEs", + _md: "2023-12-27T12:43:00.682Z", + data: { + __type: "page", + category: "static", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.964Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5c#0001", + images: {}, + latest: true, + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/not-found", + pid: "658c1bd3c39bb10008431b5c", + publishedOn: "2023-12-27T12:43:00.663Z", + savedOn: "2023-12-27T12:43:00.663Z", + snippet: null, + status: "published", + tags: [], + tenant: "root", + title: "Not Found", + titleLC: "not found", + version: 1, + webinyVersion: "5.38.2" + }, + index: "root-en-us-page-builder" + }, + { + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5c", + SK: "P", + _ct: "2023-12-27T12:43:00.682Z", + _et: "PbPagesEs", + _md: "2023-12-27T12:43:00.682Z", + data: { + __type: "page", + category: "static", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.964Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5c#0001", + images: {}, + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/not-found", + pid: "658c1bd3c39bb10008431b5c", + published: true, + publishedOn: "2023-12-27T12:43:00.663Z", + savedOn: "2023-12-27T12:43:00.663Z", + snippet: null, + status: "published", + tags: [], + tenant: "root", + title: "Not Found", + titleLC: "not found", + version: 1, + webinyVersion: "5.38.2" + }, + index: "root-en-us-page-builder" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba27", + SK: "L", + created: "2023-12-27T12:42:59.522Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814bef4a940008b3ba27", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814bef4a940008b3ba27#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 17711, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg", + "text@name": "security.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.522Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c721", + SK: "L", + created: "2023-12-27T12:42:59.706Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228145f98841000981c721", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228145f98841000981c721#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 27804, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg", + "text@name": "developer.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.706Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814b7a77e60008f70d62", + SK: "L", + created: "2023-12-27T12:42:59.361Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814b7a77e60008f70d62", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814b7a77e60008f70d62#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 1864, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg", + "text@name": "hero-block-bg.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.361Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#602282e07a77e60008f70d63", + SK: "L", + created: "2023-12-27T12:42:59.486Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602282e07a77e60008f70d63", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602282e07a77e60008f70d63#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 888, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg", + "text@name": "feature-card-bg.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.486Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167", + SK: "L", + created: "2023-12-27T13:20:25.736Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:25.235Z", + entryId: "658c24996607be00087f1167", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:25.701Z", + id: "658c24996607be00087f1167#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:25.701Z", + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:25.701Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:25.235Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:25.701Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:25.701Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:25.701Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:25.701Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2", + "text@f2qcuuzs": "DDB+ES - Model A Entry 2" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-modela", + modified: "2023-12-27T13:20:25.736Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167", + SK: "P", + created: "2023-12-27T13:20:25.737Z", + data: { + TYPE: "cms.entry.p", + __type: "cms.entry.p", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:25.235Z", + entryId: "658c24996607be00087f1167", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:25.701Z", + id: "658c24996607be00087f1167#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:25.701Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + published: true, + publishedOn: "2023-12-27T13:20:25.701Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:25.235Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:25.701Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:25.701Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:25.701Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:25.701Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2", + "text@f2qcuuzs": "DDB+ES - Model A Entry 2" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-modela", + modified: "2023-12-27T13:20:25.737Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c720", + SK: "L", + created: "2023-12-27T12:42:59.543Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228145f98841000981c720", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228145f98841000981c720#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 28918, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg", + "text@name": "adaptable-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.543Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dab", + SK: "L", + created: "2023-12-27T12:42:59.702Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602281486ed41f0008bc2dab", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602281486ed41f0008bc2dab#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 67402, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg", + "text@name": "permission-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.702Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5b", + SK: "L", + created: "2023-12-27T12:43:01.123Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:43:00.006Z", + entryId: "wby-aco-658c1bd3c39bb10008431b5b", + firstPublishedBy: null, + firstPublishedOn: null, + id: "wby-aco-658c1bd3c39bb10008431b5b#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "acoSearchRecord-pbpage", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T12:43:00.006Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@data": { + "object@createdBy": {} + }, + "object@location": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:43:00.006Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T12:43:00.006Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:43:00.006Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:43:00.006Z", + status: "draft", + tenant: "root", + values: { + "object@data": { + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.947Z", + "datetime@savedOn": "2023-12-27T12:43:00.723Z", + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@id": "658c1b73c39bb10008431b44", + "text@type": "admin" + }, + "text@id": "658c1bd3c39bb10008431b5b#0001", + "text@path": "/welcome-to-webiny", + "text@pid": "658c1bd3c39bb10008431b5b", + "text@status": "published", + "text@title": "Welcome to Webiny" + }, + "object@location": { + "text@folderId": "root" + }, + "text@content": + "Welcome to Webiny Welcome to Webiny Webiny makes it easy to build applications and websites on top of the serverless infrastructure by providing you with a ready-made CMS and a development framework. Scalable Webiny apps can scale to handle the most demanding workloads. No custom tooling required Webiny eliminates the need to build custom tooling to create serverless app Cost effective Webiny apps run on serverless infrastructure which costs 80% less than VMs Resolves serverless challenges Webiny removes all the challenges of building serverless applications Get to know Webiny products Architect. Code. Deploy. Webiny Serverless Application Framework Everything you need to create and deploy applications on top of the serverless infrastructure.  Use it to build: Full-stack applicationsMulti-tenant solutions APIsMicroservice Learn more An easier way to build serverless apps There are many solutions that help you run, deploy and monitor serverless functions, but when it comes to actually coding one, there are none. Webiny is a solution that helps you code your serverless app by providing you with all the components like ACL, routing, file storage and many more. Framework features Users, groups, roles & scopes Security is a crucial layer in any application. Webiny includes a full-featured security module that's connected to the built-in GraphQL API.Users, groups, roles & scopes Scaffolding Quickly generate boilerplate code using CLI plugins. From lambda functions to new GraphQL APIs. Customizable security Use the default AWS Cognito, or replace with 3rd party identity providers like Okta, Auth0, etc. Using plugins you can make Webiny work with any identity provider. Multiple environments No code change goes directly into a production environment. Webiny CLI makes it easy to manage and create multiple environments for your project. One size doesn't fit all It's a very different set of requirements a technical team has to a marketing team to a business development team. Webiny Serverless CMS comes with several different apps you can use independently, or together as part of a cohesive solution. Webiny Serverless CMS A suite of applications to help you manage your content. Use it to build: Marketing sites Multi-website solutions Content hubs Multi-language sites Intranet portals Headless content models Learn more CMS benefits Scalable No matter the demand, Webiny Serverless CMS can easily scale to meet even the most challenging workloads. Adaptable Being an open-source project, it's easy to modify and adapt things to your own needs. Low cost of ownership Self-hosted on top of serverless infrastructure. No infrastructure to mange, less people required to operate and maintain. Secure Secured by AWS Cognito. It's also easy to integrate services like OKTA, Auth0 and similar. Data ownership Webiny is self-hosted, it means your data stays within your data center. Permission control Powerful options to control the permissions your users will have. They perfectly align with your business requirements.  Serverless makes infrastructure easy, Webiny makes serverless easy 1. Developer-friendly Webiny has been made with the developer in mind. It helps them develop serverless applications with ease. 2. Open source Webiny is created and maintained by an amazing group of people. Being open source means Webiny grows and evolves much faster. Contributor are welcome. 3. Community We have an active community on slack. Talk to the core-team, and get help. Webiny team is always there for any questions. View Webiny on GitHub", + "text@tags": [], + "text@title": "Welcome to Webiny", + "text@type": "PbPage" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-acosearchrecord-pbpage", + modified: "2023-12-27T12:43:01.123Z" + }, + { + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5b", + SK: "L", + _ct: "2023-12-27T12:43:00.864Z", + _et: "PbPagesEs", + _md: "2023-12-27T12:43:00.864Z", + data: { + __type: "page", + category: "static", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.947Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5b#0001", + images: {}, + latest: true, + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/welcome-to-webiny", + pid: "658c1bd3c39bb10008431b5b", + publishedOn: "2023-12-27T12:43:00.723Z", + savedOn: "2023-12-27T12:43:00.723Z", + snippet: null, + status: "published", + tags: [], + tenant: "root", + title: "Welcome to Webiny", + titleLC: "welcome to webiny", + version: 1, + webinyVersion: "5.38.2" + }, + index: "root-en-us-page-builder" + }, + { + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5b", + SK: "P", + _ct: "2023-12-27T12:43:00.864Z", + _et: "PbPagesEs", + _md: "2023-12-27T12:43:00.864Z", + data: { + __type: "page", + category: "static", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.947Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5b#0001", + images: {}, + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/welcome-to-webiny", + pid: "658c1bd3c39bb10008431b5b", + published: true, + publishedOn: "2023-12-27T12:43:00.723Z", + savedOn: "2023-12-27T12:43:00.723Z", + snippet: null, + status: "published", + tags: [], + tenant: "root", + title: "Welcome to Webiny", + titleLC: "welcome to webiny", + version: 1, + webinyVersion: "5.38.2" + }, + index: "root-en-us-page-builder" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba26", + SK: "L", + created: "2023-12-27T12:42:59.525Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814bef4a940008b3ba26", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814bef4a940008b3ba26#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 33888, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg", + "text@name": "scaffolding.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.525Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814851197600081724ae", + SK: "L", + created: "2023-12-27T12:42:59.561Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814851197600081724ae", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814851197600081724ae#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 60602, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg", + "text@name": "cost-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.561Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814a0df4b000088735bb", + SK: "L", + created: "2023-12-27T12:42:59.487Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814a0df4b000088735bb", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814a0df4b000088735bb#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 3661, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg", + "text@name": "webiny-serverless-application-framework.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.487Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166", + SK: "L", + created: "2023-12-27T13:20:12.855Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:11.821Z", + entryId: "658c248b6607be00087f1166", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:12.775Z", + id: "658c248b6607be00087f1166#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:12.775Z", + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:12.775Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:11.821Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:12.775Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:12.775Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:12.775Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:12.775Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 1", + "text@f2qcuuzs": "DDB+ES - Model A Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-modela", + modified: "2023-12-27T13:20:12.855Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166", + SK: "P", + created: "2023-12-27T13:20:12.874Z", + data: { + TYPE: "cms.entry.p", + __type: "cms.entry.p", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:11.821Z", + entryId: "658c248b6607be00087f1166", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:12.775Z", + id: "658c248b6607be00087f1166#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:12.775Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + published: true, + publishedOn: "2023-12-27T13:20:12.775Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:11.821Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:12.775Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:12.775Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:12.775Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:12.775Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 1", + "text@f2qcuuzs": "DDB+ES - Model A Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-modela", + modified: "2023-12-27T13:20:12.874Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c723", + SK: "L", + created: "2023-12-27T12:42:59.488Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228148f98841000981c723", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228148f98841000981c723#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 390, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg", + "text@name": "pink-shape.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.488Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35eb", + SK: "L", + created: "2023-12-27T12:42:59.527Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602281486639200009fd35eb", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602281486639200009fd35eb#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 1758, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg", + "text@name": "serverless-cms-logo.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.527Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814891bd1300087bd24c", + SK: "L", + created: "2023-12-27T12:42:59.523Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814891bd1300087bd24c", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814891bd1300087bd24c#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 90163, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg", + "text@name": "webiny-infrastructure-overview.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.523Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c71f", + SK: "L", + created: "2023-12-27T12:42:59.563Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228145f98841000981c71f", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228145f98841000981c71f#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 30007, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg", + "text@name": "octo-cat.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.563Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35ec", + SK: "L", + created: "2023-12-27T12:42:59.541Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602281486639200009fd35ec", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602281486639200009fd35ec#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 392, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg", + "text@name": "cms-benefits-shape.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.541Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1", + SK: "L", + created: "2023-12-27T13:22:46.132Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:44.672Z", + entryId: "658c2524adbc1700090e1ad1", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:22:46.091Z", + id: "658c2524adbc1700090e1ad1#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:22:46.091Z", + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelB", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:22:46.091Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:44.672Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:22:46.091Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:22:46.091Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:22:46.091Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:22:46.091Z", + status: "published", + tenant: "root", + values: { + "long-text@7c5t8wwa": "DDB+ES - Model B Entry 1", + "text@4dep2w2h": "DDB+ES - Model B Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-modelb", + modified: "2023-12-27T13:22:46.132Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1", + SK: "P", + created: "2023-12-27T13:22:46.134Z", + data: { + TYPE: "cms.entry.p", + __type: "cms.entry.p", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:44.672Z", + entryId: "658c2524adbc1700090e1ad1", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:22:46.091Z", + id: "658c2524adbc1700090e1ad1#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:22:46.091Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelB", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + published: true, + publishedOn: "2023-12-27T13:22:46.091Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:44.672Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:22:46.091Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:22:46.091Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:22:46.091Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:22:46.091Z", + status: "published", + tenant: "root", + values: { + "long-text@7c5t8wwa": "DDB+ES - Model B Entry 1", + "text@4dep2w2h": "DDB+ES - Model B Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-modelb", + modified: "2023-12-27T13:22:46.134Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c79", + SK: "L", + created: "2023-12-27T12:42:59.528Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228148fa244d0008c47c79", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228148fa244d0008c47c79#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 7806, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg", + "text@name": "scalable-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.528Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c724", + SK: "L", + created: "2023-12-27T12:42:59.684Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228148f98841000981c724", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228148f98841000981c724#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 27878, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg", + "text@name": "idp.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.684Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168", + SK: "L", + created: "2023-12-27T13:20:34.215Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:33.775Z", + entryId: "658c24a16607be00087f1168", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:34.175Z", + id: "658c24a16607be00087f1168#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:34.175Z", + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:34.175Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:33.775Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:34.175Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:34.175Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:34.175Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:34.175Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2", + "text@f2qcuuzs": "DDB+ES - Model A Entry 3" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-modela", + modified: "2023-12-27T13:20:34.215Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168", + SK: "P", + created: "2023-12-27T13:20:34.216Z", + data: { + TYPE: "cms.entry.p", + __type: "cms.entry.p", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:33.775Z", + entryId: "658c24a16607be00087f1168", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:34.175Z", + id: "658c24a16607be00087f1168#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:34.175Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + published: true, + publishedOn: "2023-12-27T13:20:34.175Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:33.775Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:34.175Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:34.175Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:34.175Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:34.175Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2", + "text@f2qcuuzs": "DDB+ES - Model A Entry 3" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-modela", + modified: "2023-12-27T13:20:34.216Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c7a", + SK: "L", + created: "2023-12-27T12:42:59.705Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228148fa244d0008c47c7a", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228148fa244d0008c47c7a#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 17382, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png", + "text@name": "community-icon.png", + "text@tags": [], + "text@type": "image/png" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.705Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814b0df4b000088735bc", + SK: "L", + created: "2023-12-27T12:42:59.482Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814b0df4b000088735bc", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814b0df4b000088735bc#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 5053, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg", + "text@name": "webiny-logo.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.482Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24aa6607be00087f1169", + SK: "L", + created: "2023-12-27T13:20:42.214Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:42.180Z", + entryId: "658c24aa6607be00087f1169", + firstPublishedBy: null, + firstPublishedOn: null, + id: "658c24aa6607be00087f1169#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:42.180Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:42.180Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:42.180Z", + status: "draft", + tenant: "root", + values: { + "long-text@z2tdm05d": "", + "text@f2qcuuzs": "DDB+ES - Model A Entry 4" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-modela", + modified: "2023-12-27T13:20:42.214Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c2531adbc1700090e1ad2", + SK: "L", + created: "2023-12-27T13:23:15.572Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:57.094Z", + entryId: "658c2531adbc1700090e1ad2", + firstPublishedBy: null, + firstPublishedOn: null, + id: "658c2531adbc1700090e1ad2#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "modelB", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T13:23:15.536Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "file@5atpz8nu": null + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:57.094Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T13:23:15.536Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:23:15.536Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:23:15.536Z", + status: "draft", + tenant: "root", + values: { + "long-text@7c5t8wwa": "DDB+ES - Model B Entry 2 UPDATED", + "text@4dep2w2h": "DDB+ES - Model B Entry 2 UPDATED" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-modelb", + modified: "2023-12-27T13:23:15.572Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dad", + SK: "L", + created: "2023-12-27T12:42:59.544Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602281486ed41f0008bc2dad", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602281486ed41f0008bc2dad#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 108898, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png", + "text@name": "webiny-serverless-cms.png ", + "text@tags": [], + "text@type": "image/png" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.544Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba28", + SK: "L", + created: "2023-12-27T12:42:59.524Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814bef4a940008b3ba28", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814bef4a940008b3ba28#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 132767, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg", + "text@name": "environments.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.524Z" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dac", + SK: "L", + created: "2023-12-27T12:42:59.703Z", + data: { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602281486ed41f0008bc2dac", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602281486ed41f0008bc2dac#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 73153, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg", + "text@name": "data-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + entity: "CmsEntriesElasticsearch", + index: "root-headless-cms-en-us-fmfile", + modified: "2023-12-27T12:42:59.703Z" + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.ddbPrimaryTableData.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.ddbPrimaryTableData.ts new file mode 100644 index 00000000000..c3f1971842e --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.ddbPrimaryTableData.ts @@ -0,0 +1,5458 @@ +// We commented migrations-related records because of constant changes in these. +export const ddbPrimaryTableDataMigrated = [ + { + GSI1_PK: "T#root#GROUPS", + GSI1_SK: "full-access", + PK: "T#root#GROUP#658c1b60c39bb10008431b42", + SK: "A", + TYPE: "security.group", + _ct: "2023-12-27T12:41:05.020Z", + _et: "SecurityGroup", + _md: "2023-12-27T12:41:05.020Z", + createdOn: "2023-12-27T12:41:04.963Z", + description: "Grants full access to all apps.", + id: "658c1b60c39bb10008431b42", + name: "Full Access", + permissions: [ + { + name: "*" + } + ], + slug: "full-access", + system: true, + tenant: "root", + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "T#root#PS#TAG", + GSI1_SK: "pb-page#658c1bd3c39bb10008431b5b#0001#/welcome-to-webiny", + PK: "T#root#PS#TAG#pb-page#658c1bd3c39bb10008431b5b#0001#/welcome-to-webiny", + SK: "658c1bd3c39bb10008431b5b#0001#/welcome-to-webiny", + TYPE: "ps.tagPathLink", + _ct: "2023-12-27T12:43:14.870Z", + _et: "PrerenderingServiceTagPathLink", + _md: "2023-12-27T12:43:14.870Z", + data: { + key: "pb-page", + path: "/welcome-to-webiny", + tenant: "root", + value: "658c1bd3c39bb10008431b5b#0001" + } + }, + { + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5c", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:43:01.122Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:43:00.024Z", + entity: "CmsEntries", + entryId: "wby-aco-658c1bd3c39bb10008431b5c", + id: "wby-aco-658c1bd3c39bb10008431b5c#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "acoSearchRecord-pbpage", + modified: "2023-12-27T12:43:01.122Z", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T12:43:00.024Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:43:00.024Z", + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T12:43:00.024Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:43:00.024Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:43:00.024Z", + status: "draft", + tenant: "root", + values: { + "object@data": { + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.964Z", + "datetime@savedOn": "2023-12-27T12:43:00.663Z", + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@id": "658c1b73c39bb10008431b44", + "text@type": "admin" + }, + "text@id": "658c1bd3c39bb10008431b5c#0001", + "text@path": "/not-found", + "text@pid": "658c1bd3c39bb10008431b5c", + "text@status": "published", + "text@title": "Not Found" + }, + "object@location": { + "text@folderId": "root" + }, + "text@content": + "Not Found Page not found! Sorry, but the page you were looking for could not be found. TAKE ME HOme", + "text@tags": [], + "text@title": "Not Found", + "text@type": "PbPage" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5c", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:43:01.121Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:43:00.024Z", + entity: "CmsEntries", + entryId: "wby-aco-658c1bd3c39bb10008431b5c", + id: "wby-aco-658c1bd3c39bb10008431b5c#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "acoSearchRecord-pbpage", + modified: "2023-12-27T12:43:01.121Z", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T12:43:00.024Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:43:00.024Z", + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T12:43:00.024Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:43:00.024Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:43:00.024Z", + status: "draft", + tenant: "root", + values: { + "object@data": { + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.964Z", + "datetime@savedOn": "2023-12-27T12:43:00.663Z", + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@id": "658c1b73c39bb10008431b44", + "text@type": "admin" + }, + "text@id": "658c1bd3c39bb10008431b5c#0001", + "text@path": "/not-found", + "text@pid": "658c1bd3c39bb10008431b5c", + "text@status": "published", + "text@title": "Not Found" + }, + "object@location": { + "text@folderId": "root" + }, + "text@content": + "Not Found Page not found! Sorry, but the page you were looking for could not be found. TAKE ME HOme", + "text@tags": [], + "text@title": "Not Found", + "text@type": "PbPage" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#PB#C", + SK: "static", + TYPE: "pb.category", + _ct: "2023-12-27T12:42:57.966Z", + _et: "PbCategories", + _md: "2023-12-27T12:42:57.966Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:57.965Z", + layout: "static", + locale: "en-US", + name: "Static", + slug: "static", + tenant: "root", + url: "/static/" + }, + { + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5c", + SK: "L", + TYPE: "pb.page.l", + _ct: "2023-12-27T12:43:00.681Z", + _et: "PbPages", + _md: "2023-12-27T12:43:00.681Z", + category: "static", + content: { + compression: "jsonpack", + content: + "id|h0HqpItbGT|type|document|data|settings|elements|ZlkwCyXhhc|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|horizontalAlignFlex|center|verticalAlign|flex-start|pwR8zBN28v|grid|1100px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|6838kMd5Vh|cell|80px|size|iG8DLRffpF|heading|text|typography|heading1|alignment|tag|h1|color|color3|Page+not+found!|9UHkb1nlN1|paragraph|paragraph1|div|Sorry,+but+the+page+you+were+looking+for+could+not+be+found.|PkNZ6zIVWv|button|buttonText|TAKE+ME+HOme|30px|link|href|/|primary^C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|N|$A|O]|P|$A|Q]]]|6|@$0|R|2|S|4|$5|$9|$A|$B|T]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|S|$U|V]|W|$A|$X|Y]|Z|$X|10]]|N|$A|Q]|P|$A|Q]]]|6|@$0|11|2|12|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|E|13]]|S|$14|1U]]]|6|@$0|15|2|16|4|$17|$A|$2|16|18|19|1A|O|1B|1C|1D|1E]|4|$17|1F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|1G|2|1H|4|$17|$A|$2|1H|18|1I|1A|O|1B|1J|1D|1E]|4|$17|1K]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|1L|2|1M|4|$1N|1O|5|$D|$A|$L|F|J|-1|E|1P]]|N|$A|O]]|1Q|$1R|1S]|2|1T]|6|@]]]]]]]]]]" + }, + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.964Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5c#0001", + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/not-found", + pid: "658c1bd3c39bb10008431b5c", + publishedOn: "2023-12-27T12:43:00.663Z", + savedOn: "2023-12-27T12:43:00.663Z", + settings: { + general: { + layout: "static" + }, + seo: { + meta: [] + }, + social: { + meta: [] + } + }, + status: "published", + tenant: "root", + title: "Not Found", + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5c", + SK: "P", + TYPE: "pb.page.p", + _ct: "2023-12-27T12:43:00.682Z", + _et: "PbPages", + _md: "2023-12-27T12:43:00.682Z", + category: "static", + content: { + compression: "jsonpack", + content: + "id|h0HqpItbGT|type|document|data|settings|elements|ZlkwCyXhhc|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|horizontalAlignFlex|center|verticalAlign|flex-start|pwR8zBN28v|grid|1100px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|6838kMd5Vh|cell|80px|size|iG8DLRffpF|heading|text|typography|heading1|alignment|tag|h1|color|color3|Page+not+found!|9UHkb1nlN1|paragraph|paragraph1|div|Sorry,+but+the+page+you+were+looking+for+could+not+be+found.|PkNZ6zIVWv|button|buttonText|TAKE+ME+HOme|30px|link|href|/|primary^C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|N|$A|O]|P|$A|Q]]]|6|@$0|R|2|S|4|$5|$9|$A|$B|T]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|S|$U|V]|W|$A|$X|Y]|Z|$X|10]]|N|$A|Q]|P|$A|Q]]]|6|@$0|11|2|12|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|E|13]]|S|$14|1U]]]|6|@$0|15|2|16|4|$17|$A|$2|16|18|19|1A|O|1B|1C|1D|1E]|4|$17|1F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|1G|2|1H|4|$17|$A|$2|1H|18|1I|1A|O|1B|1J|1D|1E]|4|$17|1K]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|1L|2|1M|4|$1N|1O|5|$D|$A|$L|F|J|-1|E|1P]]|N|$A|O]]|1Q|$1R|1S]|2|1T]|6|@]]]]]]]]]]" + }, + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.964Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5c#0001", + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/not-found", + pid: "658c1bd3c39bb10008431b5c", + publishedOn: "2023-12-27T12:43:00.663Z", + savedOn: "2023-12-27T12:43:00.663Z", + settings: { + general: { + layout: "static" + }, + seo: { + meta: [] + }, + social: { + meta: [] + } + }, + status: "published", + tenant: "root", + title: "Not Found", + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5c", + SK: "REV#0001", + TYPE: "pb.page", + _ct: "2023-12-27T12:43:00.681Z", + _et: "PbPages", + _md: "2023-12-27T12:43:00.681Z", + category: "static", + content: { + compression: "jsonpack", + content: + "id|h0HqpItbGT|type|document|data|settings|elements|ZlkwCyXhhc|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|horizontalAlignFlex|center|verticalAlign|flex-start|pwR8zBN28v|grid|1100px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|6838kMd5Vh|cell|80px|size|iG8DLRffpF|heading|text|typography|heading1|alignment|tag|h1|color|color3|Page+not+found!|9UHkb1nlN1|paragraph|paragraph1|div|Sorry,+but+the+page+you+were+looking+for+could+not+be+found.|PkNZ6zIVWv|button|buttonText|TAKE+ME+HOme|30px|link|href|/|primary^C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|N|$A|O]|P|$A|Q]]]|6|@$0|R|2|S|4|$5|$9|$A|$B|T]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|S|$U|V]|W|$A|$X|Y]|Z|$X|10]]|N|$A|Q]|P|$A|Q]]]|6|@$0|11|2|12|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|E|13]]|S|$14|1U]]]|6|@$0|15|2|16|4|$17|$A|$2|16|18|19|1A|O|1B|1C|1D|1E]|4|$17|1F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|1G|2|1H|4|$17|$A|$2|1H|18|1I|1A|O|1B|1J|1D|1E]|4|$17|1K]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|1L|2|1M|4|$1N|1O|5|$D|$A|$L|F|J|-1|E|1P]]|N|$A|O]]|1Q|$1R|1S]|2|1T]|6|@]]]]]]]]]]" + }, + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.964Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5c#0001", + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/not-found", + pid: "658c1bd3c39bb10008431b5c", + publishedOn: "2023-12-27T12:43:00.663Z", + savedOn: "2023-12-27T12:43:00.663Z", + settings: { + general: { + layout: "static" + }, + seo: { + meta: [] + }, + social: { + meta: [] + } + }, + status: "published", + tenant: "root", + title: "Not Found", + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#PB#M", + SK: "main-menu", + TYPE: "pb.menu", + _ct: "2023-12-27T12:42:59.821Z", + _et: "PbMenus", + _md: "2023-12-27T12:42:59.821Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.821Z", + description: "The main menu of the website, containing links to most important pages.", + items: [], + locale: "en-US", + slug: "main-menu", + tenant: "root", + title: "Main Menu" + }, + { + PK: "T#root#L#en-US#FB#SETTINGS", + SK: "default", + _ct: "2023-12-27T12:43:01.966Z", + _et: "FormBuilderSettings", + _md: "2023-12-27T12:43:01.966Z", + domain: "https://d3hohw12noi930.cloudfront.net", + locale: "en-US", + reCaptcha: { + enabled: null, + secretKey: null, + siteKey: null + }, + tenant: "root" + }, + { + GSI1_PK: "T#root#PS#TAG", + GSI1_SK: "pb-menu#main-menu#/", + PK: "T#root#PS#TAG#pb-menu#main-menu#/", + SK: "main-menu#/", + TYPE: "ps.tagPathLink", + _ct: "2023-12-27T12:43:19.484Z", + _et: "PrerenderingServiceTagPathLink", + _md: "2023-12-27T12:43:19.484Z", + data: { + key: "pb-menu", + path: "/", + tenant: "root", + value: "main-menu" + } + }, + { + GSI1_PK: "T#root#GROUPS", + GSI1_SK: "anonymous", + PK: "T#root#GROUP#658c1b61c39bb10008431b43", + SK: "A", + TYPE: "security.group", + _ct: "2023-12-27T12:41:05.147Z", + _et: "SecurityGroup", + _md: "2023-12-27T12:41:05.147Z", + createdOn: "2023-12-27T12:41:05.146Z", + description: "Permissions for anonymous users (public access).", + id: "658c1b61c39bb10008431b43", + name: "Anonymous", + permissions: [], + slug: "anonymous", + system: true, + tenant: "root", + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba27", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.007Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814bef4a940008b3ba27", + id: "6022814bef4a940008b3ba27#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.007Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 17711, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg", + "text@name": "security.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba27", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.007Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814bef4a940008b3ba27", + id: "6022814bef4a940008b3ba27#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.007Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 17711, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg", + "text@name": "security.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CM", + SK: "modelA", + TYPE: "cms.model", + _ct: "2023-12-27T13:20:12.156Z", + _et: "CmsModels", + _md: "2023-12-27T13:20:12.156Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:18:26.594Z", + descriptionFieldId: "description", + fields: [ + { + fieldId: "title", + helpText: null, + id: "f2qcuuzs", + label: "Title", + listValidation: [], + multipleValues: false, + placeholderText: null, + predefinedValues: { + enabled: false, + values: [] + }, + renderer: { + name: "text-input" + }, + settings: {}, + storageId: "text@f2qcuuzs", + tags: [], + type: "text", + validation: [ + { + message: "Title is a required field.", + name: "required", + settings: {} + } + ] + }, + { + fieldId: "description", + helpText: null, + id: "z2tdm05d", + label: "Description", + listValidation: [], + multipleValues: false, + placeholderText: null, + predefinedValues: { + enabled: false, + values: [] + }, + renderer: { + name: "long-text-text-area" + }, + settings: {}, + storageId: "long-text@z2tdm05d", + tags: [], + type: "long-text", + validation: [] + }, + { + fieldId: "image", + helpText: null, + id: "8y67xrmj", + label: "Image", + listValidation: [], + multipleValues: false, + placeholderText: null, + predefinedValues: { + enabled: false, + values: [] + }, + renderer: { + name: "file-input" + }, + settings: { + imagesOnly: true + }, + storageId: "file@8y67xrmj", + tags: [], + type: "file", + validation: [] + } + ], + group: { + id: "658c1bcbc39bb10008431b45", + name: "Ungrouped" + }, + imageFieldId: "image", + layout: [["f2qcuuzs"], ["z2tdm05d", "8y67xrmj"]], + locale: "en-US", + lockedFields: [ + { + fieldId: "text@f2qcuuzs", + multipleValues: false, + type: "text" + }, + { + fieldId: "long-text@z2tdm05d", + multipleValues: false, + type: "long-text" + }, + { + fieldId: "file@8y67xrmj", + multipleValues: false, + type: "file" + } + ], + modelId: "modelA", + name: "ModelA", + pluralApiName: "ModelAs", + savedOn: "2023-12-27T13:18:39.298Z", + singularApiName: "ModelA", + tags: ["type:model"], + tenant: "root", + titleFieldId: "title", + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CM", + SK: "modelB", + TYPE: "cms.model", + _ct: "2023-12-27T13:22:45.032Z", + _et: "CmsModels", + _md: "2023-12-27T13:22:45.032Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:21:39.663Z", + descriptionFieldId: "description", + fields: [ + { + fieldId: "title", + helpText: null, + id: "4dep2w2h", + label: "Title", + listValidation: [], + multipleValues: false, + placeholderText: null, + predefinedValues: { + enabled: false, + values: [] + }, + renderer: { + name: "text-input" + }, + settings: {}, + storageId: "text@4dep2w2h", + tags: [], + type: "text", + validation: [ + { + message: "Title is a required field.", + name: "required", + settings: {} + } + ] + }, + { + fieldId: "description", + helpText: null, + id: "7c5t8wwa", + label: "Description", + listValidation: [], + multipleValues: false, + placeholderText: null, + predefinedValues: { + enabled: false, + values: [] + }, + renderer: { + name: "long-text-text-area" + }, + settings: {}, + storageId: "long-text@7c5t8wwa", + tags: [], + type: "long-text", + validation: [] + }, + { + fieldId: "image", + helpText: null, + id: "5atpz8nu", + label: "Image", + listValidation: [], + multipleValues: false, + placeholderText: null, + predefinedValues: { + enabled: false, + values: [] + }, + renderer: { + name: "file-input" + }, + settings: { + imagesOnly: true + }, + storageId: "file@5atpz8nu", + tags: [], + type: "file", + validation: [] + } + ], + group: { + id: "658c1bcbc39bb10008431b45", + name: "Ungrouped" + }, + imageFieldId: "image", + layout: [["4dep2w2h"], ["7c5t8wwa", "5atpz8nu"]], + locale: "en-US", + lockedFields: [ + { + fieldId: "text@4dep2w2h", + multipleValues: false, + type: "text" + }, + { + fieldId: "long-text@7c5t8wwa", + multipleValues: false, + type: "long-text" + }, + { + fieldId: "file@5atpz8nu", + multipleValues: false, + type: "file" + } + ], + modelId: "modelB", + name: "ModelB", + pluralApiName: "ModelBs", + savedOn: "2023-12-27T13:21:46.459Z", + singularApiName: "ModelB", + tags: ["type:model"], + tenant: "root", + titleFieldId: "title", + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c721", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.262Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228145f98841000981c721", + id: "60228145f98841000981c721#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.262Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 27804, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg", + "text@name": "developer.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c721", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.261Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228145f98841000981c721", + id: "60228145f98841000981c721#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.261Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 27804, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg", + "text@name": "developer.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#SYSTEM", + SK: "ADMIN_USERS", + TYPE: "adminUsers.system", + _ct: "2023-12-27T12:41:24.444Z", + _et: "AdminUsers.System", + _md: "2023-12-27T12:41:24.444Z", + tenant: "root", + version: "5.38.2" + }, + { + PK: "T#root#SYSTEM", + SK: "CMS", + _ct: "2023-12-27T12:42:51.969Z", + _et: "CmsSystem", + _md: "2023-12-27T12:42:51.969Z", + tenant: "root", + version: "5.38.2" + }, + { + PK: "T#root#SYSTEM", + SK: "FB", + _ct: "2023-12-27T12:43:01.981Z", + _et: "FormBuilderSystem", + _md: "2023-12-27T12:43:01.981Z", + tenant: "root", + version: "5.38.2" + }, + { + PK: "T#root#SYSTEM", + SK: "FM", + _ct: "2023-12-27T12:42:52.301Z", + _et: "System", + _md: "2023-12-27T12:42:52.301Z", + tenant: "root", + version: "5.38.2" + }, + { + PK: "T#root#SYSTEM", + SK: "I18N", + _ct: "2023-12-27T12:42:49.990Z", + _et: "I18NSystem", + _md: "2023-12-27T12:42:49.990Z", + tenant: "root", + version: "5.38.2" + }, + { + PK: "T#root#SYSTEM", + SK: "PB", + _ct: "2023-12-27T12:43:01.256Z", + _et: "PbSystem", + _md: "2023-12-27T12:43:01.256Z", + tenant: "root", + version: "5.38.2" + }, + { + PK: "T#root#SYSTEM", + SK: "SECURITY", + _ct: "2023-12-27T12:41:05.169Z", + _et: "SecuritySystem", + _md: "2023-12-27T12:41:05.169Z", + installedOn: "2023-12-27T12:41:05.169Z", + tenant: "root", + version: "5.38.2" + }, + { + PK: "T#root#SYSTEM", + SK: "TENANCY", + _ct: "2023-12-27T12:40:58.981Z", + _et: "TenancySystem", + _md: "2023-12-27T12:40:58.981Z", + version: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814b7a77e60008f70d62", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:58.903Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814b7a77e60008f70d62", + id: "6022814b7a77e60008f70d62#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:58.903Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 1864, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg", + "text@name": "hero-block-bg.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814b7a77e60008f70d62", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:58.903Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814b7a77e60008f70d62", + id: "6022814b7a77e60008f70d62#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:58.903Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 1864, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg", + "text@name": "hero-block-bg.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602282e07a77e60008f70d63", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:58.944Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602282e07a77e60008f70d63", + id: "602282e07a77e60008f70d63#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:58.944Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 888, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg", + "text@name": "feature-card-bg.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602282e07a77e60008f70d63", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:58.944Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602282e07a77e60008f70d63", + id: "602282e07a77e60008f70d63#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:58.944Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 888, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg", + "text@name": "feature-card-bg.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "T#root#PS#TAG", + GSI1_SK: "pb-menu#main-menu#/welcome-to-webiny", + PK: "T#root#PS#TAG#pb-menu#main-menu#/welcome-to-webiny", + SK: "main-menu#/welcome-to-webiny", + TYPE: "ps.tagPathLink", + _ct: "2023-12-27T12:43:14.870Z", + _et: "PrerenderingServiceTagPathLink", + _md: "2023-12-27T12:43:14.870Z", + data: { + key: "pb-menu", + path: "/welcome-to-webiny", + tenant: "root", + value: "main-menu" + } + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T13:20:25.735Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:25.235Z", + entity: "CmsEntries", + entryId: "658c24996607be00087f1167", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:25.701Z", + id: "658c24996607be00087f1167#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:25.701Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modified: "2023-12-27T13:20:25.735Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:25.701Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:25.235Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:25.701Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:25.701Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:25.701Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:25.701Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 2" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167", + SK: "P", + TYPE: "cms.entry.p", + created: "2023-12-27T13:20:25.724Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:25.235Z", + entity: "CmsEntries", + entryId: "658c24996607be00087f1167", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:25.701Z", + id: "658c24996607be00087f1167#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:25.701Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modified: "2023-12-27T13:20:25.724Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:25.701Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:25.235Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:25.701Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:25.701Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:25.701Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:25.701Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 2" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24996607be00087f1167", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T13:20:25.723Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:25.235Z", + entity: "CmsEntries", + entryId: "658c24996607be00087f1167", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:25.701Z", + id: "658c24996607be00087f1167#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:25.701Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modified: "2023-12-27T13:20:25.723Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:25.701Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:25.235Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:25.701Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:25.701Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:25.701Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:25.701Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 2" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c720", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.105Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228145f98841000981c720", + id: "60228145f98841000981c720#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.105Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 28918, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg", + "text@name": "adaptable-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c720", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.105Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228145f98841000981c720", + id: "60228145f98841000981c720#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.105Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 28918, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg", + "text@name": "adaptable-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dab", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.202Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602281486ed41f0008bc2dab", + id: "602281486ed41f0008bc2dab#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.202Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 67402, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg", + "text@name": "permission-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dab", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.202Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602281486ed41f0008bc2dab", + id: "602281486ed41f0008bc2dab#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.202Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 67402, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg", + "text@name": "permission-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#I18N#L#D", + SK: "default", + _ct: "2023-12-27T12:42:49.523Z", + _et: "I18NLocale", + _md: "2023-12-27T12:42:49.523Z", + code: "en-US", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:48.245Z", + default: true, + tenant: "root", + webinyVersion: "5.38.2" + }, + { + PK: "APW#SETTINGS", + SK: "default", + eventRuleName: "wby-apw-scheduler-event-rule-3889a7f", + eventTargetId: "wby-apw-scheduler-event-rule-target-34a2e04", + mainGraphqlFunctionArn: + "arn:aws:lambda:eu-central-1:674320871285:function:wby-graphql-670ccd3" + }, + { + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5b", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:43:01.107Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:43:00.006Z", + entity: "CmsEntries", + entryId: "wby-aco-658c1bd3c39bb10008431b5b", + id: "wby-aco-658c1bd3c39bb10008431b5b#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "acoSearchRecord-pbpage", + modified: "2023-12-27T12:43:01.107Z", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T12:43:00.006Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:43:00.006Z", + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T12:43:00.006Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:43:00.006Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:43:00.006Z", + status: "draft", + tenant: "root", + values: { + "object@data": { + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.947Z", + "datetime@savedOn": "2023-12-27T12:43:00.723Z", + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@id": "658c1b73c39bb10008431b44", + "text@type": "admin" + }, + "text@id": "658c1bd3c39bb10008431b5b#0001", + "text@path": "/welcome-to-webiny", + "text@pid": "658c1bd3c39bb10008431b5b", + "text@status": "published", + "text@title": "Welcome to Webiny" + }, + "object@location": { + "text@folderId": "root" + }, + "text@content": + "Welcome to Webiny Welcome to Webiny Webiny makes it easy to build applications and websites on top of the serverless infrastructure by providing you with a ready-made CMS and a development framework. Scalable Webiny apps can scale to handle the most demanding workloads. No custom tooling required Webiny eliminates the need to build custom tooling to create serverless app Cost effective Webiny apps run on serverless infrastructure which costs 80% less than VMs Resolves serverless challenges Webiny removes all the challenges of building serverless applications Get to know Webiny products Architect. Code. Deploy. Webiny Serverless Application Framework Everything you need to create and deploy applications on top of the serverless infrastructure.  Use it to build: Full-stack applicationsMulti-tenant solutions APIsMicroservice Learn more An easier way to build serverless apps There are many solutions that help you run, deploy and monitor serverless functions, but when it comes to actually coding one, there are none. Webiny is a solution that helps you code your serverless app by providing you with all the components like ACL, routing, file storage and many more. Framework features Users, groups, roles & scopes Security is a crucial layer in any application. Webiny includes a full-featured security module that's connected to the built-in GraphQL API.Users, groups, roles & scopes Scaffolding Quickly generate boilerplate code using CLI plugins. From lambda functions to new GraphQL APIs. Customizable security Use the default AWS Cognito, or replace with 3rd party identity providers like Okta, Auth0, etc. Using plugins you can make Webiny work with any identity provider. Multiple environments No code change goes directly into a production environment. Webiny CLI makes it easy to manage and create multiple environments for your project. One size doesn't fit all It's a very different set of requirements a technical team has to a marketing team to a business development team. Webiny Serverless CMS comes with several different apps you can use independently, or together as part of a cohesive solution. Webiny Serverless CMS A suite of applications to help you manage your content. Use it to build: Marketing sites Multi-website solutions Content hubs Multi-language sites Intranet portals Headless content models Learn more CMS benefits Scalable No matter the demand, Webiny Serverless CMS can easily scale to meet even the most challenging workloads. Adaptable Being an open-source project, it's easy to modify and adapt things to your own needs. Low cost of ownership Self-hosted on top of serverless infrastructure. No infrastructure to mange, less people required to operate and maintain. Secure Secured by AWS Cognito. It's also easy to integrate services like OKTA, Auth0 and similar. Data ownership Webiny is self-hosted, it means your data stays within your data center. Permission control Powerful options to control the permissions your users will have. They perfectly align with your business requirements.  Serverless makes infrastructure easy, Webiny makes serverless easy 1. Developer-friendly Webiny has been made with the developer in mind. It helps them develop serverless applications with ease. 2. Open source Webiny is created and maintained by an amazing group of people. Being open source means Webiny grows and evolves much faster. Contributor are welcome. 3. Community We have an active community on slack. Talk to the core-team, and get help. Webiny team is always there for any questions. View Webiny on GitHub", + "text@tags": [], + "text@title": "Welcome to Webiny", + "text@type": "PbPage" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#wby-aco-658c1bd3c39bb10008431b5b", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:43:01.107Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:43:00.006Z", + entity: "CmsEntries", + entryId: "wby-aco-658c1bd3c39bb10008431b5b", + id: "wby-aco-658c1bd3c39bb10008431b5b#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "acoSearchRecord-pbpage", + modified: "2023-12-27T12:43:01.107Z", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T12:43:00.006Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:43:00.006Z", + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T12:43:00.006Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:43:00.006Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:43:00.006Z", + status: "draft", + tenant: "root", + values: { + "object@data": { + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.947Z", + "datetime@savedOn": "2023-12-27T12:43:00.723Z", + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@id": "658c1b73c39bb10008431b44", + "text@type": "admin" + }, + "text@id": "658c1bd3c39bb10008431b5b#0001", + "text@path": "/welcome-to-webiny", + "text@pid": "658c1bd3c39bb10008431b5b", + "text@status": "published", + "text@title": "Welcome to Webiny" + }, + "object@location": { + "text@folderId": "root" + }, + "text@content": + "Welcome to Webiny Welcome to Webiny Webiny makes it easy to build applications and websites on top of the serverless infrastructure by providing you with a ready-made CMS and a development framework. Scalable Webiny apps can scale to handle the most demanding workloads. No custom tooling required Webiny eliminates the need to build custom tooling to create serverless app Cost effective Webiny apps run on serverless infrastructure which costs 80% less than VMs Resolves serverless challenges Webiny removes all the challenges of building serverless applications Get to know Webiny products Architect. Code. Deploy. Webiny Serverless Application Framework Everything you need to create and deploy applications on top of the serverless infrastructure.  Use it to build: Full-stack applicationsMulti-tenant solutions APIsMicroservice Learn more An easier way to build serverless apps There are many solutions that help you run, deploy and monitor serverless functions, but when it comes to actually coding one, there are none. Webiny is a solution that helps you code your serverless app by providing you with all the components like ACL, routing, file storage and many more. Framework features Users, groups, roles & scopes Security is a crucial layer in any application. Webiny includes a full-featured security module that's connected to the built-in GraphQL API.Users, groups, roles & scopes Scaffolding Quickly generate boilerplate code using CLI plugins. From lambda functions to new GraphQL APIs. Customizable security Use the default AWS Cognito, or replace with 3rd party identity providers like Okta, Auth0, etc. Using plugins you can make Webiny work with any identity provider. Multiple environments No code change goes directly into a production environment. Webiny CLI makes it easy to manage and create multiple environments for your project. One size doesn't fit all It's a very different set of requirements a technical team has to a marketing team to a business development team. Webiny Serverless CMS comes with several different apps you can use independently, or together as part of a cohesive solution. Webiny Serverless CMS A suite of applications to help you manage your content. Use it to build: Marketing sites Multi-website solutions Content hubs Multi-language sites Intranet portals Headless content models Learn more CMS benefits Scalable No matter the demand, Webiny Serverless CMS can easily scale to meet even the most challenging workloads. Adaptable Being an open-source project, it's easy to modify and adapt things to your own needs. Low cost of ownership Self-hosted on top of serverless infrastructure. No infrastructure to mange, less people required to operate and maintain. Secure Secured by AWS Cognito. It's also easy to integrate services like OKTA, Auth0 and similar. Data ownership Webiny is self-hosted, it means your data stays within your data center. Permission control Powerful options to control the permissions your users will have. They perfectly align with your business requirements.  Serverless makes infrastructure easy, Webiny makes serverless easy 1. Developer-friendly Webiny has been made with the developer in mind. It helps them develop serverless applications with ease. 2. Open source Webiny is created and maintained by an amazing group of people. Being open source means Webiny grows and evolves much faster. Contributor are welcome. 3. Community We have an active community on slack. Talk to the core-team, and get help. Webiny team is always there for any questions. View Webiny on GitHub", + "text@tags": [], + "text@title": "Welcome to Webiny", + "text@type": "PbPage" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "T#root#PS#RENDER", + GSI1_SK: "/", + PK: "T#root#PS#RENDER#/", + SK: "A", + TYPE: "ps.render", + _ct: "2023-12-27T12:43:19.454Z", + _et: "PrerenderingServiceRender", + _md: "2023-12-27T12:43:19.454Z", + data: { + files: [ + { + meta: { + tags: [ + { + key: "pb-page", + value: "658c1bd3c39bb10008431b5b#0001" + }, + { + key: "pb-menu", + value: "main-menu" + } + ] + }, + name: "index.html", + type: "text/html" + }, + { + meta: {}, + name: "graphql.json", + type: "application/json" + } + ], + locale: "en-US", + path: "/", + tenant: "root" + } + }, + { + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5b", + SK: "L", + TYPE: "pb.page.l", + _ct: "2023-12-27T12:43:00.864Z", + _et: "PbPages", + _md: "2023-12-27T12:43:00.864Z", + category: "static", + content: { + compression: "jsonpack", + content: + 'id|Fv1PpPWu-|type|document|data|settings|elements|xqt7BI4iN9|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|100px|275px|16px|tablet|horizontalAlignFlex|center|verticalAlign|flex-start|background|image|file|6022814b7a77e60008f70d62|src|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg|gdE7Q7rcA|grid|1100px|20px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|_fbQO4Nlpp|cell|size|cdk_pclqE|6022814b0df4b000088735bc|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg|height|44px|ovLRNqyVu3|wmMU13uZ10|1eUZzAvoB|heading|text|typography|heading1|alignment|tag|h1|color|color6|Welcome+to+Webiny|F6ZREnQcc|64px|oEgjDLVXUu|0xYOozhJw|paragraph|paragraph1|div|Webiny+makes+it+easy+to+build+applications+and+websites+on+top+of+the+serverless+infrastructure+by+providing+you+with+a+ready-made+CMS+and+a+development+framework.
|20%25|20%25|gwhTOrZvc|30px|6-6|EaIMtHtOIw|-8px|px|602282e07a77e60008f70d63|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg|8k7zxQUTm|heading6|h6|Scalable|qNngQ1C-5|paragraph2|Webiny+apps+can+scale+to+handle+the+most+demanding+workloads.
|uBv_VRv0i|8px|iQaW4vjKg|No+custom+tooling+required|Wy3Tw-Lb8|Webiny+eliminates+the+need+to+build+custom+tooling+to+create+serverless+app
|uwrjoSZkB|Q39eQZm_8z|zSVZIwnSQ0|Cost+effective|S-Ydr4kX6k|Webiny+apps+run+on+serverless+infrastructure+which+costs+80%25+less+than+VMs
|nUX2JXYjhD|8z0hL8l7ay|Resolves+serverless+challenges|04ZNIcAGE_|Webiny+removes+all+the+challenges+of+building+serverless+applications
|vm0cFfH8KG|100%25|65px|75px|txeqybzKr3|80px|wMjC2uv8cj|Pm7ws20iA|color3|Get+to+know+Webiny+products|6CPpd558B|heading2|h2|Architect.+Code.+Deploy.|1e0_OJgMx|gpYd80MXeg|40px|15px|kAYc-QClR|4-8|border|style|solid|rgba(229,+229,+229,+1)|1|8i803wClVt|p55J-BkDn|6022814a0df4b000088735bb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg|90px|link|8nddxG64r|PR-yiR65n|heading3|h3|Webiny+Serverless+

Application+Framework|pVH9_fFLM|x0SSJvgrdD|b0iE8vr2S|Everything+you+need+to+create+and+deploy+applications+on+top+of+the+serverless+infrastructure. 
|JMSKwWsT_|OU70Y990tA|T_M_Ww4Wb|heading4|h4|Use+it+to+build:|806nmKOyc|g59JmcyM-7|Cyziie_SK|list|

    \n++++++++++++++++++++
  • Full-stack+applications
  • Multi-tenant+solutions
  • \n++++++++++++++++
|ST0O1ZeCk|ILrAABWXiX|
    \n++++++++++++++++++++
  • APIs
  • Microservice
  • \n++++++++++++++++
|XxXGeIywO|9H5t3COdbo|mc0_RS9rg|button|buttonText|Learn+more|50px|href|https://www.webiny.com/serverless-application-framework/|newTab|primary|icon|fas|long-arrow-alt-right|svg||position|16|Kg3rMc1Re|LAcQHMs8K|8oaRz-Gko_|9fQ9W-xiB|6022814891bd1300087bd24c|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg|YCG34DB89|xvBXD_QTkN|GqW2LBMzV|An+easier+way+to+build+serverless+apps|9cWYQwXUd|There+are+many+solutions+that+help+you+run,+deploy+and+monitor+serverless+functions,+but+when+it+comes+to+actually+coding+one,+there+are+none.+Webiny+is+a+solution+that+helps+you+code+your+serverless+app+by+providing+you+with+all+the+components+like+ACL,+routing,+file+storage+and+many+more.
|LxqyquKlYy|100%25|60px|177px|60228148f98841000981c723|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg|yqrzxoDllE|70px|bD-TQmZyW8|4ESAx7NxM|Framework+features|Xr7NLMpzm|3-3-3-3|_RtRioPOsj|12px|mOr47ImJK|AlTNw-76F8|r0e8MiCuK|6022814bef4a940008b3ba27|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg|170px|QFwbqHtSh|DH-C0-mBsO|XSN-oY3V3|Users,+groups,+roles+&+scopes|Unyhp8o-a|Security+is+a+crucial+layer+in+any+application.+Webiny+includes+a+full-featured+security+module+that\'s+connected+to+the+built-in+GraphQL+API.Users,+groups,+roles+&+scopes
|Ntcduee0-|0b66dbGkG|PoRqI9i2xE|0ZpnBSqjoz|6022814bef4a940008b3ba26|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg|FFGobMHHI|IWxl_nrRkr|I5btsZceI|Scaffolding|5qvaQSnP6|Quickly+generate+boilerplate+code+using+CLI+plugins.+From+lambda+functions+to+new+GraphQL+APIs.
|YHUznp7ZM5|PlxqV_uS7B|zKQYI-EIFl|frRuzWpRI|60228148f98841000981c724|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg|M1tvv840H|fwreagGdac|6H1tgEViY|Customizable+security|h0Ctka4TED|Use+the+default+AWS+Cognito,+or+replace+with+3rd+party+identity+providers+like+Okta,+Auth0,+etc.+Using+plugins+you+can+make+Webiny+work+with+any+identity+provider.
|SyyrOA60AF|GvU31fd4U|1vAxZAkD9O|dlI-qhVLKy|6022814bef4a940008b3ba28|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg|ftA7NOOxG|WU58SBDPP8|QtYfpt1yoE|Multiple+environments|mmpGUzg6o1|No+code+change+goes+directly+into+a+production+environment.+Webiny+CLI+makes+it+easy+to+manage+and+create+multiple+environments+for+your+project.
|wYK9BhaanZ|100%25|125px|ur1DQFl5BR|TzBvXtU2PH|-PU3iBlQ4|A6sNR3MR-5|Xtqk_itss|602281486ed41f0008bc2dad|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png|495px|bsKTDygik|ev9nhHISRw|1BBr9ACuM|One+size+doesn\'t+fit+all|0olguTqDN|It\'s+a+very+different+set+of+requirements+a+technical+team+has+to+a+marketing+team+to+a+business+development+team.+Webiny+Serverless+CMS+comes+with+several+different+apps+you+can+use+independently,+or+together+as+part+of+a+cohesive+solution.
|BhnYb3VW7D|QYZ290WhC|rgba(238,+238,+238,+1)|ER2SFYwbeK|gZp3Hxm5Js|602281486639200009fd35eb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg|FsOaMudE8|ElruSYJxWM|Webiny+Serverless+

CMS|9HJcM89Am|8Cp2ZC30_H|qrS5wswdQ|heading5|h5|A+suite+of+applications+to+help+you+manage+your+content.+|pLUutc-E2|MGlDcu91q_|A6rStUekq|Use+it+to+build:|jIdakfVZU|5JHsGc_Rq-|SNOFqUK6lI|

    \n++++++++++++++++++++
  • Marketing+sites
  • \n++++++++++++++++++++
  • Multi-website+solutions
  • \n++++++++++++++++++++
  • Content+hubs
  • \n++++++++++++++++
|96dJBnIlc|5cPfb7AwXH|
    \n++++++++++++++++++++
  • Multi-language+sites
  • \n++++++++++++++++++++
  • Intranet+portals
  • \n++++++++++++++++++++
  • Headless+content+models
  • \n++++++++++++++++
|L4dFyzBKMM|Learn+more|https://www.webiny.com/serverless-cms/||mjmNmloeUS|100%25|220px|602281486639200009fd35ec|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg|xUkOEAm5X3|Kgr1ambSuG|AP_uTrgLZ|CMS+benefits|juBaAPJ76|4-4-4|s95PSAToXK|35px|ZECp8jcZD|60228148fa244d0008c47c79|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg|146px|EyKog1RmH|Scalable|_8lCcwhUN|No+matter+the+demand,+Webiny+Serverless+CMS+can+easily+scale+to+meet+even+the+most+challenging+workloads.
|SmrEQ9OZ8|QWM8cmlQEM|60228145f98841000981c720|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg|TYx-A5YCI|Adaptable|SsbWKZz_Z|Being+an+open-source+project,+it\'s+easy+to+modify+and+adapt+things+to+your+own+needs.
|gqdtbKfv7l|jBWaxzt-4|6022814851197600081724ae|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg|NLSOIstf9|Low+cost+of+ownership|kI-neIjkXx|Self-hosted+on+top+of+serverless+infrastructure.+No+infrastructure+to+mange,+less+people+required+to+operate+and+maintain.
|V14HHGmXN|-djsQadY-8|pTVeVoKkTi|bM5b8O7IMY|Secure|l9PuI-TdVA|Secured+by+AWS+Cognito.+It\'s+also+easy+to+integrate+services+like+OKTA,+Auth0+and+similar.
|N1lW0cAasg|W-ub9guhLt|602281486ed41f0008bc2dac|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg|DVhLZfrM53|Data+ownership|shmIumNfIu|Webiny+is+self-hosted,+it+means+your+data+stays+within+your+data+center.+
|8F7J_16a46|2gtT4Mfw6c|602281486ed41f0008bc2dab|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg|5EMJkVWgKW|Permission+control|cdSOjFAWkf|Powerful+options+to+control+the+permissions+your+users+will+have.+They+perfectly+align+with+your+business+requirements. 
|5ggqk561Ka|100%25|C6B8QfkUXs|ChF1iOAbtb|7tRfsJ_SEz|Serverless+makes+infrastructure+easy,+

Webiny+makes+serverless+easy|oYf9t6Uwz|RdazJP-4W1|7jBNW1iTi|60228145f98841000981c721|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg|200px|npNMgLft0|1.+Developer-friendly|DpubDRaGQ|Webiny+has+been+made+with+the+developer+in+mind.+It+helps+them+develop+serverless+applications+with+ease.
|KbQocaayR|KDO-Ja7wS|60228145f98841000981c71f|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg|ETll3nkV4|2.+Open+source|UWPjvO7EC|Webiny+is+created+and+maintained+by+an+amazing+group+of+people.+Being+open+source+means+Webiny+grows+and+evolves+much+faster.+Contributor+are+welcome.
|En4soRn06o|fqxeYbEV4|60228148fa244d0008c47c7a|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png|276px|e5v0LBbfz|3.+Community|p9FWp5yqUy|We+have+an+active+community+on+slack.+Talk+to+the+core-team,+and+get+help.+Webiny+team+is+always+there+for+any+questions.
|OYp5Z-6Xo|woaE-6v5bN|Y8ndbn88hy|View+Webiny+on+GitHub|https://github.com/webiny/webiny-js|secondary|fab|github|^C|C|C|6|6|6|6|C|6|3|9|C|C|6|6|C|6|C|C|C|3|C|C|3|C|C|3|C|C|3|C|C|6|C|C|6|3|9|C|C|6|6|C|4|4|4|4|4|4|C|4|4|4|C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|O|I|P|G|P]|Q|$J|-1|I|M|G|M]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|Y|Z|10]]]]]]|6|@$0|11|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BC]]]|6|@$0|1F|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|1G|Z|1H]|1I|1J]]|6|@]]]]]]|$0|1K|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1L|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BD]]]|6|@$0|1M|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|1V]|4|$1O|1W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|1X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|1Y|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1Z|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BE]]]|6|@$0|20|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|1V]|4|$1O|24]]|5|$D|$A|$L|F]]|K|$A|$L|F|J|-1|I|25|G|26]|Q|$I|F|G|F|J|-1]]]]|6|@]]]]]]|$0|27|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]|Q|$I|2C]]|K|$A|$L|F]]|12|$1E|BF]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2F|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2I]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2J|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2L]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BG]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2O|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2Q|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|2S|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]|1A|$J|-2]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2T|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]]|K|$A|$L|F]]|12|$1E|BH]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2U|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2V]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2W|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2X]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|Q|$J|-1|I|2N|E|F]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BI]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2Z|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|30]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|31|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|32]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|33|2|8|4|$5|$9|$A|$B|34]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|35|H|36|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|37|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|38|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|39|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BJ]]]|6|@$0|3A|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|3C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|3D|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|S|1S|3F|1U|3B]|4|$1O|3G]]|5|$D|$A|$L|F|J|-1|E|P]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|3H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|3I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|BK]]]|6|@$0|3L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|S]|3N|$A|$3O|3P|1U|3Q|9|$L|3R|J|-1|H|3R]]]]]|6|@$0|3S|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BL]]]|6|@$0|3T|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|3U|Z|3V]|1I|3W]|3X|$]]|6|@]]]]|$0|3Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BM]]]|6|@$0|3Z|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41|1U|3B]|4|$1O|42]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|43|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|44|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BN]]]|6|@$0|45|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|46]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|47|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|P|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|48|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BO]]]|6|@$0|49|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|4C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4D|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4E|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BP]]]|6|@$0|4F|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4H]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|4I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BQ]]]|6|@$0|4J|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BR]]]|6|@$0|4N|2|4O|4|$4P|4Q|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|4T|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|50|51|G|9|52]]|6|@]]]]]]]]|$0|53|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$E|F|G|F|H|F|I|F|L|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|BS]]]|6|@$0|54|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|55|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BT]]]|6|@$0|56|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|57|Z|58]]|3X|$]]|6|@]]]]]]|$0|59|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BU]]]|6|@$0|5B|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|5C]]|5|$D|$A|$L|F|J|-1]]|K|$A|$L|F]]]]|6|@]]|$0|5D|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|5E]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]]]]]|$0|5F|2|8|4|$5|$9|$A|$B|5G]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|5H|G|P|H|5I|I|P|J|-1]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|5J|Z|5K]]]]]]|6|@$0|5L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|5M|I|F|J|-1]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BV]]]|6|@$0|5O|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|5P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|5Q|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|5R]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5S|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|5T]|1A|$I|5T|J|-1]]|12|$1E|BW]]]|6|@$0|5U|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5V|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BX]]]|6|@$0|5W|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|5X|Z|5Y]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|60|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|61|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BY]]]|6|@$0|62|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|63]]|5|$D|$A|$L|F|J|-1|H|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|64|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|65]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|66|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|BZ]]]|6|@$0|67|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|68|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C0]]]|6|@$0|69|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6A|Z|6B]|1I|5Z]]|6|@]]]]]]|$0|6C|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6D|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C1]]]|6|@$0|6E|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6G|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6H]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|C2]]]|6|@$0|6J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6K|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C3]]]|6|@$0|6L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|6O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6P|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C4]]]|6|@$0|6Q|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6S|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6T]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|5T]|1A|$G|5T|J|-1]]|12|$1E|C5]]]|6|@$0|6V|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6W|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C6]]]|6|@$0|6X|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6Y|Z|6Z]|1I|5Z]]|6|@]]]]]]|$0|70|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|71|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C7]]]|6|@$0|72|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|73]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|74|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|75]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|76|2|8|4|$5|$9|$A|$B|77]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|78|G|P|H|36|I|P|J|-1]]|R|$A|S]|T|$A|U]]]|6|@$0|79|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7A|2|1D|4|$5|$D|$A|$E|F|G|F|H|38|I|F|J|-1]|1A|$J|-1]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|C8]]]|6|@$0|7B|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C9]]]|6|@$0|7D|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7E|Z|7F]|9|7G]]|6|@]]]]]]|$0|7H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CA]]]|6|@$0|7J|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|7K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7L|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|7M]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|7N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|CB]]]|6|@$0|7O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]|3N|$A|$3O|3P|1U|7P|9|$J|-1|H|3R]]]]]|6|@$0|7Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CC]]]|6|@$0|7R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7S|Z|7T]|1I|3W]|3X|$]]|6|@]]]]|$0|7U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CD]]]|6|@$0|7V|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41]|4|$1O|7W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CE]]]|6|@$0|7Z|2|1N|4|$1O|$A|$2|1N|1P|80|1R|I|1S|81|1U|3B]|4|$1O|82]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|83|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|4R|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|84|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CF]]]|6|@$0|85|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|86]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|87|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|88|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CG]]]|6|@$0|89|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8A]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|8B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CH]]]|6|@$0|8C|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8D]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8E|2|4O|4|$4P|8F|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|8G|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|8H|51|G|9|52]]|6|@]]]]]]]]|$0|8I|2|8|4|$5|$9|$A|$B|8J]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|38|H|8K|I|P|G|P]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|8L|Z|8M]]]]]]|6|@$0|8N|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|5H|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8O|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CI]]]|6|@$0|8P|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|8Q]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8R|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8T|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|G|8U|I|8U]]|12|$1E|CJ]]]|6|@$0|8V|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|8W|Z|8X]|1I|8Y]|3X|$]]|6|@]]|$0|8Z|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|90]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|91|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|92]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|93|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CK]]]|6|@$0|94|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|95|Z|96]|1I|8Y]|3X|$]]|6|@]]|$0|97|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|98]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|99|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9A]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CL]]]|6|@$0|9C|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9D|Z|9E]|1I|8Y]|3X|$]]|6|@]]|$0|9F|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9G]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9H|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9I]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|9J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|5H|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|9K|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|I|8U]]|12|$1E|CM]]]|6|@$0|9L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|8Y]|3X|$]]|6|@]]|$0|9M|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9N]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9O|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9P]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CN]]]|6|@$0|9R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9S|Z|9T]|1I|8Y]|3X|$]]|6|@]]|$0|9U|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9V]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9W|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23]|4|$1O|9X]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CO]]]|6|@$0|9Z|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|A0|Z|A1]|1I|8Y]|3X|$]]|6|@]]|$0|A2|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|A3]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|A4|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|A5]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|A6|2|8|4|$5|$9|$A|$B|A7]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|N|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|A8|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|A9|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CP]]]|6|@$0|AA|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|AB]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|AC|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|38|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|AD|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|4R]|1A|$G|4R|J|-1|I|4R]]|12|$1E|CQ]]]|6|@$0|AE|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AF|Z|AG]|1I|AH]|3X|$]]|6|@]]|$0|AI|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AJ]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AK|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AL]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AM|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|4R|G|4R]]|12|$1E|CR]]]|6|@$0|AN|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AO|Z|AP]|1I|AH]|3X|$]]|6|@]]|$0|AQ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AR]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AS|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AT]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AU|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|4R]]|K|$A|$L|F|J|-1|I|4R]|1A|$J|-1|I|4R|G|4R]]|12|$1E|CS]]]|6|@$0|AV|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AW|Z|AX]|1I|AH|9|AY]|3X|$]]|6|@]]|$0|AZ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|B0]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|B1|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|B2]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|B3|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|3J|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|B4|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CT]]]|6|@$0|B5|2|4O|4|$4P|B6|5|$D|$A|$L|F]]|R|$A|S]]|3X|$4S|B7|4U|-1]|2|B8|4W|$0|@B9|BA]|4Z|BB|9|52]]|6|@]]]]]]]]]]' + }, + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.947Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5b#0001", + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/welcome-to-webiny", + pid: "658c1bd3c39bb10008431b5b", + publishedOn: "2023-12-27T12:43:00.723Z", + savedOn: "2023-12-27T12:43:00.723Z", + settings: { + general: { + layout: "static" + }, + seo: { + meta: [] + }, + social: { + meta: [] + } + }, + status: "published", + tenant: "root", + title: "Welcome to Webiny", + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5b", + SK: "P", + TYPE: "pb.page.p", + _ct: "2023-12-27T12:43:00.881Z", + _et: "PbPages", + _md: "2023-12-27T12:43:00.881Z", + category: "static", + content: { + compression: "jsonpack", + content: + 'id|Fv1PpPWu-|type|document|data|settings|elements|xqt7BI4iN9|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|100px|275px|16px|tablet|horizontalAlignFlex|center|verticalAlign|flex-start|background|image|file|6022814b7a77e60008f70d62|src|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg|gdE7Q7rcA|grid|1100px|20px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|_fbQO4Nlpp|cell|size|cdk_pclqE|6022814b0df4b000088735bc|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg|height|44px|ovLRNqyVu3|wmMU13uZ10|1eUZzAvoB|heading|text|typography|heading1|alignment|tag|h1|color|color6|Welcome+to+Webiny|F6ZREnQcc|64px|oEgjDLVXUu|0xYOozhJw|paragraph|paragraph1|div|Webiny+makes+it+easy+to+build+applications+and+websites+on+top+of+the+serverless+infrastructure+by+providing+you+with+a+ready-made+CMS+and+a+development+framework.
|20%25|20%25|gwhTOrZvc|30px|6-6|EaIMtHtOIw|-8px|px|602282e07a77e60008f70d63|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg|8k7zxQUTm|heading6|h6|Scalable|qNngQ1C-5|paragraph2|Webiny+apps+can+scale+to+handle+the+most+demanding+workloads.
|uBv_VRv0i|8px|iQaW4vjKg|No+custom+tooling+required|Wy3Tw-Lb8|Webiny+eliminates+the+need+to+build+custom+tooling+to+create+serverless+app
|uwrjoSZkB|Q39eQZm_8z|zSVZIwnSQ0|Cost+effective|S-Ydr4kX6k|Webiny+apps+run+on+serverless+infrastructure+which+costs+80%25+less+than+VMs
|nUX2JXYjhD|8z0hL8l7ay|Resolves+serverless+challenges|04ZNIcAGE_|Webiny+removes+all+the+challenges+of+building+serverless+applications
|vm0cFfH8KG|100%25|65px|75px|txeqybzKr3|80px|wMjC2uv8cj|Pm7ws20iA|color3|Get+to+know+Webiny+products|6CPpd558B|heading2|h2|Architect.+Code.+Deploy.|1e0_OJgMx|gpYd80MXeg|40px|15px|kAYc-QClR|4-8|border|style|solid|rgba(229,+229,+229,+1)|1|8i803wClVt|p55J-BkDn|6022814a0df4b000088735bb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg|90px|link|8nddxG64r|PR-yiR65n|heading3|h3|Webiny+Serverless+

Application+Framework|pVH9_fFLM|x0SSJvgrdD|b0iE8vr2S|Everything+you+need+to+create+and+deploy+applications+on+top+of+the+serverless+infrastructure. 
|JMSKwWsT_|OU70Y990tA|T_M_Ww4Wb|heading4|h4|Use+it+to+build:|806nmKOyc|g59JmcyM-7|Cyziie_SK|list|

    \n++++++++++++++++++++
  • Full-stack+applications
  • Multi-tenant+solutions
  • \n++++++++++++++++
|ST0O1ZeCk|ILrAABWXiX|
    \n++++++++++++++++++++
  • APIs
  • Microservice
  • \n++++++++++++++++
|XxXGeIywO|9H5t3COdbo|mc0_RS9rg|button|buttonText|Learn+more|50px|href|https://www.webiny.com/serverless-application-framework/|newTab|primary|icon|fas|long-arrow-alt-right|svg||position|16|Kg3rMc1Re|LAcQHMs8K|8oaRz-Gko_|9fQ9W-xiB|6022814891bd1300087bd24c|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg|YCG34DB89|xvBXD_QTkN|GqW2LBMzV|An+easier+way+to+build+serverless+apps|9cWYQwXUd|There+are+many+solutions+that+help+you+run,+deploy+and+monitor+serverless+functions,+but+when+it+comes+to+actually+coding+one,+there+are+none.+Webiny+is+a+solution+that+helps+you+code+your+serverless+app+by+providing+you+with+all+the+components+like+ACL,+routing,+file+storage+and+many+more.
|LxqyquKlYy|100%25|60px|177px|60228148f98841000981c723|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg|yqrzxoDllE|70px|bD-TQmZyW8|4ESAx7NxM|Framework+features|Xr7NLMpzm|3-3-3-3|_RtRioPOsj|12px|mOr47ImJK|AlTNw-76F8|r0e8MiCuK|6022814bef4a940008b3ba27|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg|170px|QFwbqHtSh|DH-C0-mBsO|XSN-oY3V3|Users,+groups,+roles+&+scopes|Unyhp8o-a|Security+is+a+crucial+layer+in+any+application.+Webiny+includes+a+full-featured+security+module+that\'s+connected+to+the+built-in+GraphQL+API.Users,+groups,+roles+&+scopes
|Ntcduee0-|0b66dbGkG|PoRqI9i2xE|0ZpnBSqjoz|6022814bef4a940008b3ba26|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg|FFGobMHHI|IWxl_nrRkr|I5btsZceI|Scaffolding|5qvaQSnP6|Quickly+generate+boilerplate+code+using+CLI+plugins.+From+lambda+functions+to+new+GraphQL+APIs.
|YHUznp7ZM5|PlxqV_uS7B|zKQYI-EIFl|frRuzWpRI|60228148f98841000981c724|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg|M1tvv840H|fwreagGdac|6H1tgEViY|Customizable+security|h0Ctka4TED|Use+the+default+AWS+Cognito,+or+replace+with+3rd+party+identity+providers+like+Okta,+Auth0,+etc.+Using+plugins+you+can+make+Webiny+work+with+any+identity+provider.
|SyyrOA60AF|GvU31fd4U|1vAxZAkD9O|dlI-qhVLKy|6022814bef4a940008b3ba28|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg|ftA7NOOxG|WU58SBDPP8|QtYfpt1yoE|Multiple+environments|mmpGUzg6o1|No+code+change+goes+directly+into+a+production+environment.+Webiny+CLI+makes+it+easy+to+manage+and+create+multiple+environments+for+your+project.
|wYK9BhaanZ|100%25|125px|ur1DQFl5BR|TzBvXtU2PH|-PU3iBlQ4|A6sNR3MR-5|Xtqk_itss|602281486ed41f0008bc2dad|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png|495px|bsKTDygik|ev9nhHISRw|1BBr9ACuM|One+size+doesn\'t+fit+all|0olguTqDN|It\'s+a+very+different+set+of+requirements+a+technical+team+has+to+a+marketing+team+to+a+business+development+team.+Webiny+Serverless+CMS+comes+with+several+different+apps+you+can+use+independently,+or+together+as+part+of+a+cohesive+solution.
|BhnYb3VW7D|QYZ290WhC|rgba(238,+238,+238,+1)|ER2SFYwbeK|gZp3Hxm5Js|602281486639200009fd35eb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg|FsOaMudE8|ElruSYJxWM|Webiny+Serverless+

CMS|9HJcM89Am|8Cp2ZC30_H|qrS5wswdQ|heading5|h5|A+suite+of+applications+to+help+you+manage+your+content.+|pLUutc-E2|MGlDcu91q_|A6rStUekq|Use+it+to+build:|jIdakfVZU|5JHsGc_Rq-|SNOFqUK6lI|

    \n++++++++++++++++++++
  • Marketing+sites
  • \n++++++++++++++++++++
  • Multi-website+solutions
  • \n++++++++++++++++++++
  • Content+hubs
  • \n++++++++++++++++
|96dJBnIlc|5cPfb7AwXH|
    \n++++++++++++++++++++
  • Multi-language+sites
  • \n++++++++++++++++++++
  • Intranet+portals
  • \n++++++++++++++++++++
  • Headless+content+models
  • \n++++++++++++++++
|L4dFyzBKMM|Learn+more|https://www.webiny.com/serverless-cms/||mjmNmloeUS|100%25|220px|602281486639200009fd35ec|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg|xUkOEAm5X3|Kgr1ambSuG|AP_uTrgLZ|CMS+benefits|juBaAPJ76|4-4-4|s95PSAToXK|35px|ZECp8jcZD|60228148fa244d0008c47c79|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg|146px|EyKog1RmH|Scalable|_8lCcwhUN|No+matter+the+demand,+Webiny+Serverless+CMS+can+easily+scale+to+meet+even+the+most+challenging+workloads.
|SmrEQ9OZ8|QWM8cmlQEM|60228145f98841000981c720|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg|TYx-A5YCI|Adaptable|SsbWKZz_Z|Being+an+open-source+project,+it\'s+easy+to+modify+and+adapt+things+to+your+own+needs.
|gqdtbKfv7l|jBWaxzt-4|6022814851197600081724ae|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg|NLSOIstf9|Low+cost+of+ownership|kI-neIjkXx|Self-hosted+on+top+of+serverless+infrastructure.+No+infrastructure+to+mange,+less+people+required+to+operate+and+maintain.
|V14HHGmXN|-djsQadY-8|pTVeVoKkTi|bM5b8O7IMY|Secure|l9PuI-TdVA|Secured+by+AWS+Cognito.+It\'s+also+easy+to+integrate+services+like+OKTA,+Auth0+and+similar.
|N1lW0cAasg|W-ub9guhLt|602281486ed41f0008bc2dac|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg|DVhLZfrM53|Data+ownership|shmIumNfIu|Webiny+is+self-hosted,+it+means+your+data+stays+within+your+data+center.+
|8F7J_16a46|2gtT4Mfw6c|602281486ed41f0008bc2dab|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg|5EMJkVWgKW|Permission+control|cdSOjFAWkf|Powerful+options+to+control+the+permissions+your+users+will+have.+They+perfectly+align+with+your+business+requirements. 
|5ggqk561Ka|100%25|C6B8QfkUXs|ChF1iOAbtb|7tRfsJ_SEz|Serverless+makes+infrastructure+easy,+

Webiny+makes+serverless+easy|oYf9t6Uwz|RdazJP-4W1|7jBNW1iTi|60228145f98841000981c721|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg|200px|npNMgLft0|1.+Developer-friendly|DpubDRaGQ|Webiny+has+been+made+with+the+developer+in+mind.+It+helps+them+develop+serverless+applications+with+ease.
|KbQocaayR|KDO-Ja7wS|60228145f98841000981c71f|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg|ETll3nkV4|2.+Open+source|UWPjvO7EC|Webiny+is+created+and+maintained+by+an+amazing+group+of+people.+Being+open+source+means+Webiny+grows+and+evolves+much+faster.+Contributor+are+welcome.
|En4soRn06o|fqxeYbEV4|60228148fa244d0008c47c7a|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png|276px|e5v0LBbfz|3.+Community|p9FWp5yqUy|We+have+an+active+community+on+slack.+Talk+to+the+core-team,+and+get+help.+Webiny+team+is+always+there+for+any+questions.
|OYp5Z-6Xo|woaE-6v5bN|Y8ndbn88hy|View+Webiny+on+GitHub|https://github.com/webiny/webiny-js|secondary|fab|github|^C|C|C|6|6|6|6|C|6|3|9|C|C|6|6|C|6|C|C|C|3|C|C|3|C|C|3|C|C|3|C|C|6|C|C|6|3|9|C|C|6|6|C|4|4|4|4|4|4|C|4|4|4|C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|O|I|P|G|P]|Q|$J|-1|I|M|G|M]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|Y|Z|10]]]]]]|6|@$0|11|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BC]]]|6|@$0|1F|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|1G|Z|1H]|1I|1J]]|6|@]]]]]]|$0|1K|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1L|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BD]]]|6|@$0|1M|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|1V]|4|$1O|1W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|1X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|1Y|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1Z|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BE]]]|6|@$0|20|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|1V]|4|$1O|24]]|5|$D|$A|$L|F]]|K|$A|$L|F|J|-1|I|25|G|26]|Q|$I|F|G|F|J|-1]]]]|6|@]]]]]]|$0|27|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]|Q|$I|2C]]|K|$A|$L|F]]|12|$1E|BF]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2F|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2I]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2J|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2L]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BG]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2O|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2Q|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|2S|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]|1A|$J|-2]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2T|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]]|K|$A|$L|F]]|12|$1E|BH]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2U|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2V]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2W|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2X]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|Q|$J|-1|I|2N|E|F]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BI]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2Z|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|30]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|31|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|32]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|33|2|8|4|$5|$9|$A|$B|34]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|35|H|36|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|37|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|38|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|39|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BJ]]]|6|@$0|3A|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|3C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|3D|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|S|1S|3F|1U|3B]|4|$1O|3G]]|5|$D|$A|$L|F|J|-1|E|P]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|3H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|3I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|BK]]]|6|@$0|3L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|S]|3N|$A|$3O|3P|1U|3Q|9|$L|3R|J|-1|H|3R]]]]]|6|@$0|3S|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BL]]]|6|@$0|3T|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|3U|Z|3V]|1I|3W]|3X|$]]|6|@]]]]|$0|3Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BM]]]|6|@$0|3Z|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41|1U|3B]|4|$1O|42]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|43|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|44|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BN]]]|6|@$0|45|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|46]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|47|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|P|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|48|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BO]]]|6|@$0|49|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|4C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4D|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4E|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BP]]]|6|@$0|4F|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4H]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|4I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BQ]]]|6|@$0|4J|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BR]]]|6|@$0|4N|2|4O|4|$4P|4Q|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|4T|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|50|51|G|9|52]]|6|@]]]]]]]]|$0|53|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$E|F|G|F|H|F|I|F|L|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|BS]]]|6|@$0|54|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|55|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BT]]]|6|@$0|56|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|57|Z|58]]|3X|$]]|6|@]]]]]]|$0|59|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BU]]]|6|@$0|5B|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|5C]]|5|$D|$A|$L|F|J|-1]]|K|$A|$L|F]]]]|6|@]]|$0|5D|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|5E]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]]]]]|$0|5F|2|8|4|$5|$9|$A|$B|5G]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|5H|G|P|H|5I|I|P|J|-1]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|5J|Z|5K]]]]]]|6|@$0|5L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|5M|I|F|J|-1]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BV]]]|6|@$0|5O|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|5P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|5Q|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|5R]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5S|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|5T]|1A|$I|5T|J|-1]]|12|$1E|BW]]]|6|@$0|5U|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5V|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BX]]]|6|@$0|5W|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|5X|Z|5Y]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|60|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|61|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BY]]]|6|@$0|62|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|63]]|5|$D|$A|$L|F|J|-1|H|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|64|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|65]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|66|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|BZ]]]|6|@$0|67|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|68|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C0]]]|6|@$0|69|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6A|Z|6B]|1I|5Z]]|6|@]]]]]]|$0|6C|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6D|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C1]]]|6|@$0|6E|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6G|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6H]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|C2]]]|6|@$0|6J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6K|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C3]]]|6|@$0|6L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|6O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6P|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C4]]]|6|@$0|6Q|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6S|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6T]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|5T]|1A|$G|5T|J|-1]]|12|$1E|C5]]]|6|@$0|6V|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6W|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C6]]]|6|@$0|6X|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6Y|Z|6Z]|1I|5Z]]|6|@]]]]]]|$0|70|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|71|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C7]]]|6|@$0|72|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|73]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|74|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|75]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|76|2|8|4|$5|$9|$A|$B|77]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|78|G|P|H|36|I|P|J|-1]]|R|$A|S]|T|$A|U]]]|6|@$0|79|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7A|2|1D|4|$5|$D|$A|$E|F|G|F|H|38|I|F|J|-1]|1A|$J|-1]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|C8]]]|6|@$0|7B|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C9]]]|6|@$0|7D|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7E|Z|7F]|9|7G]]|6|@]]]]]]|$0|7H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CA]]]|6|@$0|7J|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|7K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7L|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|7M]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|7N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|CB]]]|6|@$0|7O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]|3N|$A|$3O|3P|1U|7P|9|$J|-1|H|3R]]]]]|6|@$0|7Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CC]]]|6|@$0|7R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7S|Z|7T]|1I|3W]|3X|$]]|6|@]]]]|$0|7U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CD]]]|6|@$0|7V|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41]|4|$1O|7W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CE]]]|6|@$0|7Z|2|1N|4|$1O|$A|$2|1N|1P|80|1R|I|1S|81|1U|3B]|4|$1O|82]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|83|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|4R|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|84|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CF]]]|6|@$0|85|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|86]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|87|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|88|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CG]]]|6|@$0|89|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8A]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|8B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CH]]]|6|@$0|8C|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8D]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8E|2|4O|4|$4P|8F|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|8G|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|8H|51|G|9|52]]|6|@]]]]]]]]|$0|8I|2|8|4|$5|$9|$A|$B|8J]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|38|H|8K|I|P|G|P]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|8L|Z|8M]]]]]]|6|@$0|8N|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|5H|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8O|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CI]]]|6|@$0|8P|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|8Q]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8R|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8T|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|G|8U|I|8U]]|12|$1E|CJ]]]|6|@$0|8V|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|8W|Z|8X]|1I|8Y]|3X|$]]|6|@]]|$0|8Z|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|90]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|91|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|92]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|93|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CK]]]|6|@$0|94|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|95|Z|96]|1I|8Y]|3X|$]]|6|@]]|$0|97|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|98]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|99|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9A]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CL]]]|6|@$0|9C|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9D|Z|9E]|1I|8Y]|3X|$]]|6|@]]|$0|9F|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9G]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9H|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9I]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|9J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|5H|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|9K|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|I|8U]]|12|$1E|CM]]]|6|@$0|9L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|8Y]|3X|$]]|6|@]]|$0|9M|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9N]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9O|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9P]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CN]]]|6|@$0|9R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9S|Z|9T]|1I|8Y]|3X|$]]|6|@]]|$0|9U|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9V]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9W|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23]|4|$1O|9X]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CO]]]|6|@$0|9Z|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|A0|Z|A1]|1I|8Y]|3X|$]]|6|@]]|$0|A2|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|A3]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|A4|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|A5]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|A6|2|8|4|$5|$9|$A|$B|A7]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|N|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|A8|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|A9|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CP]]]|6|@$0|AA|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|AB]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|AC|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|38|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|AD|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|4R]|1A|$G|4R|J|-1|I|4R]]|12|$1E|CQ]]]|6|@$0|AE|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AF|Z|AG]|1I|AH]|3X|$]]|6|@]]|$0|AI|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AJ]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AK|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AL]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AM|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|4R|G|4R]]|12|$1E|CR]]]|6|@$0|AN|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AO|Z|AP]|1I|AH]|3X|$]]|6|@]]|$0|AQ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AR]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AS|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AT]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AU|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|4R]]|K|$A|$L|F|J|-1|I|4R]|1A|$J|-1|I|4R|G|4R]]|12|$1E|CS]]]|6|@$0|AV|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AW|Z|AX]|1I|AH|9|AY]|3X|$]]|6|@]]|$0|AZ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|B0]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|B1|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|B2]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|B3|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|3J|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|B4|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CT]]]|6|@$0|B5|2|4O|4|$4P|B6|5|$D|$A|$L|F]]|R|$A|S]]|3X|$4S|B7|4U|-1]|2|B8|4W|$0|@B9|BA]|4Z|BB|9|52]]|6|@]]]]]]]]]]' + }, + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.947Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5b#0001", + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/welcome-to-webiny", + pid: "658c1bd3c39bb10008431b5b", + publishedOn: "2023-12-27T12:43:00.723Z", + savedOn: "2023-12-27T12:43:00.723Z", + settings: { + general: { + layout: "static" + }, + seo: { + meta: [] + }, + social: { + meta: [] + } + }, + status: "published", + tenant: "root", + title: "Welcome to Webiny", + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#PB#P#658c1bd3c39bb10008431b5b", + SK: "REV#0001", + TYPE: "pb.page", + _ct: "2023-12-27T12:43:00.864Z", + _et: "PbPages", + _md: "2023-12-27T12:43:00.864Z", + category: "static", + content: { + compression: "jsonpack", + content: + 'id|Fv1PpPWu-|type|document|data|settings|elements|xqt7BI4iN9|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|100px|275px|16px|tablet|horizontalAlignFlex|center|verticalAlign|flex-start|background|image|file|6022814b7a77e60008f70d62|src|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg|gdE7Q7rcA|grid|1100px|20px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|_fbQO4Nlpp|cell|size|cdk_pclqE|6022814b0df4b000088735bc|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg|height|44px|ovLRNqyVu3|wmMU13uZ10|1eUZzAvoB|heading|text|typography|heading1|alignment|tag|h1|color|color6|Welcome+to+Webiny|F6ZREnQcc|64px|oEgjDLVXUu|0xYOozhJw|paragraph|paragraph1|div|Webiny+makes+it+easy+to+build+applications+and+websites+on+top+of+the+serverless+infrastructure+by+providing+you+with+a+ready-made+CMS+and+a+development+framework.
|20%25|20%25|gwhTOrZvc|30px|6-6|EaIMtHtOIw|-8px|px|602282e07a77e60008f70d63|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg|8k7zxQUTm|heading6|h6|Scalable|qNngQ1C-5|paragraph2|Webiny+apps+can+scale+to+handle+the+most+demanding+workloads.
|uBv_VRv0i|8px|iQaW4vjKg|No+custom+tooling+required|Wy3Tw-Lb8|Webiny+eliminates+the+need+to+build+custom+tooling+to+create+serverless+app
|uwrjoSZkB|Q39eQZm_8z|zSVZIwnSQ0|Cost+effective|S-Ydr4kX6k|Webiny+apps+run+on+serverless+infrastructure+which+costs+80%25+less+than+VMs
|nUX2JXYjhD|8z0hL8l7ay|Resolves+serverless+challenges|04ZNIcAGE_|Webiny+removes+all+the+challenges+of+building+serverless+applications
|vm0cFfH8KG|100%25|65px|75px|txeqybzKr3|80px|wMjC2uv8cj|Pm7ws20iA|color3|Get+to+know+Webiny+products|6CPpd558B|heading2|h2|Architect.+Code.+Deploy.|1e0_OJgMx|gpYd80MXeg|40px|15px|kAYc-QClR|4-8|border|style|solid|rgba(229,+229,+229,+1)|1|8i803wClVt|p55J-BkDn|6022814a0df4b000088735bb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg|90px|link|8nddxG64r|PR-yiR65n|heading3|h3|Webiny+Serverless+

Application+Framework|pVH9_fFLM|x0SSJvgrdD|b0iE8vr2S|Everything+you+need+to+create+and+deploy+applications+on+top+of+the+serverless+infrastructure. 
|JMSKwWsT_|OU70Y990tA|T_M_Ww4Wb|heading4|h4|Use+it+to+build:|806nmKOyc|g59JmcyM-7|Cyziie_SK|list|

    \n++++++++++++++++++++
  • Full-stack+applications
  • Multi-tenant+solutions
  • \n++++++++++++++++
|ST0O1ZeCk|ILrAABWXiX|
    \n++++++++++++++++++++
  • APIs
  • Microservice
  • \n++++++++++++++++
|XxXGeIywO|9H5t3COdbo|mc0_RS9rg|button|buttonText|Learn+more|50px|href|https://www.webiny.com/serverless-application-framework/|newTab|primary|icon|fas|long-arrow-alt-right|svg||position|16|Kg3rMc1Re|LAcQHMs8K|8oaRz-Gko_|9fQ9W-xiB|6022814891bd1300087bd24c|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg|YCG34DB89|xvBXD_QTkN|GqW2LBMzV|An+easier+way+to+build+serverless+apps|9cWYQwXUd|There+are+many+solutions+that+help+you+run,+deploy+and+monitor+serverless+functions,+but+when+it+comes+to+actually+coding+one,+there+are+none.+Webiny+is+a+solution+that+helps+you+code+your+serverless+app+by+providing+you+with+all+the+components+like+ACL,+routing,+file+storage+and+many+more.
|LxqyquKlYy|100%25|60px|177px|60228148f98841000981c723|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg|yqrzxoDllE|70px|bD-TQmZyW8|4ESAx7NxM|Framework+features|Xr7NLMpzm|3-3-3-3|_RtRioPOsj|12px|mOr47ImJK|AlTNw-76F8|r0e8MiCuK|6022814bef4a940008b3ba27|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg|170px|QFwbqHtSh|DH-C0-mBsO|XSN-oY3V3|Users,+groups,+roles+&+scopes|Unyhp8o-a|Security+is+a+crucial+layer+in+any+application.+Webiny+includes+a+full-featured+security+module+that\'s+connected+to+the+built-in+GraphQL+API.Users,+groups,+roles+&+scopes
|Ntcduee0-|0b66dbGkG|PoRqI9i2xE|0ZpnBSqjoz|6022814bef4a940008b3ba26|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg|FFGobMHHI|IWxl_nrRkr|I5btsZceI|Scaffolding|5qvaQSnP6|Quickly+generate+boilerplate+code+using+CLI+plugins.+From+lambda+functions+to+new+GraphQL+APIs.
|YHUznp7ZM5|PlxqV_uS7B|zKQYI-EIFl|frRuzWpRI|60228148f98841000981c724|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg|M1tvv840H|fwreagGdac|6H1tgEViY|Customizable+security|h0Ctka4TED|Use+the+default+AWS+Cognito,+or+replace+with+3rd+party+identity+providers+like+Okta,+Auth0,+etc.+Using+plugins+you+can+make+Webiny+work+with+any+identity+provider.
|SyyrOA60AF|GvU31fd4U|1vAxZAkD9O|dlI-qhVLKy|6022814bef4a940008b3ba28|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg|ftA7NOOxG|WU58SBDPP8|QtYfpt1yoE|Multiple+environments|mmpGUzg6o1|No+code+change+goes+directly+into+a+production+environment.+Webiny+CLI+makes+it+easy+to+manage+and+create+multiple+environments+for+your+project.
|wYK9BhaanZ|100%25|125px|ur1DQFl5BR|TzBvXtU2PH|-PU3iBlQ4|A6sNR3MR-5|Xtqk_itss|602281486ed41f0008bc2dad|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png|495px|bsKTDygik|ev9nhHISRw|1BBr9ACuM|One+size+doesn\'t+fit+all|0olguTqDN|It\'s+a+very+different+set+of+requirements+a+technical+team+has+to+a+marketing+team+to+a+business+development+team.+Webiny+Serverless+CMS+comes+with+several+different+apps+you+can+use+independently,+or+together+as+part+of+a+cohesive+solution.
|BhnYb3VW7D|QYZ290WhC|rgba(238,+238,+238,+1)|ER2SFYwbeK|gZp3Hxm5Js|602281486639200009fd35eb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg|FsOaMudE8|ElruSYJxWM|Webiny+Serverless+

CMS|9HJcM89Am|8Cp2ZC30_H|qrS5wswdQ|heading5|h5|A+suite+of+applications+to+help+you+manage+your+content.+|pLUutc-E2|MGlDcu91q_|A6rStUekq|Use+it+to+build:|jIdakfVZU|5JHsGc_Rq-|SNOFqUK6lI|

    \n++++++++++++++++++++
  • Marketing+sites
  • \n++++++++++++++++++++
  • Multi-website+solutions
  • \n++++++++++++++++++++
  • Content+hubs
  • \n++++++++++++++++
|96dJBnIlc|5cPfb7AwXH|
    \n++++++++++++++++++++
  • Multi-language+sites
  • \n++++++++++++++++++++
  • Intranet+portals
  • \n++++++++++++++++++++
  • Headless+content+models
  • \n++++++++++++++++
|L4dFyzBKMM|Learn+more|https://www.webiny.com/serverless-cms/||mjmNmloeUS|100%25|220px|602281486639200009fd35ec|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg|xUkOEAm5X3|Kgr1ambSuG|AP_uTrgLZ|CMS+benefits|juBaAPJ76|4-4-4|s95PSAToXK|35px|ZECp8jcZD|60228148fa244d0008c47c79|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg|146px|EyKog1RmH|Scalable|_8lCcwhUN|No+matter+the+demand,+Webiny+Serverless+CMS+can+easily+scale+to+meet+even+the+most+challenging+workloads.
|SmrEQ9OZ8|QWM8cmlQEM|60228145f98841000981c720|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg|TYx-A5YCI|Adaptable|SsbWKZz_Z|Being+an+open-source+project,+it\'s+easy+to+modify+and+adapt+things+to+your+own+needs.
|gqdtbKfv7l|jBWaxzt-4|6022814851197600081724ae|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg|NLSOIstf9|Low+cost+of+ownership|kI-neIjkXx|Self-hosted+on+top+of+serverless+infrastructure.+No+infrastructure+to+mange,+less+people+required+to+operate+and+maintain.
|V14HHGmXN|-djsQadY-8|pTVeVoKkTi|bM5b8O7IMY|Secure|l9PuI-TdVA|Secured+by+AWS+Cognito.+It\'s+also+easy+to+integrate+services+like+OKTA,+Auth0+and+similar.
|N1lW0cAasg|W-ub9guhLt|602281486ed41f0008bc2dac|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg|DVhLZfrM53|Data+ownership|shmIumNfIu|Webiny+is+self-hosted,+it+means+your+data+stays+within+your+data+center.+
|8F7J_16a46|2gtT4Mfw6c|602281486ed41f0008bc2dab|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg|5EMJkVWgKW|Permission+control|cdSOjFAWkf|Powerful+options+to+control+the+permissions+your+users+will+have.+They+perfectly+align+with+your+business+requirements. 
|5ggqk561Ka|100%25|C6B8QfkUXs|ChF1iOAbtb|7tRfsJ_SEz|Serverless+makes+infrastructure+easy,+

Webiny+makes+serverless+easy|oYf9t6Uwz|RdazJP-4W1|7jBNW1iTi|60228145f98841000981c721|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg|200px|npNMgLft0|1.+Developer-friendly|DpubDRaGQ|Webiny+has+been+made+with+the+developer+in+mind.+It+helps+them+develop+serverless+applications+with+ease.
|KbQocaayR|KDO-Ja7wS|60228145f98841000981c71f|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg|ETll3nkV4|2.+Open+source|UWPjvO7EC|Webiny+is+created+and+maintained+by+an+amazing+group+of+people.+Being+open+source+means+Webiny+grows+and+evolves+much+faster.+Contributor+are+welcome.
|En4soRn06o|fqxeYbEV4|60228148fa244d0008c47c7a|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png|276px|e5v0LBbfz|3.+Community|p9FWp5yqUy|We+have+an+active+community+on+slack.+Talk+to+the+core-team,+and+get+help.+Webiny+team+is+always+there+for+any+questions.
|OYp5Z-6Xo|woaE-6v5bN|Y8ndbn88hy|View+Webiny+on+GitHub|https://github.com/webiny/webiny-js|secondary|fab|github|^C|C|C|6|6|6|6|C|6|3|9|C|C|6|6|C|6|C|C|C|3|C|C|3|C|C|3|C|C|3|C|C|6|C|C|6|3|9|C|C|6|6|C|4|4|4|4|4|4|C|4|4|4|C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|O|I|P|G|P]|Q|$J|-1|I|M|G|M]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|Y|Z|10]]]]]]|6|@$0|11|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BC]]]|6|@$0|1F|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|1G|Z|1H]|1I|1J]]|6|@]]]]]]|$0|1K|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1L|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BD]]]|6|@$0|1M|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|1V]|4|$1O|1W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|1X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|1Y|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1Z|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BE]]]|6|@$0|20|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|1V]|4|$1O|24]]|5|$D|$A|$L|F]]|K|$A|$L|F|J|-1|I|25|G|26]|Q|$I|F|G|F|J|-1]]]]|6|@]]]]]]|$0|27|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]|Q|$I|2C]]|K|$A|$L|F]]|12|$1E|BF]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2F|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2I]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2J|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2L]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BG]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2O|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2Q|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|2S|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]|1A|$J|-2]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2T|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]]|K|$A|$L|F]]|12|$1E|BH]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2U|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2V]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2W|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2X]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|Q|$J|-1|I|2N|E|F]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BI]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2Z|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|30]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|31|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|32]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|33|2|8|4|$5|$9|$A|$B|34]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|35|H|36|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|37|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|38|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|39|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BJ]]]|6|@$0|3A|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|3C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|3D|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|S|1S|3F|1U|3B]|4|$1O|3G]]|5|$D|$A|$L|F|J|-1|E|P]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|3H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|3I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|BK]]]|6|@$0|3L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|S]|3N|$A|$3O|3P|1U|3Q|9|$L|3R|J|-1|H|3R]]]]]|6|@$0|3S|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BL]]]|6|@$0|3T|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|3U|Z|3V]|1I|3W]|3X|$]]|6|@]]]]|$0|3Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BM]]]|6|@$0|3Z|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41|1U|3B]|4|$1O|42]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|43|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|44|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BN]]]|6|@$0|45|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|46]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|47|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|P|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|48|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BO]]]|6|@$0|49|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|4C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4D|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4E|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BP]]]|6|@$0|4F|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4H]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|4I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BQ]]]|6|@$0|4J|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BR]]]|6|@$0|4N|2|4O|4|$4P|4Q|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|4T|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|50|51|G|9|52]]|6|@]]]]]]]]|$0|53|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$E|F|G|F|H|F|I|F|L|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|BS]]]|6|@$0|54|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|55|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BT]]]|6|@$0|56|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|57|Z|58]]|3X|$]]|6|@]]]]]]|$0|59|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BU]]]|6|@$0|5B|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|5C]]|5|$D|$A|$L|F|J|-1]]|K|$A|$L|F]]]]|6|@]]|$0|5D|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|5E]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]]]]]|$0|5F|2|8|4|$5|$9|$A|$B|5G]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|5H|G|P|H|5I|I|P|J|-1]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|5J|Z|5K]]]]]]|6|@$0|5L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|5M|I|F|J|-1]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BV]]]|6|@$0|5O|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|5P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|5Q|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|5R]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5S|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|5T]|1A|$I|5T|J|-1]]|12|$1E|BW]]]|6|@$0|5U|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5V|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BX]]]|6|@$0|5W|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|5X|Z|5Y]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|60|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|61|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BY]]]|6|@$0|62|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|63]]|5|$D|$A|$L|F|J|-1|H|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|64|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|65]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|66|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|BZ]]]|6|@$0|67|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|68|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C0]]]|6|@$0|69|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6A|Z|6B]|1I|5Z]]|6|@]]]]]]|$0|6C|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6D|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C1]]]|6|@$0|6E|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6G|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6H]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|C2]]]|6|@$0|6J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6K|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C3]]]|6|@$0|6L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|6O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6P|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C4]]]|6|@$0|6Q|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6S|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6T]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|5T]|1A|$G|5T|J|-1]]|12|$1E|C5]]]|6|@$0|6V|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6W|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C6]]]|6|@$0|6X|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6Y|Z|6Z]|1I|5Z]]|6|@]]]]]]|$0|70|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|71|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C7]]]|6|@$0|72|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|73]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|74|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|75]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|76|2|8|4|$5|$9|$A|$B|77]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|78|G|P|H|36|I|P|J|-1]]|R|$A|S]|T|$A|U]]]|6|@$0|79|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7A|2|1D|4|$5|$D|$A|$E|F|G|F|H|38|I|F|J|-1]|1A|$J|-1]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|C8]]]|6|@$0|7B|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C9]]]|6|@$0|7D|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7E|Z|7F]|9|7G]]|6|@]]]]]]|$0|7H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CA]]]|6|@$0|7J|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|7K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7L|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|7M]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|7N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|CB]]]|6|@$0|7O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]|3N|$A|$3O|3P|1U|7P|9|$J|-1|H|3R]]]]]|6|@$0|7Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CC]]]|6|@$0|7R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7S|Z|7T]|1I|3W]|3X|$]]|6|@]]]]|$0|7U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CD]]]|6|@$0|7V|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41]|4|$1O|7W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CE]]]|6|@$0|7Z|2|1N|4|$1O|$A|$2|1N|1P|80|1R|I|1S|81|1U|3B]|4|$1O|82]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|83|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|4R|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|84|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CF]]]|6|@$0|85|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|86]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|87|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|88|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CG]]]|6|@$0|89|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8A]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|8B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CH]]]|6|@$0|8C|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8D]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8E|2|4O|4|$4P|8F|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|8G|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|8H|51|G|9|52]]|6|@]]]]]]]]|$0|8I|2|8|4|$5|$9|$A|$B|8J]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|38|H|8K|I|P|G|P]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|8L|Z|8M]]]]]]|6|@$0|8N|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|5H|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8O|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CI]]]|6|@$0|8P|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|8Q]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8R|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8T|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|G|8U|I|8U]]|12|$1E|CJ]]]|6|@$0|8V|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|8W|Z|8X]|1I|8Y]|3X|$]]|6|@]]|$0|8Z|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|90]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|91|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|92]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|93|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CK]]]|6|@$0|94|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|95|Z|96]|1I|8Y]|3X|$]]|6|@]]|$0|97|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|98]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|99|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9A]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CL]]]|6|@$0|9C|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9D|Z|9E]|1I|8Y]|3X|$]]|6|@]]|$0|9F|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9G]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9H|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9I]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|9J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|5H|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|9K|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|I|8U]]|12|$1E|CM]]]|6|@$0|9L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|8Y]|3X|$]]|6|@]]|$0|9M|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9N]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9O|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9P]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CN]]]|6|@$0|9R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9S|Z|9T]|1I|8Y]|3X|$]]|6|@]]|$0|9U|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9V]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9W|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23]|4|$1O|9X]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CO]]]|6|@$0|9Z|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|A0|Z|A1]|1I|8Y]|3X|$]]|6|@]]|$0|A2|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|A3]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|A4|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|A5]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|A6|2|8|4|$5|$9|$A|$B|A7]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|N|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|A8|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|A9|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CP]]]|6|@$0|AA|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|AB]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|AC|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|38|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|AD|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|4R]|1A|$G|4R|J|-1|I|4R]]|12|$1E|CQ]]]|6|@$0|AE|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AF|Z|AG]|1I|AH]|3X|$]]|6|@]]|$0|AI|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AJ]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AK|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AL]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AM|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|4R|G|4R]]|12|$1E|CR]]]|6|@$0|AN|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AO|Z|AP]|1I|AH]|3X|$]]|6|@]]|$0|AQ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AR]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AS|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AT]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AU|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|4R]]|K|$A|$L|F|J|-1|I|4R]|1A|$J|-1|I|4R|G|4R]]|12|$1E|CS]]]|6|@$0|AV|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AW|Z|AX]|1I|AH|9|AY]|3X|$]]|6|@]]|$0|AZ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|B0]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|B1|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|B2]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|B3|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|3J|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|B4|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CT]]]|6|@$0|B5|2|4O|4|$4P|B6|5|$D|$A|$L|F]]|R|$A|S]]|3X|$4S|B7|4U|-1]|2|B8|4W|$0|@B9|BA]|4Z|BB|9|52]]|6|@]]]]]]]]]]' + }, + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.947Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5b#0001", + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/welcome-to-webiny", + pid: "658c1bd3c39bb10008431b5b", + publishedOn: "2023-12-27T12:43:00.723Z", + savedOn: "2023-12-27T12:43:00.723Z", + settings: { + general: { + layout: "static" + }, + seo: { + meta: [] + }, + social: { + meta: [] + } + }, + status: "published", + tenant: "root", + title: "Welcome to Webiny", + version: 1, + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "T#root", + GSI1_SK: "TYPE#group#IDENTITY#658c1b73c39bb10008431b44", + PK: "IDENTITY#658c1b73c39bb10008431b44", + SK: "LINK#T#root", + _ct: "2023-12-27T12:41:24.428Z", + _et: "SecurityIdentity2Tenant", + _md: "2023-12-27T12:41:24.428Z", + createdOn: "2023-12-27T12:41:24.428Z", + data: { + groups: [ + { + id: "658c1b60c39bb10008431b42", + permissions: [ + { + name: "*" + } + ] + } + ], + teams: [] + }, + identity: "658c1b73c39bb10008431b44", + tenant: "root", + type: "group", + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba26", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.041Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814bef4a940008b3ba26", + id: "6022814bef4a940008b3ba26#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.041Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 33888, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg", + "text@name": "scaffolding.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba26", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.023Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814bef4a940008b3ba26", + id: "6022814bef4a940008b3ba26#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.023Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 33888, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg", + "text@name": "scaffolding.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "T#root#PS#RENDER", + GSI1_SK: "/not-found", + PK: "T#root#PS#RENDER#/not-found", + SK: "A", + TYPE: "ps.render", + _ct: "2023-12-27T12:43:23.802Z", + _et: "PrerenderingServiceRender", + _md: "2023-12-27T12:43:23.802Z", + data: { + files: [ + { + meta: { + tags: [ + { + key: "pb-page", + value: "658c1bd3c39bb10008431b5c#0001" + }, + { + key: "pb-menu", + value: "main-menu" + } + ] + }, + name: "index.html", + type: "text/html" + }, + { + meta: {}, + name: "graphql.json", + type: "application/json" + } + ], + locale: "en-US", + path: "/not-found", + tags: [ + { + key: "notFoundPage", + value: true + } + ], + tenant: "root" + } + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814851197600081724ae", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.122Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814851197600081724ae", + id: "6022814851197600081724ae#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.122Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 60602, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg", + "text@name": "cost-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814851197600081724ae", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.121Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814851197600081724ae", + id: "6022814851197600081724ae#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.121Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 60602, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg", + "text@name": "cost-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CMG", + SK: "658c1bcbc39bb10008431b45", + TYPE: "cms.group", + _ct: "2023-12-27T12:42:51.962Z", + _et: "CmsGroups", + _md: "2023-12-27T12:42:51.962Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:51.921Z", + description: "A generic content model group", + icon: "fas/star", + id: "658c1bcbc39bb10008431b45", + locale: "en-US", + name: "Ungrouped", + savedOn: "2023-12-27T12:42:51.921Z", + slug: "ungrouped", + tenant: "root", + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814a0df4b000088735bb", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:58.964Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814a0df4b000088735bb", + id: "6022814a0df4b000088735bb#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:58.964Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 3661, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg", + "text@name": "webiny-serverless-application-framework.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814a0df4b000088735bb", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:58.964Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814a0df4b000088735bb", + id: "6022814a0df4b000088735bb#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:58.964Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 3661, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg", + "text@name": "webiny-serverless-application-framework.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "T#root#PS#RENDER", + GSI1_SK: "/welcome-to-webiny", + PK: "T#root#PS#RENDER#/welcome-to-webiny", + SK: "A", + TYPE: "ps.render", + _ct: "2023-12-27T12:43:14.831Z", + _et: "PrerenderingServiceRender", + _md: "2023-12-27T12:43:14.832Z", + data: { + files: [ + { + meta: { + tags: [ + { + key: "pb-page", + value: "658c1bd3c39bb10008431b5b#0001" + }, + { + key: "pb-menu", + value: "main-menu" + } + ] + }, + name: "index.html", + type: "text/html" + }, + { + meta: {}, + name: "graphql.json", + type: "application/json" + } + ], + locale: "en-US", + path: "/welcome-to-webiny", + tenant: "root" + } + }, + { + PK: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T13:20:12.835Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:11.821Z", + entity: "CmsEntries", + entryId: "658c248b6607be00087f1166", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:12.775Z", + id: "658c248b6607be00087f1166#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:12.775Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modified: "2023-12-27T13:20:12.835Z", + + // We've deliberately removed the `ownedBy` field here, just so we can see how + // the data migration code will behave / what operations will be performed on the record. + // ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + + publishedOn: "2023-12-27T13:20:12.775Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:11.821Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:12.775Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:12.775Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:12.775Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:12.775Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAQArKdlkBgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166", + SK: "P", + TYPE: "cms.entry.p", + created: "2023-12-27T13:20:12.803Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:11.821Z", + entity: "CmsEntries", + entryId: "658c248b6607be00087f1166", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:12.775Z", + id: "658c248b6607be00087f1166#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:12.775Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modified: "2023-12-27T13:20:12.803Z", + + // We've deliberately removed the `ownedBy` field here, just so we can see how + // the data migration code will behave / what operations will be performed on the record. + // ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + + publishedOn: "2023-12-27T13:20:12.775Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:11.821Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:12.775Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:12.775Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:12.775Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:12.775Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAQArKdlkBgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c248b6607be00087f1166", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T13:20:12.803Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:11.821Z", + entity: "CmsEntries", + entryId: "658c248b6607be00087f1166", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:12.775Z", + id: "658c248b6607be00087f1166#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:12.775Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modified: "2023-12-27T13:20:12.803Z", + + // We've deliberately removed the `ownedBy` field here, just so we can see how + // the data migration code will behave / what operations will be performed on the record. + // ownedBy: { type: "admin", displayName: "ad min", id: "658c1b73c39bb10008431b44" }, + + publishedOn: "2023-12-27T13:20:12.775Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:11.821Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:12.775Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:12.775Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:12.775Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:12.775Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAQArKdlkBgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c723", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.004Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228148f98841000981c723", + id: "60228148f98841000981c723#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.004Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 390, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg", + "text@name": "pink-shape.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c723", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.004Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228148f98841000981c723", + id: "60228148f98841000981c723#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.004Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 390, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg", + "text@name": "pink-shape.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35eb", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.065Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602281486639200009fd35eb", + id: "602281486639200009fd35eb#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.065Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 1758, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg", + "text@name": "serverless-cms-logo.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35eb", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.065Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602281486639200009fd35eb", + id: "602281486639200009fd35eb#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.065Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 1758, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg", + "text@name": "serverless-cms-logo.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814891bd1300087bd24c", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:58.984Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814891bd1300087bd24c", + id: "6022814891bd1300087bd24c#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:58.984Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 90163, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg", + "text@name": "webiny-infrastructure-overview.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814891bd1300087bd24c", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:58.984Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814891bd1300087bd24c", + id: "6022814891bd1300087bd24c#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:58.984Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 90163, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg", + "text@name": "webiny-infrastructure-overview.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c71f", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.281Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228145f98841000981c71f", + id: "60228145f98841000981c71f#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.281Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 30007, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg", + "text@name": "octo-cat.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228145f98841000981c71f", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.281Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228145f98841000981c71f", + id: "60228145f98841000981c71f#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.281Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 30007, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg", + "text@name": "octo-cat.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35ec", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.081Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602281486639200009fd35ec", + id: "602281486639200009fd35ec#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.081Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 392, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg", + "text@name": "cms-benefits-shape.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486639200009fd35ec", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.068Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602281486639200009fd35ec", + id: "602281486639200009fd35ec#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.068Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 392, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg", + "text@name": "cms-benefits-shape.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "T#root#PS#TAG", + GSI1_SK: "pb-page#658c1bd3c39bb10008431b5c#0001#/not-found", + PK: "T#root#PS#TAG#pb-page#658c1bd3c39bb10008431b5c#0001#/not-found", + SK: "658c1bd3c39bb10008431b5c#0001#/not-found", + TYPE: "ps.tagPathLink", + _ct: "2023-12-27T12:43:23.860Z", + _et: "PrerenderingServiceTagPathLink", + _md: "2023-12-27T12:43:23.860Z", + data: { + key: "pb-page", + path: "/not-found", + tenant: "root", + value: "658c1bd3c39bb10008431b5c#0001" + } + }, + { + PK: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T13:22:46.130Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:44.672Z", + entity: "CmsEntries", + entryId: "658c2524adbc1700090e1ad1", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:22:46.091Z", + id: "658c2524adbc1700090e1ad1#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:22:46.091Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelB", + modified: "2023-12-27T13:22:46.130Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:22:46.091Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:44.672Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:22:46.091Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:22:46.091Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:22:46.091Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:22:46.091Z", + status: "published", + tenant: "root", + values: { + "long-text@7c5t8wwa": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBScM0rKapUMAQAaZvoqRgAAAA=" + }, + "text@4dep2w2h": "DDB+ES - Model B Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1", + SK: "P", + TYPE: "cms.entry.p", + created: "2023-12-27T13:22:46.115Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:44.672Z", + entity: "CmsEntries", + entryId: "658c2524adbc1700090e1ad1", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:22:46.091Z", + id: "658c2524adbc1700090e1ad1#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:22:46.091Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelB", + modified: "2023-12-27T13:22:46.115Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:22:46.091Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:44.672Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:22:46.091Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:22:46.091Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:22:46.091Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:22:46.091Z", + status: "published", + tenant: "root", + values: { + "long-text@7c5t8wwa": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBScM0rKapUMAQAaZvoqRgAAAA=" + }, + "text@4dep2w2h": "DDB+ES - Model B Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c2524adbc1700090e1ad1", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T13:22:46.114Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:44.672Z", + entity: "CmsEntries", + entryId: "658c2524adbc1700090e1ad1", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:22:46.091Z", + id: "658c2524adbc1700090e1ad1#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:22:46.091Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelB", + modified: "2023-12-27T13:22:46.114Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:22:46.091Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:44.672Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:22:46.091Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:22:46.091Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:22:46.091Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:22:46.091Z", + status: "published", + tenant: "root", + values: { + "long-text@7c5t8wwa": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBScM0rKapUMAQAaZvoqRgAAAA=" + }, + "text@4dep2w2h": "DDB+ES - Model B Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c79", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.102Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228148fa244d0008c47c79", + id: "60228148fa244d0008c47c79#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.102Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 7806, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg", + "text@name": "scalable-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c79", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.101Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228148fa244d0008c47c79", + id: "60228148fa244d0008c47c79#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.101Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 7806, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg", + "text@name": "scalable-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c724", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.146Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228148f98841000981c724", + id: "60228148f98841000981c724#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.146Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 27878, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg", + "text@name": "idp.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148f98841000981c724", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.146Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228148f98841000981c724", + id: "60228148f98841000981c724#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.146Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 27878, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg", + "text@name": "idp.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "T#root#PS#TAG", + GSI1_SK: "pb-page#658c1bd3c39bb10008431b5b#0001#/", + PK: "T#root#PS#TAG#pb-page#658c1bd3c39bb10008431b5b#0001#/", + SK: "658c1bd3c39bb10008431b5b#0001#/", + TYPE: "ps.tagPathLink", + _ct: "2023-12-27T12:43:19.484Z", + _et: "PrerenderingServiceTagPathLink", + _md: "2023-12-27T12:43:19.484Z", + data: { + key: "pb-page", + path: "/", + tenant: "root", + value: "658c1bd3c39bb10008431b5b#0001" + } + }, + { + PK: "T#root#I18N#L", + SK: "en-US", + _ct: "2023-12-27T12:42:49.523Z", + _et: "I18NLocale", + _md: "2023-12-27T12:42:49.523Z", + code: "en-US", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:48.245Z", + default: true, + tenant: "root", + webinyVersion: "5.38.2" + }, + { + PK: "ADMIN#SETTINGS", + SK: "default", + data: { + appUrl: "https://d3hohw12noi930.cloudfront.net" + } + }, + { + PK: "T#root#L#en-US#PB#PATH", + SK: "/not-found", + TYPE: "pb.page.p.path", + _ct: "2023-12-27T12:43:00.682Z", + _et: "PbPages", + _md: "2023-12-27T12:43:00.682Z", + category: "static", + content: { + compression: "jsonpack", + content: + "id|h0HqpItbGT|type|document|data|settings|elements|ZlkwCyXhhc|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|horizontalAlignFlex|center|verticalAlign|flex-start|pwR8zBN28v|grid|1100px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|6838kMd5Vh|cell|80px|size|iG8DLRffpF|heading|text|typography|heading1|alignment|tag|h1|color|color3|Page+not+found!|9UHkb1nlN1|paragraph|paragraph1|div|Sorry,+but+the+page+you+were+looking+for+could+not+be+found.|PkNZ6zIVWv|button|buttonText|TAKE+ME+HOme|30px|link|href|/|primary^C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|N|$A|O]|P|$A|Q]]]|6|@$0|R|2|S|4|$5|$9|$A|$B|T]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M]]|S|$U|V]|W|$A|$X|Y]|Z|$X|10]]|N|$A|Q]|P|$A|Q]]]|6|@$0|11|2|12|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|E|13]]|S|$14|1U]]]|6|@$0|15|2|16|4|$17|$A|$2|16|18|19|1A|O|1B|1C|1D|1E]|4|$17|1F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|1G|2|1H|4|$17|$A|$2|1H|18|1I|1A|O|1B|1J|1D|1E]|4|$17|1K]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|1L|2|1M|4|$1N|1O|5|$D|$A|$L|F|J|-1|E|1P]]|N|$A|O]]|1Q|$1R|1S]|2|1T]|6|@]]]]]]]]]]" + }, + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.964Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5c#0001", + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/not-found", + pid: "658c1bd3c39bb10008431b5c", + publishedOn: "2023-12-27T12:43:00.663Z", + savedOn: "2023-12-27T12:43:00.663Z", + settings: { + general: { + layout: "static" + }, + seo: { + meta: [] + }, + social: { + meta: [] + } + }, + status: "published", + tenant: "root", + title: "Not Found", + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#PB#PATH", + SK: "/welcome-to-webiny", + TYPE: "pb.page.p.path", + _ct: "2023-12-27T12:43:00.881Z", + _et: "PbPages", + _md: "2023-12-27T12:43:00.881Z", + category: "static", + content: { + compression: "jsonpack", + content: + 'id|Fv1PpPWu-|type|document|data|settings|elements|xqt7BI4iN9|block|width|desktop|value|100%25|margin|top|0px|right|bottom|left|advanced|padding|all|10px|100px|275px|16px|tablet|horizontalAlignFlex|center|verticalAlign|flex-start|background|image|file|6022814b7a77e60008f70d62|src|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg|gdE7Q7rcA|grid|1100px|20px|cellsType|12|gridSettings|flexDirection|row|mobile-landscape|column|_fbQO4Nlpp|cell|size|cdk_pclqE|6022814b0df4b000088735bc|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg|height|44px|ovLRNqyVu3|wmMU13uZ10|1eUZzAvoB|heading|text|typography|heading1|alignment|tag|h1|color|color6|Welcome+to+Webiny|F6ZREnQcc|64px|oEgjDLVXUu|0xYOozhJw|paragraph|paragraph1|div|Webiny+makes+it+easy+to+build+applications+and+websites+on+top+of+the+serverless+infrastructure+by+providing+you+with+a+ready-made+CMS+and+a+development+framework.
|20%25|20%25|gwhTOrZvc|30px|6-6|EaIMtHtOIw|-8px|px|602282e07a77e60008f70d63|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg|8k7zxQUTm|heading6|h6|Scalable|qNngQ1C-5|paragraph2|Webiny+apps+can+scale+to+handle+the+most+demanding+workloads.
|uBv_VRv0i|8px|iQaW4vjKg|No+custom+tooling+required|Wy3Tw-Lb8|Webiny+eliminates+the+need+to+build+custom+tooling+to+create+serverless+app
|uwrjoSZkB|Q39eQZm_8z|zSVZIwnSQ0|Cost+effective|S-Ydr4kX6k|Webiny+apps+run+on+serverless+infrastructure+which+costs+80%25+less+than+VMs
|nUX2JXYjhD|8z0hL8l7ay|Resolves+serverless+challenges|04ZNIcAGE_|Webiny+removes+all+the+challenges+of+building+serverless+applications
|vm0cFfH8KG|100%25|65px|75px|txeqybzKr3|80px|wMjC2uv8cj|Pm7ws20iA|color3|Get+to+know+Webiny+products|6CPpd558B|heading2|h2|Architect.+Code.+Deploy.|1e0_OJgMx|gpYd80MXeg|40px|15px|kAYc-QClR|4-8|border|style|solid|rgba(229,+229,+229,+1)|1|8i803wClVt|p55J-BkDn|6022814a0df4b000088735bb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg|90px|link|8nddxG64r|PR-yiR65n|heading3|h3|Webiny+Serverless+

Application+Framework|pVH9_fFLM|x0SSJvgrdD|b0iE8vr2S|Everything+you+need+to+create+and+deploy+applications+on+top+of+the+serverless+infrastructure. 
|JMSKwWsT_|OU70Y990tA|T_M_Ww4Wb|heading4|h4|Use+it+to+build:|806nmKOyc|g59JmcyM-7|Cyziie_SK|list|

    \n++++++++++++++++++++
  • Full-stack+applications
  • Multi-tenant+solutions
  • \n++++++++++++++++
|ST0O1ZeCk|ILrAABWXiX|
    \n++++++++++++++++++++
  • APIs
  • Microservice
  • \n++++++++++++++++
|XxXGeIywO|9H5t3COdbo|mc0_RS9rg|button|buttonText|Learn+more|50px|href|https://www.webiny.com/serverless-application-framework/|newTab|primary|icon|fas|long-arrow-alt-right|svg||position|16|Kg3rMc1Re|LAcQHMs8K|8oaRz-Gko_|9fQ9W-xiB|6022814891bd1300087bd24c|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg|YCG34DB89|xvBXD_QTkN|GqW2LBMzV|An+easier+way+to+build+serverless+apps|9cWYQwXUd|There+are+many+solutions+that+help+you+run,+deploy+and+monitor+serverless+functions,+but+when+it+comes+to+actually+coding+one,+there+are+none.+Webiny+is+a+solution+that+helps+you+code+your+serverless+app+by+providing+you+with+all+the+components+like+ACL,+routing,+file+storage+and+many+more.
|LxqyquKlYy|100%25|60px|177px|60228148f98841000981c723|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg|yqrzxoDllE|70px|bD-TQmZyW8|4ESAx7NxM|Framework+features|Xr7NLMpzm|3-3-3-3|_RtRioPOsj|12px|mOr47ImJK|AlTNw-76F8|r0e8MiCuK|6022814bef4a940008b3ba27|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg|170px|QFwbqHtSh|DH-C0-mBsO|XSN-oY3V3|Users,+groups,+roles+&+scopes|Unyhp8o-a|Security+is+a+crucial+layer+in+any+application.+Webiny+includes+a+full-featured+security+module+that\'s+connected+to+the+built-in+GraphQL+API.Users,+groups,+roles+&+scopes
|Ntcduee0-|0b66dbGkG|PoRqI9i2xE|0ZpnBSqjoz|6022814bef4a940008b3ba26|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg|FFGobMHHI|IWxl_nrRkr|I5btsZceI|Scaffolding|5qvaQSnP6|Quickly+generate+boilerplate+code+using+CLI+plugins.+From+lambda+functions+to+new+GraphQL+APIs.
|YHUznp7ZM5|PlxqV_uS7B|zKQYI-EIFl|frRuzWpRI|60228148f98841000981c724|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg|M1tvv840H|fwreagGdac|6H1tgEViY|Customizable+security|h0Ctka4TED|Use+the+default+AWS+Cognito,+or+replace+with+3rd+party+identity+providers+like+Okta,+Auth0,+etc.+Using+plugins+you+can+make+Webiny+work+with+any+identity+provider.
|SyyrOA60AF|GvU31fd4U|1vAxZAkD9O|dlI-qhVLKy|6022814bef4a940008b3ba28|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg|ftA7NOOxG|WU58SBDPP8|QtYfpt1yoE|Multiple+environments|mmpGUzg6o1|No+code+change+goes+directly+into+a+production+environment.+Webiny+CLI+makes+it+easy+to+manage+and+create+multiple+environments+for+your+project.
|wYK9BhaanZ|100%25|125px|ur1DQFl5BR|TzBvXtU2PH|-PU3iBlQ4|A6sNR3MR-5|Xtqk_itss|602281486ed41f0008bc2dad|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png|495px|bsKTDygik|ev9nhHISRw|1BBr9ACuM|One+size+doesn\'t+fit+all|0olguTqDN|It\'s+a+very+different+set+of+requirements+a+technical+team+has+to+a+marketing+team+to+a+business+development+team.+Webiny+Serverless+CMS+comes+with+several+different+apps+you+can+use+independently,+or+together+as+part+of+a+cohesive+solution.
|BhnYb3VW7D|QYZ290WhC|rgba(238,+238,+238,+1)|ER2SFYwbeK|gZp3Hxm5Js|602281486639200009fd35eb|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg|FsOaMudE8|ElruSYJxWM|Webiny+Serverless+

CMS|9HJcM89Am|8Cp2ZC30_H|qrS5wswdQ|heading5|h5|A+suite+of+applications+to+help+you+manage+your+content.+|pLUutc-E2|MGlDcu91q_|A6rStUekq|Use+it+to+build:|jIdakfVZU|5JHsGc_Rq-|SNOFqUK6lI|

    \n++++++++++++++++++++
  • Marketing+sites
  • \n++++++++++++++++++++
  • Multi-website+solutions
  • \n++++++++++++++++++++
  • Content+hubs
  • \n++++++++++++++++
|96dJBnIlc|5cPfb7AwXH|
    \n++++++++++++++++++++
  • Multi-language+sites
  • \n++++++++++++++++++++
  • Intranet+portals
  • \n++++++++++++++++++++
  • Headless+content+models
  • \n++++++++++++++++
|L4dFyzBKMM|Learn+more|https://www.webiny.com/serverless-cms/||mjmNmloeUS|100%25|220px|602281486639200009fd35ec|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg|xUkOEAm5X3|Kgr1ambSuG|AP_uTrgLZ|CMS+benefits|juBaAPJ76|4-4-4|s95PSAToXK|35px|ZECp8jcZD|60228148fa244d0008c47c79|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg|146px|EyKog1RmH|Scalable|_8lCcwhUN|No+matter+the+demand,+Webiny+Serverless+CMS+can+easily+scale+to+meet+even+the+most+challenging+workloads.
|SmrEQ9OZ8|QWM8cmlQEM|60228145f98841000981c720|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg|TYx-A5YCI|Adaptable|SsbWKZz_Z|Being+an+open-source+project,+it\'s+easy+to+modify+and+adapt+things+to+your+own+needs.
|gqdtbKfv7l|jBWaxzt-4|6022814851197600081724ae|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg|NLSOIstf9|Low+cost+of+ownership|kI-neIjkXx|Self-hosted+on+top+of+serverless+infrastructure.+No+infrastructure+to+mange,+less+people+required+to+operate+and+maintain.
|V14HHGmXN|-djsQadY-8|pTVeVoKkTi|bM5b8O7IMY|Secure|l9PuI-TdVA|Secured+by+AWS+Cognito.+It\'s+also+easy+to+integrate+services+like+OKTA,+Auth0+and+similar.
|N1lW0cAasg|W-ub9guhLt|602281486ed41f0008bc2dac|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg|DVhLZfrM53|Data+ownership|shmIumNfIu|Webiny+is+self-hosted,+it+means+your+data+stays+within+your+data+center.+
|8F7J_16a46|2gtT4Mfw6c|602281486ed41f0008bc2dab|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg|5EMJkVWgKW|Permission+control|cdSOjFAWkf|Powerful+options+to+control+the+permissions+your+users+will+have.+They+perfectly+align+with+your+business+requirements. 
|5ggqk561Ka|100%25|C6B8QfkUXs|ChF1iOAbtb|7tRfsJ_SEz|Serverless+makes+infrastructure+easy,+

Webiny+makes+serverless+easy|oYf9t6Uwz|RdazJP-4W1|7jBNW1iTi|60228145f98841000981c721|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg|200px|npNMgLft0|1.+Developer-friendly|DpubDRaGQ|Webiny+has+been+made+with+the+developer+in+mind.+It+helps+them+develop+serverless+applications+with+ease.
|KbQocaayR|KDO-Ja7wS|60228145f98841000981c71f|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg|ETll3nkV4|2.+Open+source|UWPjvO7EC|Webiny+is+created+and+maintained+by+an+amazing+group+of+people.+Being+open+source+means+Webiny+grows+and+evolves+much+faster.+Contributor+are+welcome.
|En4soRn06o|fqxeYbEV4|60228148fa244d0008c47c7a|https://d3oted5odtbsmd.cloudfront.net/files/demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png|276px|e5v0LBbfz|3.+Community|p9FWp5yqUy|We+have+an+active+community+on+slack.+Talk+to+the+core-team,+and+get+help.+Webiny+team+is+always+there+for+any+questions.
|OYp5Z-6Xo|woaE-6v5bN|Y8ndbn88hy|View+Webiny+on+GitHub|https://github.com/webiny/webiny-js|secondary|fab|github|^C|C|C|6|6|6|6|C|6|3|9|C|C|6|6|C|6|C|C|C|3|C|C|3|C|C|3|C|C|3|C|C|6|C|C|6|3|9|C|C|6|6|C|4|4|4|4|4|4|C|4|4|4|C^^$0|1|2|3|4|$5|$]]|6|@$0|7|2|8|4|$5|$9|$A|$B|C]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|O|I|P|G|P]|Q|$J|-1|I|M|G|M]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|Y|Z|10]]]]]]|6|@$0|11|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BC]]]|6|@$0|1F|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|1G|Z|1H]|1I|1J]]|6|@]]]]]]|$0|1K|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1L|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BD]]]|6|@$0|1M|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|1V]|4|$1O|1W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|1X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|1Y|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|1Z|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BE]]]|6|@$0|20|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|1V]|4|$1O|24]]|5|$D|$A|$L|F]]|K|$A|$L|F|J|-1|I|25|G|26]|Q|$I|F|G|F|J|-1]]]]|6|@]]]]]]|$0|27|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]|Q|$I|2C]]|K|$A|$L|F]]|12|$1E|BF]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2F|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2I]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2J|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2L]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BG]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2O|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2Q|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|2S|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]|1A|$J|-2]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|2T|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2B|J|-1]|1A|$J|-1|I|F|H|P]]|K|$A|$L|F]]|12|$1E|BH]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2U|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|2V]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|2W|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|2X]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|2Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|2N|J|-1]|Q|$J|-1|I|2N|E|F]|1A|$J|-1|I|F]]|K|$A|$L|F]]|12|$1E|BI]|V|$A|$W|$X|$0|2D|Z|2E]]]]]]|6|@$0|2Z|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|1V]|4|$1O|30]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|31|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|1V]|4|$1O|32]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|33|2|8|4|$5|$9|$A|$B|34]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|35|H|36|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|37|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|38|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|39|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BJ]]]|6|@$0|3A|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|3C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]|$0|3D|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|S|1S|3F|1U|3B]|4|$1O|3G]]|5|$D|$A|$L|F|J|-1|E|P]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|3H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|3I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|BK]]]|6|@$0|3L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|S]|3N|$A|$3O|3P|1U|3Q|9|$L|3R|J|-1|H|3R]]]]]|6|@$0|3S|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BL]]]|6|@$0|3T|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|3U|Z|3V]|1I|3W]|3X|$]]|6|@]]]]|$0|3Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BM]]]|6|@$0|3Z|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41|1U|3B]|4|$1O|42]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|43|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|44|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BN]]]|6|@$0|45|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|46]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|47|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|P|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|48|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BO]]]|6|@$0|49|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|4C]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4D|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4E|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BP]]]|6|@$0|4F|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4H]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|4I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BQ]]]|6|@$0|4J|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|4K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|4L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|4M|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BR]]]|6|@$0|4N|2|4O|4|$4P|4Q|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|4T|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|50|51|G|9|52]]|6|@]]]]]]]]|$0|53|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$E|F|G|F|H|F|I|F|L|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|BS]]]|6|@$0|54|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|55|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BT]]]|6|@$0|56|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|57|Z|58]]|3X|$]]|6|@]]]]]]|$0|59|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5A|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BU]]]|6|@$0|5B|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|5C]]|5|$D|$A|$L|F|J|-1]]|K|$A|$L|F]]]]|6|@]]|$0|5D|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|5E]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]]]]]|$0|5F|2|8|4|$5|$9|$A|$B|5G]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|5H|G|P|H|5I|I|P|J|-1]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|5J|Z|5K]]]]]]|6|@$0|5L|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|5M|I|F|J|-1]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BV]]]|6|@$0|5O|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|5P]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|5Q|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|5R]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5S|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|5T]|1A|$I|5T|J|-1]]|12|$1E|BW]]]|6|@$0|5U|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|5V|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BX]]]|6|@$0|5W|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|5X|Z|5Y]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|60|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|61|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|BY]]]|6|@$0|62|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|63]]|5|$D|$A|$L|F|J|-1|H|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|64|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|65]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|66|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|BZ]]]|6|@$0|67|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|68|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C0]]]|6|@$0|69|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6A|Z|6B]|1I|5Z]]|6|@]]]]]]|$0|6C|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6D|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C1]]]|6|@$0|6E|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6F]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6G|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6H]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|5T|G|5T]]|12|$1E|C2]]]|6|@$0|6J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6K|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C3]]]|6|@$0|6L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|5Z]|3X|$]]|6|@]]]]]]|$0|6O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6P|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C4]]]|6|@$0|6Q|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|6R]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|6S|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|6T]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|6U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|5T]|1A|$G|5T|J|-1]]|12|$1E|C5]]]|6|@$0|6V|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|28|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|6W|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C6]]]|6|@$0|6X|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6Y|Z|6Z]|1I|5Z]]|6|@]]]]]]|$0|70|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|71|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C7]]]|6|@$0|72|2|1N|4|$1O|$A|$2|1N|1P|2G|1R|S|1S|2H|1U|3B]|4|$1O|73]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|74|2|21|4|$1O|$A|$2|21|1P|2K|1R|S|1S|23|1U|3B]|4|$1O|75]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|76|2|8|4|$5|$9|$A|$B|77]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|78|G|P|H|36|I|P|J|-1]]|R|$A|S]|T|$A|U]]]|6|@$0|79|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7A|2|1D|4|$5|$D|$A|$E|F|G|F|H|38|I|F|J|-1]|1A|$J|-1]]|K|$A|$L|F|J|-1|G|3K]|1A|$J|-1|G|F]]|12|$1E|C8]]]|6|@$0|7B|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7C|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|C9]]]|6|@$0|7D|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7E|Z|7F]|9|7G]]|6|@]]]]]]|$0|7H|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7I|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CA]]]|6|@$0|7J|2|1N|4|$1O|$A|$2|1N|1P|3E|1R|I|1S|3F|1U|3B]|4|$1O|7K]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7L|2|21|4|$1O|$A|$2|21|1P|22|1R|I|1S|23|1U|3B]|4|$1O|7M]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]]]|$0|7N|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|J|-1|I|3K]|1A|$J|-1|I|F]]|12|$1E|CB]]]|6|@$0|7O|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|28|I|F|J|-1]]|12|$15|3M]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]|3N|$A|$3O|3P|1U|7P|9|$J|-1|H|3R]]]]]|6|@$0|7Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CC]]]|6|@$0|7R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|7S|Z|7T]|1I|3W]|3X|$]]|6|@]]]]|$0|7U|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CD]]]|6|@$0|7V|2|1N|4|$1O|$A|$2|1N|1P|40|1R|I|1S|41]|4|$1O|7W]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|7X|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|28|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|7Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CE]]]|6|@$0|7Z|2|1N|4|$1O|$A|$2|1N|1P|80|1R|I|1S|81|1U|3B]|4|$1O|82]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|83|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|4R|G|F|H|14|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|84|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CF]]]|6|@$0|85|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|I|1S|4B|1U|3B]|4|$1O|86]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|87|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|29]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|88|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CG]]]|6|@$0|89|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8A]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]|$0|8B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CH]]]|6|@$0|8C|2|4G|4|$1O|$A|$2|4G|1P|4G|1R|I|1S|23|1U|3B]|4|$1O|8D]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8E|2|4O|4|$4P|8F|5|$D|$A|$L|F|J|-1|E|4R]]|R|$A|U]]|3X|$4S|8G|4U|-1]|2|4V|4W|$0|@4X|4Y]|4Z|8H|51|G|9|52]]|6|@]]]]]]]]|$0|8I|2|8|4|$5|$9|$A|$B|8J]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|38|H|8K|I|P|G|P]]|R|$A|S]|T|$A|U]|V|$A|$W|$X|$0|8L|Z|8M]]]]]]|6|@$0|8N|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|5H|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8O|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CI]]]|6|@$0|8P|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|8Q]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|8R|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|8T|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|G|8U|I|8U]]|12|$1E|CJ]]]|6|@$0|8V|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|8W|Z|8X]|1I|8Y]|3X|$]]|6|@]]|$0|8Z|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|90]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|91|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|92]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|93|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CK]]]|6|@$0|94|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|95|Z|96]|1I|8Y]|3X|$]]|6|@]]|$0|97|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|98]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|99|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9A]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9B|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CL]]]|6|@$0|9C|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9D|Z|9E]|1I|8Y]|3X|$]]|6|@]]|$0|9F|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9G]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9H|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9I]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|9J|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|5H|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|9K|2|1D|4|$5|$D|$A|$E|F|G|F|H|3J|I|F|J|-1]]|K|$A|$L|F|J|-1|G|8U]|1A|$J|-1|I|8U]]|12|$1E|CM]]]|6|@$0|9L|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|6M|Z|6N]|1I|8Y]|3X|$]]|6|@]]|$0|9M|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9N]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9O|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|9P]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Q|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$H|3J|J|-1]]|K|$A|$L|F|J|-1|I|8U|G|8U]]|12|$1E|CN]]]|6|@$0|9R|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|9S|Z|9T]|1I|8Y]|3X|$]]|6|@]]|$0|9U|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|9V]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|9W|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23]|4|$1O|9X]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|9Y|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|8U]|1A|$J|-1|G|8U]]|12|$1E|CO]]]|6|@$0|9Z|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|A0|Z|A1]|1I|8Y]|3X|$]]|6|@]]|$0|A2|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|A3]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|A4|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|A5]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]]]|$0|A6|2|8|4|$5|$9|$A|$B|A7]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|M|J|-1|E|N|H|N|I|P|G|P]]|R|$A|S]|T|$A|U]]]|6|@$0|A8|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|A9|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CP]]]|6|@$0|AA|2|1N|4|$1O|$A|$2|1N|1P|1Q|1R|S|1S|1T|1U|3B]|4|$1O|AB]]|5|$D|$A|$L|F]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|AC|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|38|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|8S]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|AD|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|G|4R]|1A|$G|4R|J|-1|I|4R]]|12|$1E|CQ]]]|6|@$0|AE|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AF|Z|AG]|1I|AH]|3X|$]]|6|@]]|$0|AI|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AJ]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AK|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AL]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AM|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|3J]]|K|$A|$L|F|J|-1|I|4R|G|4R]]|12|$1E|CR]]]|6|@$0|AN|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AO|Z|AP]|1I|AH]|3X|$]]|6|@]]|$0|AQ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|AR]]|5|$D|$A|$L|F|J|-1|E|14]]|K|$A|$L|F]]]]|6|@]]|$0|AS|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|AT]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]|$0|AU|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]|1A|$J|-1|H|4R]]|K|$A|$L|F|J|-1|I|4R]|1A|$J|-1|I|4R|G|4R]]|12|$1E|CS]]]|6|@$0|AV|2|W|4|$5|$R|$A|S]|D|$A|$L|F]]|K|$A|$L|F]]]|W|$X|$0|AW|Z|AX]|1I|AH|9|AY]|3X|$]]|6|@]]|$0|AZ|2|1N|4|$1O|$A|$2|1N|1P|4A|1R|S|1S|4B|1U|3B]|4|$1O|B0]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]|$0|B1|2|21|4|$1O|$A|$2|21|1P|22|1R|S|1S|23|1U|3B]|4|$1O|B2]]|5|$D|$A|$L|F|J|-1|E|M]]|K|$A|$L|F]]]]|6|@]]]]]]|$0|B3|2|12|4|$5|$9|$A|$B|13]]|D|$A|$E|3J|G|F|H|F|I|F|J|-1]]|K|$A|$L|F|E|F|G|F|H|F|I|F]]|12|$15|16]|17|$A|$18|19]|1A|$18|1B]]|R|$A|U]|T|$A|U]]]|6|@$0|B4|2|1D|4|$5|$D|$A|$E|F|G|F|H|F|I|F|J|-1]]|K|$A|$L|F]]|12|$1E|CT]]]|6|@$0|B5|2|4O|4|$4P|B6|5|$D|$A|$L|F]]|R|$A|S]]|3X|$4S|B7|4U|-1]|2|B8|4W|$0|@B9|BA]|4Z|BB|9|52]]|6|@]]]]]]]]]]' + }, + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:59.947Z", + editor: "page-builder", + id: "658c1bd3c39bb10008431b5b#0001", + locale: "en-US", + locked: true, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + path: "/welcome-to-webiny", + pid: "658c1bd3c39bb10008431b5b", + publishedOn: "2023-12-27T12:43:00.723Z", + savedOn: "2023-12-27T12:43:00.723Z", + settings: { + general: { + layout: "static" + }, + seo: { + meta: [] + }, + social: { + meta: [] + } + }, + status: "published", + tenant: "root", + title: "Welcome to Webiny", + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T13:20:34.204Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:33.775Z", + entity: "CmsEntries", + entryId: "658c24a16607be00087f1168", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:34.175Z", + id: "658c24a16607be00087f1168#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:34.175Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modified: "2023-12-27T13:20:34.204Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:34.175Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:33.775Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:34.175Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:34.175Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:34.175Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:34.175Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 3" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168", + SK: "P", + TYPE: "cms.entry.p", + created: "2023-12-27T13:20:34.199Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:33.775Z", + entity: "CmsEntries", + entryId: "658c24a16607be00087f1168", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:34.175Z", + id: "658c24a16607be00087f1168#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:34.175Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modified: "2023-12-27T13:20:34.199Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:34.175Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:33.775Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:34.175Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:34.175Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:34.175Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:34.175Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 3" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24a16607be00087f1168", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T13:20:34.199Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:33.775Z", + entity: "CmsEntries", + entryId: "658c24a16607be00087f1168", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:34.175Z", + id: "658c24a16607be00087f1168#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:34.175Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modified: "2023-12-27T13:20:34.199Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:34.175Z", + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:33.775Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:34.175Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:34.175Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:34.175Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:34.175Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBUcM0rKapUMAIAFvZsCRgAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 3" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c7a", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.301Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228148fa244d0008c47c7a", + id: "60228148fa244d0008c47c7a#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.301Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 17382, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png", + "text@name": "community-icon.png", + "text@tags": [], + "text@type": "image/png" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#60228148fa244d0008c47c7a", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.301Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "60228148fa244d0008c47c7a", + id: "60228148fa244d0008c47c7a#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.301Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 17382, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png", + "text@name": "community-icon.png", + "text@tags": [], + "text@type": "image/png" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "TENANTS", + GSI1_SK: "T#null#2023-12-27T12:40:58.921Z", + PK: "T#root", + SK: "A", + TYPE: "tenancy.tenant", + _ct: "2023-12-27T12:40:58.922Z", + _et: "TenancyTenant", + _md: "2023-12-27T12:40:58.922Z", + data: { + createdOn: "2023-12-27T12:40:58.921Z", + description: "The top-level Webiny tenant.", + id: "root", + name: "Root", + parent: null, + savedOn: "2023-12-27T12:40:58.921Z", + settings: { + domains: [] + }, + status: "active", + tags: [], + webinyVersion: "5.38.2" + } + }, + { + PK: "T#root#L#en-US#PB#SETTINGS", + SK: "A", + TYPE: "pb.settings", + _ct: "2023-12-27T12:43:01.222Z", + _et: "PbSettings", + _md: "2023-12-27T12:43:01.222Z", + data: { + locale: "en-US", + name: "devr", + pages: { + home: "658c1bd3c39bb10008431b5b", + notFound: "658c1bd3c39bb10008431b5c" + }, + prerendering: { + app: { + url: null + }, + meta: {}, + storage: { + name: null + } + }, + tenant: "root", + type: "default", + websiteUrl: null + } + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814b0df4b000088735bc", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:58.924Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814b0df4b000088735bc", + id: "6022814b0df4b000088735bc#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:58.924Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 5053, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg", + "text@name": "webiny-logo.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814b0df4b000088735bc", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:58.924Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814b0df4b000088735bc", + id: "6022814b0df4b000088735bc#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:58.924Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 5053, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg", + "text@name": "webiny-logo.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#FM#SETTINGS", + SK: "A", + TYPE: "fm.settings", + _ct: "2023-12-27T12:42:52.281Z", + _et: "FM.Settings", + _md: "2023-12-27T12:42:52.281Z", + data: { + srcPrefix: "https://d3oted5odtbsmd.cloudfront.net/files/", + tenant: "root", + uploadMaxFileSize: 10737418240, + uploadMinFileSize: 0 + } + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24aa6607be00087f1169", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T13:20:42.181Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:42.180Z", + entity: "CmsEntries", + entryId: "658c24aa6607be00087f1169", + id: "658c24aa6607be00087f1169#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "modelA", + modified: "2023-12-27T13:20:42.181Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:42.180Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:42.180Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:42.180Z", + status: "draft", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAAwMAAAAAAAAAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 4" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c24aa6607be00087f1169", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T13:20:42.181Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:42.180Z", + entity: "CmsEntries", + entryId: "658c24aa6607be00087f1169", + id: "658c24aa6607be00087f1169#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "modelA", + modified: "2023-12-27T13:20:42.181Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:42.180Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:42.180Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:42.180Z", + status: "draft", + tenant: "root", + values: { + "long-text@z2tdm05d": { + compression: "gzip", + value: "H4sIAAAAAAAAAwMAAAAAAAAAAAA=" + }, + "text@f2qcuuzs": "DDB+ES - Model A Entry 4" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "PS#SETTINGS", + SK: "default", + data: { + appUrl: "https://d1c9xtq19d4x6u.cloudfront.net", + bucket: "wby-delivery-68ac55a", + cloudfrontId: "E12G8OCR2J2BDW", + deliveryUrl: "https://d1jwcc7rxvj5th.cloudfront.net", + sqsQueueUrl: + "https://sqs.eu-central-1.amazonaws.com/674320871285/wby-ps-render-queue-bcd2dfd.fifo" + } + }, + { + PK: "T#root#L#en-US#CMS#CME#658c2531adbc1700090e1ad2", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T13:23:15.570Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:57.094Z", + entity: "CmsEntries", + entryId: "658c2531adbc1700090e1ad2", + id: "658c2531adbc1700090e1ad2#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "modelB", + modified: "2023-12-27T13:23:15.570Z", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T13:23:15.536Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:57.094Z", + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T13:23:15.536Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:23:15.536Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:23:15.536Z", + status: "draft", + tenant: "root", + values: { + "file@5atpz8nu": null, + "long-text@7c5t8wwa": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBScM0rKapUMFIIDXBxDHF1AQA3yyBkIAAAAA==" + }, + "text@4dep2w2h": "DDB+ES - Model B Entry 2 UPDATED" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#658c2531adbc1700090e1ad2", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T13:23:15.570Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:57.094Z", + entity: "CmsEntries", + entryId: "658c2531adbc1700090e1ad2", + id: "658c2531adbc1700090e1ad2#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "modelB", + modified: "2023-12-27T13:23:15.570Z", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T13:23:15.536Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:57.094Z", + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T13:23:15.536Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:23:15.536Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:23:15.536Z", + status: "draft", + tenant: "root", + values: { + "file@5atpz8nu": null, + "long-text@7c5t8wwa": { + compression: "gzip", + value: "H4sIAAAAAAAAA3NxcdJ2DVbQVfDNT0nNUXBScM0rKapUMFIIDXBxDHF1AQA3yyBkIAAAAA==" + }, + "text@4dep2w2h": "DDB+ES - Model B Entry 2 UPDATED" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dad", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.062Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602281486ed41f0008bc2dad", + id: "602281486ed41f0008bc2dad#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.062Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 108898, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png", + "text@name": "webiny-serverless-cms.png ", + "text@tags": [], + "text@type": "image/png" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dad", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.061Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602281486ed41f0008bc2dad", + id: "602281486ed41f0008bc2dad#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.061Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 108898, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png", + "text@name": "webiny-serverless-cms.png ", + "text@tags": [], + "text@type": "image/png" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "T#root#PS#TAG", + GSI1_SK: "pb-menu#main-menu#/not-found", + PK: "T#root#PS#TAG#pb-menu#main-menu#/not-found", + SK: "main-menu#/not-found", + TYPE: "ps.tagPathLink", + _ct: "2023-12-27T12:43:23.860Z", + _et: "PrerenderingServiceTagPathLink", + _md: "2023-12-27T12:43:23.860Z", + data: { + key: "pb-menu", + path: "/not-found", + tenant: "root", + value: "main-menu" + } + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba28", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.045Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814bef4a940008b3ba28", + id: "6022814bef4a940008b3ba28#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.045Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 132767, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg", + "text@name": "environments.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#6022814bef4a940008b3ba28", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.045Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "6022814bef4a940008b3ba28", + id: "6022814bef4a940008b3ba28#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.045Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 132767, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg", + "text@name": "environments.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dac", + SK: "L", + TYPE: "cms.entry.l", + created: "2023-12-27T12:42:59.161Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602281486ed41f0008bc2dac", + id: "602281486ed41f0008bc2dac#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.161Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 73153, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg", + "text@name": "data-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + PK: "T#root#L#en-US#CMS#CME#602281486ed41f0008bc2dac", + SK: "REV#0001", + TYPE: "cms.entry", + created: "2023-12-27T12:42:59.161Z", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entity: "CmsEntries", + entryId: "602281486ed41f0008bc2dac", + id: "602281486ed41f0008bc2dac#0001", + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modified: "2023-12-27T12:42:59.161Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 73153, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg", + "text@name": "data-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + GSI1_PK: "T#root#ADMIN_USERS", + GSI1_SK: "admin@webiny.com", + PK: "T#root#ADMIN_USER#658c1b73c39bb10008431b44", + SK: "A", + TYPE: "adminUsers.user", + _ct: "2023-12-27T12:41:24.417Z", + _et: "AdminUsers.User", + _md: "2023-12-27T12:41:24.417Z", + data: { + createdBy: null, + createdOn: "2023-12-27T12:41:23.982Z", + displayName: "ad min", + email: "admin@webiny.com", + firstName: "ad", + group: "658c1b60c39bb10008431b42", + id: "658c1b73c39bb10008431b44", + lastName: "min", + tenant: "root", + webinyVersion: "5.38.2" + } + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-acosearchrecord-pbpage.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-acosearchrecord-pbpage.ts new file mode 100644 index 00000000000..6f2af35f719 --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-acosearchrecord-pbpage.ts @@ -0,0 +1,200 @@ +export const headlessCmsAcoSearchRecordPbPageMigrated = [ + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:43:00.024Z", + entryId: "wby-aco-658c1bd3c39bb10008431b5c", + firstPublishedBy: null, + firstPublishedOn: null, + id: "wby-aco-658c1bd3c39bb10008431b5c#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "acoSearchRecord-pbpage", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T12:43:00.024Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@data": { + "object@createdBy": {} + }, + "object@location": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:43:00.024Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T12:43:00.024Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:43:00.024Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:43:00.024Z", + status: "draft", + tenant: "root", + values: { + "object@data": { + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.964Z", + "datetime@savedOn": "2023-12-27T12:43:00.663Z", + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@id": "658c1b73c39bb10008431b44", + "text@type": "admin" + }, + "text@id": "658c1bd3c39bb10008431b5c#0001", + "text@path": "/not-found", + "text@pid": "658c1bd3c39bb10008431b5c", + "text@status": "published", + "text@title": "Not Found" + }, + "object@location": { + "text@folderId": "root" + }, + "text@content": + "Not Found Page not found! Sorry, but the page you were looking for could not be found. TAKE ME HOme", + "text@tags": [], + "text@title": "Not Found", + "text@type": "PbPage" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:43:00.006Z", + entryId: "wby-aco-658c1bd3c39bb10008431b5b", + firstPublishedBy: null, + firstPublishedOn: null, + id: "wby-aco-658c1bd3c39bb10008431b5b#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "acoSearchRecord-pbpage", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T12:43:00.006Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@data": { + "object@createdBy": {} + }, + "object@location": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:43:00.006Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T12:43:00.006Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:43:00.006Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:43:00.006Z", + status: "draft", + tenant: "root", + values: { + "object@data": { + "boolean@locked": true, + "datetime@createdOn": "2023-12-27T12:42:59.947Z", + "datetime@savedOn": "2023-12-27T12:43:00.723Z", + "number@version": 1, + "object@createdBy": { + "text@displayName": "ad min", + "text@id": "658c1b73c39bb10008431b44", + "text@type": "admin" + }, + "text@id": "658c1bd3c39bb10008431b5b#0001", + "text@path": "/welcome-to-webiny", + "text@pid": "658c1bd3c39bb10008431b5b", + "text@status": "published", + "text@title": "Welcome to Webiny" + }, + "object@location": { + "text@folderId": "root" + }, + "text@content": + "Welcome to Webiny Welcome to Webiny Webiny makes it easy to build applications and websites on top of the serverless infrastructure by providing you with a ready-made CMS and a development framework. Scalable Webiny apps can scale to handle the most demanding workloads. No custom tooling required Webiny eliminates the need to build custom tooling to create serverless app Cost effective Webiny apps run on serverless infrastructure which costs 80% less than VMs Resolves serverless challenges Webiny removes all the challenges of building serverless applications Get to know Webiny products Architect. Code. Deploy. Webiny Serverless Application Framework Everything you need to create and deploy applications on top of the serverless infrastructure.  Use it to build: Full-stack applicationsMulti-tenant solutions APIsMicroservice Learn more An easier way to build serverless apps There are many solutions that help you run, deploy and monitor serverless functions, but when it comes to actually coding one, there are none. Webiny is a solution that helps you code your serverless app by providing you with all the components like ACL, routing, file storage and many more. Framework features Users, groups, roles & scopes Security is a crucial layer in any application. Webiny includes a full-featured security module that's connected to the built-in GraphQL API.Users, groups, roles & scopes Scaffolding Quickly generate boilerplate code using CLI plugins. From lambda functions to new GraphQL APIs. Customizable security Use the default AWS Cognito, or replace with 3rd party identity providers like Okta, Auth0, etc. Using plugins you can make Webiny work with any identity provider. Multiple environments No code change goes directly into a production environment. Webiny CLI makes it easy to manage and create multiple environments for your project. One size doesn't fit all It's a very different set of requirements a technical team has to a marketing team to a business development team. Webiny Serverless CMS comes with several different apps you can use independently, or together as part of a cohesive solution. Webiny Serverless CMS A suite of applications to help you manage your content. Use it to build: Marketing sites Multi-website solutions Content hubs Multi-language sites Intranet portals Headless content models Learn more CMS benefits Scalable No matter the demand, Webiny Serverless CMS can easily scale to meet even the most challenging workloads. Adaptable Being an open-source project, it's easy to modify and adapt things to your own needs. Low cost of ownership Self-hosted on top of serverless infrastructure. No infrastructure to mange, less people required to operate and maintain. Secure Secured by AWS Cognito. It's also easy to integrate services like OKTA, Auth0 and similar. Data ownership Webiny is self-hosted, it means your data stays within your data center. Permission control Powerful options to control the permissions your users will have. They perfectly align with your business requirements.  Serverless makes infrastructure easy, Webiny makes serverless easy 1. Developer-friendly Webiny has been made with the developer in mind. It helps them develop serverless applications with ease. 2. Open source Webiny is created and maintained by an amazing group of people. Being open source means Webiny grows and evolves much faster. Contributor are welcome. 3. Community We have an active community on slack. Talk to the core-team, and get help. Webiny team is always there for any questions. View Webiny on GitHub", + "text@tags": [], + "text@title": "Welcome to Webiny", + "text@type": "PbPage" + }, + version: 1, + webinyVersion: "5.38.2" + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-fmfile.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-fmfile.ts new file mode 100644 index 00000000000..f10ae2611b2 --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-fmfile.ts @@ -0,0 +1,1605 @@ +export const headlessCmsFmFileMigrated = [ + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602282e07a77e60008f70d63", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602282e07a77e60008f70d63#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 888, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602282e07a77e60008f70d63/welcome-to-webiny__hero-feature-card-bg.svg", + "text@name": "feature-card-bg.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814bef4a940008b3ba28", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814bef4a940008b3ba28#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 132767, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814bef4a940008b3ba28/welcome-to-webiny__environments.svg", + "text@name": "environments.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814bef4a940008b3ba27", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814bef4a940008b3ba27#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 17711, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814bef4a940008b3ba27/welcome-to-webiny__security.svg", + "text@name": "security.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814bef4a940008b3ba26", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814bef4a940008b3ba26#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 33888, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814bef4a940008b3ba26/welcome-to-webiny__scaffolding.svg", + "text@name": "scaffolding.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814b7a77e60008f70d62", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814b7a77e60008f70d62#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 1864, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814b7a77e60008f70d62/welcome-to-webiny__hero-block-bg.svg", + "text@name": "hero-block-bg.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814b0df4b000088735bc", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814b0df4b000088735bc#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 5053, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814b0df4b000088735bc/welcome-to-webiny__webiny-logo.svg", + "text@name": "webiny-logo.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814a0df4b000088735bb", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814a0df4b000088735bb#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 3661, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814a0df4b000088735bb/welcome-to-webiny__webiny-serverless-application-framework.svg", + "text@name": "webiny-serverless-application-framework.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228148fa244d0008c47c7a", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228148fa244d0008c47c7a#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 17382, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148fa244d0008c47c7a/welcome-to-webiny__community-icon.png", + "text@name": "community-icon.png", + "text@tags": [], + "text@type": "image/png" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228148fa244d0008c47c79", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228148fa244d0008c47c79#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 7806, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148fa244d0008c47c79/welcome-to-webiny__scalable-icon.svg", + "text@name": "scalable-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228148f98841000981c724", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228148f98841000981c724#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 27878, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148f98841000981c724/welcome-to-webiny__idp.svg", + "text@name": "idp.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228148f98841000981c723", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228148f98841000981c723#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 390, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228148f98841000981c723/welcome-to-webiny__pink-shape.svg", + "text@name": "pink-shape.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814891bd1300087bd24c", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814891bd1300087bd24c#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 90163, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/6022814891bd1300087bd24c/welcome-to-webiny__webiny-infrastructure-overview.svg", + "text@name": "webiny-infrastructure-overview.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602281486ed41f0008bc2dad", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602281486ed41f0008bc2dad#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 108898, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486ed41f0008bc2dad/welcome-to-webiny__webiny-serverless-cms.png", + "text@name": "webiny-serverless-cms.png ", + "text@tags": [], + "text@type": "image/png" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602281486ed41f0008bc2dac", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602281486ed41f0008bc2dac#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 73153, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/602281486ed41f0008bc2dac/welcome-to-webiny__data-icon.svg", + "text@name": "data-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602281486ed41f0008bc2dab", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602281486ed41f0008bc2dab#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 67402, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486ed41f0008bc2dab/welcome-to-webiny__permission-icon.svg", + "text@name": "permission-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602281486639200009fd35ec", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602281486639200009fd35ec#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 392, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486639200009fd35ec/welcome-to-webiny__cms-benefits-shape.svg", + "text@name": "cms-benefits-shape.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "602281486639200009fd35eb", + firstPublishedBy: null, + firstPublishedOn: null, + id: "602281486639200009fd35eb#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 1758, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": + "demo-pages/602281486639200009fd35eb/welcome-to-webiny__serverless-cms-logo.svg", + "text@name": "serverless-cms-logo.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "6022814851197600081724ae", + firstPublishedBy: null, + firstPublishedOn: null, + id: "6022814851197600081724ae#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 60602, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/6022814851197600081724ae/welcome-to-webiny__cost-icon.svg", + "text@name": "cost-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228145f98841000981c721", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228145f98841000981c721#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 27804, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c721/welcome-to-webiny__developer.svg", + "text@name": "developer.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228145f98841000981c720", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228145f98841000981c720#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 28918, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c720/welcome-to-webiny__adaptable-icon.svg", + "text@name": "adaptable-icon.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T12:42:58.754Z", + entryId: "60228145f98841000981c71f", + firstPublishedBy: null, + firstPublishedOn: null, + id: "60228145f98841000981c71f#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "fmFile", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "object@location": {}, + "object@meta": {} + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T12:42:58.754Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T12:42:58.754Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T12:42:58.754Z", + status: "draft", + tenant: "root", + values: { + "number@size": 30007, + "object@location": { + "text@folderId": "root" + }, + "object@meta": { + "boolean@private": true + }, + "text@aliases": [], + "text@key": "demo-pages/60228145f98841000981c71f/welcome-to-webiny__octo-cat.svg", + "text@name": "octo-cat.svg", + "text@tags": [], + "text@type": "image/svg+xml" + }, + version: 1, + webinyVersion: "5.38.2" + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-modela.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-modela.ts new file mode 100644 index 00000000000..d5a5ae100dc --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-modela.ts @@ -0,0 +1,545 @@ +export const headlessCmsModelAMigrated = [ + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:42.180Z", + entryId: "658c24aa6607be00087f1169", + firstPublishedBy: null, + firstPublishedOn: null, + id: "658c24aa6607be00087f1169#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:42.180Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:42.180Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:42.180Z", + status: "draft", + tenant: "root", + values: { + "long-text@z2tdm05d": "", + "text@f2qcuuzs": "DDB+ES - Model A Entry 4" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:33.775Z", + entryId: "658c24a16607be00087f1168", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:34.175Z", + id: "658c24a16607be00087f1168#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:34.175Z", + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:34.175Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:33.775Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:34.175Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:34.175Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:34.175Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:34.175Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2", + "text@f2qcuuzs": "DDB+ES - Model A Entry 3" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.p", + __type: "cms.entry.p", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:33.775Z", + entryId: "658c24a16607be00087f1168", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:34.175Z", + id: "658c24a16607be00087f1168#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:34.175Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + published: true, + publishedOn: "2023-12-27T13:20:34.175Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:33.775Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:34.175Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:34.175Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:34.175Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:34.175Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2", + "text@f2qcuuzs": "DDB+ES - Model A Entry 3" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:25.235Z", + entryId: "658c24996607be00087f1167", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:25.701Z", + id: "658c24996607be00087f1167#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:25.701Z", + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:25.701Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:25.235Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:25.701Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:25.701Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:25.701Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:25.701Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2", + "text@f2qcuuzs": "DDB+ES - Model A Entry 2" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.p", + __type: "cms.entry.p", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:25.235Z", + entryId: "658c24996607be00087f1167", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:25.701Z", + id: "658c24996607be00087f1167#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:25.701Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + published: true, + publishedOn: "2023-12-27T13:20:25.701Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:25.235Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:25.701Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:25.701Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:25.701Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:25.701Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 2", + "text@f2qcuuzs": "DDB+ES - Model A Entry 2" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:11.821Z", + entryId: "658c248b6607be00087f1166", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:12.775Z", + id: "658c248b6607be00087f1166#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:12.775Z", + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:20:12.775Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:11.821Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:12.775Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:12.775Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:12.775Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:12.775Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 1", + "text@f2qcuuzs": "DDB+ES - Model A Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.p", + __type: "cms.entry.p", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:20:11.821Z", + entryId: "658c248b6607be00087f1166", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:20:12.775Z", + id: "658c248b6607be00087f1166#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:20:12.775Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelA", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + published: true, + publishedOn: "2023-12-27T13:20:12.775Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:20:11.821Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:20:12.775Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:20:12.775Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:20:12.775Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:20:12.775Z", + status: "published", + tenant: "root", + values: { + "long-text@z2tdm05d": "DDB+ES - Model A Entry 1", + "text@f2qcuuzs": "DDB+ES - Model A Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + } +]; diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-modelb.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-modelb.ts new file mode 100644 index 00000000000..eeedafac38e --- /dev/null +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/migrated/001.es-index-root-headless-cms-en-us-modelb.ts @@ -0,0 +1,236 @@ +export const headlessCmsModelBMigrated = [ + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:57.094Z", + entryId: "658c2531adbc1700090e1ad2", + firstPublishedBy: null, + firstPublishedOn: null, + id: "658c2531adbc1700090e1ad2#0001", + lastPublishedBy: null, + lastPublishedOn: null, + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: false, + meta: {}, + modelId: "modelB", + modifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + modifiedOn: "2023-12-27T13:23:15.536Z", + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + rawValues: { + "file@5atpz8nu": null + }, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:57.094Z", + revisionFirstPublishedBy: null, + revisionFirstPublishedOn: null, + revisionLastPublishedBy: null, + revisionLastPublishedOn: null, + revisionModifiedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionModifiedOn: "2023-12-27T13:23:15.536Z", + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:23:15.536Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:23:15.536Z", + status: "draft", + tenant: "root", + values: { + "long-text@7c5t8wwa": "DDB+ES - Model B Entry 2 UPDATED", + "text@4dep2w2h": "DDB+ES - Model B Entry 2 UPDATED" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.l", + __type: "cms.entry.l", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:44.672Z", + entryId: "658c2524adbc1700090e1ad1", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:22:46.091Z", + id: "658c2524adbc1700090e1ad1#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:22:46.091Z", + latest: true, + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelB", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + publishedOn: "2023-12-27T13:22:46.091Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:44.672Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:22:46.091Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:22:46.091Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:22:46.091Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:22:46.091Z", + status: "published", + tenant: "root", + values: { + "long-text@7c5t8wwa": "DDB+ES - Model B Entry 1", + "text@4dep2w2h": "DDB+ES - Model B Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + }, + { + TYPE: "cms.entry.p", + __type: "cms.entry.p", + createdBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + createdOn: "2023-12-27T13:22:44.672Z", + entryId: "658c2524adbc1700090e1ad1", + firstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + firstPublishedOn: "2023-12-27T13:22:46.091Z", + id: "658c2524adbc1700090e1ad1#0001", + lastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + lastPublishedOn: "2023-12-27T13:22:46.091Z", + locale: "en-US", + location: { + folderId: "root" + }, + locked: true, + modelId: "modelB", + modifiedBy: null, + modifiedOn: null, + ownedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + published: true, + publishedOn: "2023-12-27T13:22:46.091Z", + rawValues: {}, + revisionCreatedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionCreatedOn: "2023-12-27T13:22:44.672Z", + revisionFirstPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionFirstPublishedOn: "2023-12-27T13:22:46.091Z", + revisionLastPublishedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionLastPublishedOn: "2023-12-27T13:22:46.091Z", + revisionModifiedBy: null, + revisionModifiedOn: null, + revisionSavedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + revisionSavedOn: "2023-12-27T13:22:46.091Z", + savedBy: { + displayName: "ad min", + id: "658c1b73c39bb10008431b44", + type: "admin" + }, + savedOn: "2023-12-27T13:22:46.091Z", + status: "published", + tenant: "root", + values: { + "long-text@7c5t8wwa": "DDB+ES - Model B Entry 1", + "text@4dep2w2h": "DDB+ES - Model B Entry 1" + }, + version: 1, + webinyVersion: "5.38.2" + } +]; diff --git a/packages/migrations/src/ddb-es.ts b/packages/migrations/src/ddb-es.ts index 9c6872569e4..830549d3b37 100644 --- a/packages/migrations/src/ddb-es.ts +++ b/packages/migrations/src/ddb-es.ts @@ -5,24 +5,34 @@ import { AdminUsers_5_35_0_003 } from "~/migrations/5.35.0/003"; import { Tenancy_5_35_0_004 } from "~/migrations/5.35.0/004"; import { CmsModels_5_35_0_005 } from "~/migrations/5.35.0/005"; import { AcoRecords_5_35_0_006 } from "~/migrations/5.35.0/006/ddb-es"; + // 5.36.0 import { AcoRecords_5_36_0_001 } from "~/migrations/5.36.0/001/ddb-es"; + // 5.37.0 import { TenantLinkRecords_5_37_0_001 } from "~/migrations/5.37.0/001"; import { CmsEntriesRootFolder_5_37_0_002 } from "~/migrations/5.37.0/002/ddb-es"; import { AcoFolders_5_37_0_003 } from "~/migrations/5.37.0/003/ddb-es"; import { AcoRecords_5_37_0_004 } from "~/migrations/5.37.0/004/ddb-es"; import { FileManager_5_37_0_005 } from "~/migrations/5.37.0/005/ddb-es"; + // 5.38.0 import { MultiStepForms_5_38_0_001 } from "~/migrations/5.38.0/001/ddb-es"; import { MultiStepForms_5_38_0_002 } from "~/migrations/5.38.0/002/ddb-es"; // Page Blocks storage is the same for both DDB abd DDB-ES projects. import { PageBlocks_5_38_0_003 } from "~/migrations/5.38.0/003/ddb"; + // 5.39.0 -import { CmsEntriesInitNewMetaFields_5_39_0_001 } from "~/migrations/5.39.0/001/ddb-es"; +// Because of the 5.39.6-001 migration, this one is no longer needed. +// import { CmsEntriesInitNewMetaFields_5_39_0_001 } from "~/migrations/5.39.0/001/ddb-es"; import { FileManager_5_39_0_002 } from "~/migrations/5.39.0/002/ddb-es"; + // 5.39.2 -import { CmsEntriesInitNewMetaFields_5_39_2_001 } from "~/migrations/5.39.2/001/ddb-es"; +// Because of the 5.39.6-001 migration, this one is no longer needed. +// import { CmsEntriesInitNewMetaFields_5_39_2_001 } from "~/migrations/5.39.2/001/ddb-es"; + +// 5.39.6 +import { CmsEntriesInitNewMetaFields_5_39_6_001 } from "~/migrations/5.39.6/001/ddb-es"; export const migrations = () => { return [ @@ -33,22 +43,32 @@ export const migrations = () => { Tenancy_5_35_0_004, CmsModels_5_35_0_005, AcoRecords_5_35_0_006, + // 5.36.0 AcoRecords_5_36_0_001, + // 5.37.0 TenantLinkRecords_5_37_0_001, CmsEntriesRootFolder_5_37_0_002, AcoFolders_5_37_0_003, AcoRecords_5_37_0_004, FileManager_5_37_0_005, + // 5.38.0 MultiStepForms_5_38_0_001, MultiStepForms_5_38_0_002, PageBlocks_5_38_0_003, + // 5.39.0 - CmsEntriesInitNewMetaFields_5_39_0_001, + // Because of the 5.39.6-001 migration, this one is no longer needed. + // CmsEntriesInitNewMetaFields_5_39_0_001, FileManager_5_39_0_002, + // 5.39.2 - CmsEntriesInitNewMetaFields_5_39_2_001 + // Because of the 5.39.6-001 migration, this one is no longer needed. + // CmsEntriesInitNewMetaFields_5_39_2_001 + + // 5.39.6 + CmsEntriesInitNewMetaFields_5_39_6_001 ]; }; diff --git a/packages/migrations/src/migrations/5.39.0/001/utils/ensureAllNonNullableValues.ts b/packages/migrations/src/migrations/5.39.0/001/utils/ensureAllNonNullableValues.ts new file mode 100644 index 00000000000..ddcf42ed155 --- /dev/null +++ b/packages/migrations/src/migrations/5.39.0/001/utils/ensureAllNonNullableValues.ts @@ -0,0 +1,60 @@ +import { CmsEntry } from "~/migrations/5.39.0/001/types"; +import { CmsIdentity } from "@webiny/api-headless-cms/types"; + +interface Fallbacks { + dateTime: string; + identity: CmsIdentity; +} + +// All non-nullable meta fields must have values assigned. +export const ensureAllNonNullableValues = (entry: CmsEntry, fallbacks: Fallbacks) => { + const entryFallbackDateTime = + entry.savedOn || + entry.modifiedOn || + entry.createdOn || + entry.revisionCreatedOn || + entry.revisionModifiedOn || + entry.revisionSavedOn || + fallbacks.dateTime; + + const entryFallbackIdentity = + entry.savedBy || + entry.modifiedBy || + entry.createdBy || + entry.revisionCreatedBy || + entry.revisionModifiedBy || + entry.revisionSavedBy || + fallbacks.identity; + + if (!entry.revisionCreatedOn) { + entry.revisionCreatedOn = entryFallbackDateTime; + } + + if (!entry.revisionSavedOn) { + entry.revisionSavedOn = entryFallbackDateTime; + } + + if (!entry.revisionCreatedBy) { + entry.revisionCreatedBy = entryFallbackIdentity; + } + + if (!entry.revisionSavedBy) { + entry.revisionSavedBy = entryFallbackIdentity; + } + + if (!entry.createdOn) { + entry.createdOn = entryFallbackDateTime; + } + + if (!entry.savedOn) { + entry.savedOn = entryFallbackDateTime; + } + + if (!entry.createdBy) { + entry.createdBy = entryFallbackIdentity; + } + + if (!entry.savedBy) { + entry.savedBy = entryFallbackIdentity; + } +}; diff --git a/packages/migrations/src/migrations/5.39.0/001/utils/getFallbackIdentity.ts b/packages/migrations/src/migrations/5.39.0/001/utils/getFallbackIdentity.ts new file mode 100644 index 00000000000..a06f016a298 --- /dev/null +++ b/packages/migrations/src/migrations/5.39.0/001/utils/getFallbackIdentity.ts @@ -0,0 +1,58 @@ +import { CmsIdentity } from "@webiny/api-headless-cms/types"; +import { queryAll } from "@webiny/db-dynamodb"; +import { Entity } from "@webiny/db-dynamodb/toolbox"; + +const NON_EXISTING_DATA_MIGRATION_IDENTITY: CmsIdentity = { + id: "data-migration", + type: "data-migration", + displayName: "Data Migration" +}; + +interface GetFallbackIdentityParams { + entity: Entity; + tenant: string; +} + +interface AdminUserRecord { + data: { + createdOn: string; + id: string; + displayName: string; + }; +} + +const identitiesPerTenantCache: Record = {}; + +export const getFallbackIdentity = async ({ + entity, + tenant +}: GetFallbackIdentityParams): Promise => { + if (identitiesPerTenantCache[tenant]) { + return identitiesPerTenantCache[tenant]; + } + + const allAdminUsersRecords = await queryAll({ + entity, + partitionKey: `T#${tenant}#ADMIN_USERS`, + options: { + index: "GSI1" + } + }); + + if (allAdminUsersRecords.length === 0) { + // Hopefully it doesn't come to this, but we still need to consider it. + return NON_EXISTING_DATA_MIGRATION_IDENTITY; + } + + const [oldestAdminUser] = allAdminUsersRecords.sort((prev, next) => { + return prev.data.createdOn < next.data.createdOn ? -1 : 1; + }); + + identitiesPerTenantCache[tenant] = { + id: oldestAdminUser.data.id, + type: "admin", + displayName: oldestAdminUser.data.displayName + }; + + return identitiesPerTenantCache[tenant]; +}; diff --git a/packages/migrations/src/migrations/5.39.0/001/utils/hasAllNonNullableValues.ts b/packages/migrations/src/migrations/5.39.0/001/utils/hasAllNonNullableValues.ts new file mode 100644 index 00000000000..a3d97e5920a --- /dev/null +++ b/packages/migrations/src/migrations/5.39.0/001/utils/hasAllNonNullableValues.ts @@ -0,0 +1,20 @@ +import { CmsEntry } from "~/migrations/5.39.0/001/types"; +import { + EntryMetaFieldName, + isNonNullableEntryMetaField, + pickEntryMetaFields +} from "@webiny/api-headless-cms/constants"; + +export const hasAllNonNullableValues = (entry: CmsEntry) => { + // Only `modifiedX` and `publishedX` fields are nullable. + const nonNullableMetaFields = pickEntryMetaFields(entry, isNonNullableEntryMetaField); + + for (const fieldName in nonNullableMetaFields) { + const value = nonNullableMetaFields[fieldName as EntryMetaFieldName]; + if (!value) { + return false; + } + } + + return true; +}; diff --git a/packages/migrations/src/migrations/5.39.2/001/ddb-es/utils/hasValidTypeFieldValue.ts b/packages/migrations/src/migrations/5.39.0/001/utils/hasValidTypeFieldValue.ts similarity index 100% rename from packages/migrations/src/migrations/5.39.2/001/ddb-es/utils/hasValidTypeFieldValue.ts rename to packages/migrations/src/migrations/5.39.0/001/utils/hasValidTypeFieldValue.ts diff --git a/packages/migrations/src/migrations/5.39.2/001/ddb-es/index.ts b/packages/migrations/src/migrations/5.39.2/001/ddb-es/index.ts index 23775a42076..93a61137087 100644 --- a/packages/migrations/src/migrations/5.39.2/001/ddb-es/index.ts +++ b/packages/migrations/src/migrations/5.39.2/001/ddb-es/index.ts @@ -32,7 +32,7 @@ import { fixTypeFieldValue } from "~/migrations/5.39.0/001/utils/fixTypeFieldVal import { isMigratedEntry } from "~/migrations/5.39.0/001/utils/isMigratedEntry"; import { getOldestRevisionCreatedOn } from "~/migrations/5.39.0/001/utils/getOldestRevisionCreatedOn"; import { getFirstLastPublishedOnBy } from "~/migrations/5.39.0/001/utils/getFirstLastPublishedOn"; -import { hasValidTypeFieldValue } from "~/migrations/5.39.2/001/ddb-es/utils/hasValidTypeFieldValue"; +import { hasValidTypeFieldValue } from "~/migrations/5.39.0/001/utils/hasValidTypeFieldValue"; import { ScanDbItem } from "@webiny/db-dynamodb"; interface LastEvaluatedKey { @@ -124,7 +124,7 @@ export class CmsEntriesInitNewMetaFields_5_39_2_001 implements DataMigration { return true; } - logger.info(`CMS entries already upgraded. skipping...`); + logger.info(`CMS entries already upgraded. Skipping...`); return false; } diff --git a/packages/migrations/src/migrations/5.39.6/001/ddb-es/index.ts b/packages/migrations/src/migrations/5.39.6/001/ddb-es/index.ts new file mode 100644 index 00000000000..b095e63c247 --- /dev/null +++ b/packages/migrations/src/migrations/5.39.6/001/ddb-es/index.ts @@ -0,0 +1,452 @@ +import { Table } from "@webiny/db-dynamodb/toolbox"; +import { + DataMigration, + DataMigrationContext, + ElasticsearchClientSymbol, + ElasticsearchDynamoTableSymbol, + PrimaryDynamoTableSymbol +} from "@webiny/data-migration"; +import { + batchReadAll, + BatchReadItem, + batchWriteAll, + BatchWriteItem, + ddbScanWithCallback, + disableElasticsearchIndexing, + esGetIndexName, + fetchOriginalElasticsearchSettings, + restoreOriginalElasticsearchSettings +} from "~/utils"; +import { inject, makeInjectable } from "@webiny/ioc"; +import { Client } from "@elastic/elasticsearch"; +import { executeWithRetry } from "@webiny/utils"; +import { + createDdbEntryEntity, + createDdbEsEntryEntity +} from "~/migrations/5.39.0/001/entities/createEntryEntity"; +import { CmsEntry } from "~/migrations/5.39.0/001/types"; +import { getDecompressedData } from "~/migrations/5.39.0/001/utils/getDecompressedData"; +import { getCompressedData } from "~/migrations/5.39.0/001/utils/getCompressedData"; +import { assignNewMetaFields } from "~/migrations/5.39.0/001/utils/assignNewMetaFields"; +import { fixTypeFieldValue } from "~/migrations/5.39.0/001/utils/fixTypeFieldValue"; +import { getOldestRevisionCreatedOn } from "~/migrations/5.39.0/001/utils/getOldestRevisionCreatedOn"; +import { getFirstLastPublishedOnBy } from "~/migrations/5.39.0/001/utils/getFirstLastPublishedOn"; +import { hasValidTypeFieldValue } from "~/migrations/5.39.0/001/utils/hasValidTypeFieldValue"; +import { hasAllNonNullableValues } from "~/migrations/5.39.0/001/utils/hasAllNonNullableValues"; +import { isMigratedEntry } from "~/migrations/5.39.0/001/utils/isMigratedEntry"; +import { getFallbackIdentity } from "~/migrations/5.39.0/001/utils/getFallbackIdentity"; +import { ensureAllNonNullableValues } from "~/migrations/5.39.0/001/utils/ensureAllNonNullableValues"; +import { ScanDbItem } from "@webiny/db-dynamodb"; + +interface LastEvaluatedKey { + PK: string; + SK: string; + GSI1_PK: string; + GSI1_SK: string; +} + +interface IndexSettings { + number_of_replicas: number; + refresh_interval: `${number}s`; +} + +interface CmsEntriesRootFolderDataMigrationCheckpoint { + lastEvaluatedKey?: LastEvaluatedKey | boolean; + indexes: { + [index: string]: IndexSettings | null; + }; +} + +interface DynamoDbElasticsearchRecord { + PK: string; + SK: string; + data: string; +} + +export class CmsEntriesInitNewMetaFields_5_39_6_001 implements DataMigration { + private readonly elasticsearchClient: Client; + private readonly ddbEntryEntity: ReturnType; + private readonly ddbEsEntryEntity: ReturnType; + + public constructor( + table: Table, + esTable: Table, + elasticsearchClient: Client + ) { + this.elasticsearchClient = elasticsearchClient; + this.ddbEntryEntity = createDdbEntryEntity(table); + this.ddbEsEntryEntity = createDdbEsEntryEntity(esTable); + } + + getId() { + return "5.39.6-001"; + } + + getDescription() { + return "Write new revision and entry-level on/by meta fields."; + } + + async shouldExecute({ logger }: DataMigrationContext): Promise { + let shouldExecute = false; + + await ddbScanWithCallback>( + { + entity: this.ddbEntryEntity, + options: { + filters: [ + { + attr: "_et", + eq: "CmsEntries" + } + ], + limit: 100 + } + }, + async result => { + if (result.error) { + logger.error(result.error); + throw new Error(result.error); + } + + for (const item of result.items) { + const isFullyMigrated = + isMigratedEntry(item) && + hasValidTypeFieldValue(item) && + hasAllNonNullableValues(item); + + if (!isFullyMigrated) { + shouldExecute = true; + + // Stop further scanning. + return false; + } + } + + // Continue further scanning. + return true; + } + ); + + if (shouldExecute) { + return true; + } + + logger.info(`CMS entries already upgraded. Skipping...`); + return false; + } + + async execute({ + logger, + ...context + }: DataMigrationContext): Promise { + const migrationStatus = + context.checkpoint || ({} as CmsEntriesRootFolderDataMigrationCheckpoint); + + if (migrationStatus.lastEvaluatedKey === true) { + await restoreOriginalElasticsearchSettings({ + indexSettings: migrationStatus.indexes, + logger, + elasticsearchClient: this.elasticsearchClient + }); + logger.info(`Migration completed, no need to start again.`); + return; + } + + let usingKey = ""; + if (migrationStatus?.lastEvaluatedKey) { + usingKey = JSON.stringify(migrationStatus.lastEvaluatedKey); + } + + logger.trace(`Scanning primary DynamoDB table.`, { + usingKey + }); + + let currentDdbScanIteration = 0; + + await ddbScanWithCallback( + { + entity: this.ddbEntryEntity, + options: { + filters: [ + { + attr: "_et", + eq: "CmsEntries" + } + ], + startKey: migrationStatus.lastEvaluatedKey || undefined, + limit: 100 + } + }, + async result => { + currentDdbScanIteration++; + + logger.trace(`Primary DynamoDB table scan iteration: ${currentDdbScanIteration}.`); + logger.trace(`Analyzing ${result.items.length} record(s)...`); + + const ddbItems: BatchWriteItem[] = []; + const ddbEsItems: BatchWriteItem[] = []; + const ddbEsGetItems: Record = {}; + + const fallbackDateTime = new Date().toISOString(); + + // Update records in primary DynamoDB table. Also do preparations for + // subsequent updates on DDB-ES DynamoDB table, and in Elasticsearch. + for (const item of result.items) { + const index = esGetIndexName({ + tenant: item.tenant, + locale: item.locale, + type: item.modelId, + isHeadlessCmsModel: true + }); + + // Check ES index settings. + if (!migrationStatus.indexes || migrationStatus.indexes[index] === undefined) { + // We need to fetch the index settings first + const settings = await fetchOriginalElasticsearchSettings({ + index, + logger, + elasticsearchClient: this.elasticsearchClient + }); + + // ... add it to the checkpoint... + migrationStatus.indexes = { + ...migrationStatus.indexes, + [index]: settings + }; + // and then set not to index + await disableElasticsearchIndexing({ + elasticsearchClient: this.elasticsearchClient, + index, + logger + }); + } + + // 1. Check if the data migration was ever performed. If not, let's perform it. + if (!isMigratedEntry(item)) { + // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value. + const createdOn = await getOldestRevisionCreatedOn({ + entry: item, + entryEntity: this.ddbEntryEntity + }); + + const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({ + entry: item, + entryEntity: this.ddbEntryEntity + }); + + assignNewMetaFields(item, { + createdOn, + ...firstLastPublishedOnByFields + }); + } + + // 2. We've noticed some of the records had an invalid `TYPE` field value + // in the database. This step addresses this issue. + if (!hasValidTypeFieldValue(item)) { + // Fixes the value of the `TYPE` field, if it's not valid. + fixTypeFieldValue(item); + } + + // 3. Finally, once both of the steps were performed, ensure that all + // new non-nullable meta fields have a value and nothing is missing. + if (!hasAllNonNullableValues(item)) { + logger.trace( + `Detected an entry with missing values for non-nullable meta fields (${item.modelId}/${item.id}).` + ); + + try { + const fallbackIdentity = await getFallbackIdentity({ + entity: this.ddbEntryEntity, + tenant: item.tenant + }); + + ensureAllNonNullableValues(item, { + dateTime: fallbackDateTime, + identity: fallbackIdentity + }); + + logger.trace( + `Successfully ensured all non-nullable meta fields have values (${item.modelId}/${item.id}). Will be saving into the database soon.` + ); + } catch (e) { + logger.debug( + `Failed to ensure all non-nullable meta fields have values (${item.modelId}/${item.id}): ${e.message}` + ); + } + } + + ddbItems.push(this.ddbEntryEntity.putBatch(item)); + + /** + * Prepare the loading of DynamoDB Elasticsearch part of the records. + */ + if (ddbEsGetItems[`${item.entryId}:L`]) { + continue; + } + + ddbEsGetItems[`${item.entryId}:L`] = this.ddbEsEntryEntity.getBatch({ + PK: item.PK, + SK: "L" + }); + + if (item.status === "published" || !!item.locked) { + ddbEsGetItems[`${item.entryId}:P`] = this.ddbEsEntryEntity.getBatch({ + PK: item.PK, + SK: "P" + }); + } + } + + /** + * Get all the records from DynamoDB Elasticsearch. + */ + const ddbEsRecords = await batchReadAll({ + table: this.ddbEsEntryEntity.table, + items: Object.values(ddbEsGetItems) + }); + + for (const ddbEsRecord of ddbEsRecords) { + const decompressedData = await getDecompressedData(ddbEsRecord.data); + if (!decompressedData) { + logger.trace( + `[DDB-ES Table] Skipping record "${ddbEsRecord.PK}" as it is not a valid CMS entry...` + ); + continue; + } + + // 1. Check if the data migration was ever performed. If not, let's perform it. + if (!isMigratedEntry(decompressedData)) { + // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value. + const createdOn = await getOldestRevisionCreatedOn({ + entry: { ...decompressedData, PK: ddbEsRecord.PK }, + entryEntity: this.ddbEntryEntity + }); + + const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({ + entry: { ...decompressedData, PK: ddbEsRecord.PK }, + entryEntity: this.ddbEntryEntity + }); + + assignNewMetaFields(decompressedData, { + createdOn, + ...firstLastPublishedOnByFields + }); + } + + // 2. Ensure new non-nullable meta fields have a value and nothing is missing. + if (!hasAllNonNullableValues(decompressedData)) { + logger.trace( + [ + "[DDB-ES Table] Detected an entry with missing values for non-nullable meta fields", + `(${decompressedData.modelId}/${decompressedData.id}).` + ].join(" ") + ); + + try { + const fallbackIdentity = await getFallbackIdentity({ + entity: this.ddbEntryEntity, + tenant: decompressedData.tenant + }); + + ensureAllNonNullableValues(decompressedData, { + dateTime: fallbackDateTime, + identity: fallbackIdentity + }); + + logger.trace( + [ + "[DDB-ES Table] Successfully ensured all non-nullable meta fields", + `have values (${decompressedData.modelId}/${decompressedData.id}).`, + "Will be saving the changes soon." + ].join(" ") + ); + } catch (e) { + logger.debug( + [ + "[DDB-ES Table] Failed to ensure all non-nullable meta fields have values", + `(${decompressedData.modelId}/${decompressedData.id}): ${e.message}` + ].join(" ") + ); + } + } + + const compressedData = await getCompressedData(decompressedData); + + ddbEsItems.push( + this.ddbEsEntryEntity.putBatch({ + ...ddbEsRecord, + data: compressedData + }) + ); + } + + // Store data in primary DynamoDB table. + const execute = () => { + return batchWriteAll({ + table: this.ddbEntryEntity.table, + items: ddbItems + }); + }; + + logger.trace("Storing records in primary DynamoDB table..."); + await executeWithRetry(execute, { + onFailedAttempt: error => { + logger.error( + `"batchWriteAll" attempt #${error.attemptNumber} failed: ${error.message}` + ); + } + }); + logger.trace("...stored."); + + // Store data in DDB-ES DynamoDB table. + const executeDdbEs = () => { + return batchWriteAll({ + table: this.ddbEsEntryEntity.table, + items: ddbEsItems + }); + }; + + logger.trace("Storing records in DDB-ES DynamoDB table..."); + await executeWithRetry(executeDdbEs, { + onFailedAttempt: error => { + logger.error( + `"batchWriteAll ddb-es" attempt #${error.attemptNumber} failed: ${error.message}` + ); + } + }); + logger.trace("...stored."); + + // Update checkpoint after every batch. + migrationStatus.lastEvaluatedKey = result.lastEvaluatedKey?.PK + ? (result.lastEvaluatedKey as unknown as LastEvaluatedKey) + : true; + + // Check if we should store checkpoint and exit. + if (context.runningOutOfTime()) { + await context.createCheckpointAndExit(migrationStatus); + } else { + await context.createCheckpoint(migrationStatus); + } + } + ); + + /** + * This is the end of the migration. + */ + await restoreOriginalElasticsearchSettings({ + indexSettings: migrationStatus.indexes, + logger, + elasticsearchClient: this.elasticsearchClient + }); + + migrationStatus.lastEvaluatedKey = true; + migrationStatus.indexes = {}; + context.createCheckpoint(migrationStatus); + } +} + +makeInjectable(CmsEntriesInitNewMetaFields_5_39_6_001, [ + inject(PrimaryDynamoTableSymbol), + inject(ElasticsearchDynamoTableSymbol), + inject(ElasticsearchClientSymbol) +]); From a065b88bde4ccf75a0f7fe77eee6959cb3fdcfc6 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 8 May 2024 15:01:45 +0200 Subject: [PATCH 02/26] fix: skip migrating if a record is fully migrated --- .../migrations/src/migrations/5.39.6/001/ddb-es/index.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/migrations/src/migrations/5.39.6/001/ddb-es/index.ts b/packages/migrations/src/migrations/5.39.6/001/ddb-es/index.ts index b095e63c247..fdf0511cd89 100644 --- a/packages/migrations/src/migrations/5.39.6/001/ddb-es/index.ts +++ b/packages/migrations/src/migrations/5.39.6/001/ddb-es/index.ts @@ -192,6 +192,15 @@ export class CmsEntriesInitNewMetaFields_5_39_6_001 implements DataMigration { // Update records in primary DynamoDB table. Also do preparations for // subsequent updates on DDB-ES DynamoDB table, and in Elasticsearch. for (const item of result.items) { + const isFullyMigrated = + isMigratedEntry(item) && + hasValidTypeFieldValue(item) && + hasAllNonNullableValues(item); + + if (isFullyMigrated) { + continue; + } + const index = esGetIndexName({ tenant: item.tenant, locale: item.locale, From 9d894896e1733de662036c263a9ae9c46c966069 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 8 May 2024 19:23:07 +0200 Subject: [PATCH 03/26] fix: ensure all fields are always included in the result --- packages/api-headless-cms/src/constants.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/api-headless-cms/src/constants.ts b/packages/api-headless-cms/src/constants.ts index 121d4629d8b..940af91e2f0 100644 --- a/packages/api-headless-cms/src/constants.ts +++ b/packages/api-headless-cms/src/constants.ts @@ -62,13 +62,16 @@ export const pickEntryMetaFields = ( ) => { const pickedEntryMetaFields: Partial = {}; for (const entryMetaFieldName of ENTRY_META_FIELDS) { - if (entryMetaFieldName in object) { - const mustPick = !filter || filter(entryMetaFieldName); - if (mustPick) { - Object.assign(pickedEntryMetaFields, { - [entryMetaFieldName]: object[entryMetaFieldName] - }); - } + const fieldExists = entryMetaFieldName in object; + if (!fieldExists) { + object[entryMetaFieldName] = undefined; + } + + const mustPick = !filter || filter(entryMetaFieldName); + if (mustPick) { + Object.assign(pickedEntryMetaFields, { + [entryMetaFieldName]: object[entryMetaFieldName] + }); } } From 7ad4374cf02e73315f1b78e20b820e607a92adb2 Mon Sep 17 00:00:00 2001 From: Adrian Smijulj Date: Wed, 15 May 2024 14:55:47 +0200 Subject: [PATCH 04/26] fix: add `--data-migration-reporter` flag in order to optionally hide migration logs (#4136) --- packages/cli-plugin-deploy-pulumi/commands/index.js | 5 +++++ packages/handler/src/fastify.ts | 4 ++++ .../src/api/plugins/executeDataMigrations.ts | 11 ++++++++--- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/cli-plugin-deploy-pulumi/commands/index.js b/packages/cli-plugin-deploy-pulumi/commands/index.js index 5949e5addcf..495680dd5b9 100644 --- a/packages/cli-plugin-deploy-pulumi/commands/index.js +++ b/packages/cli-plugin-deploy-pulumi/commands/index.js @@ -59,6 +59,11 @@ module.exports = [ describe: `Enable base compilation-related logs`, type: "boolean" }); + yargs.option("data-migration-reporter", { + default: true, + describe: `Enable data migration reporting during the deployment process`, + type: "boolean" + }); }, async argv => { await deploy(argv, context); diff --git a/packages/handler/src/fastify.ts b/packages/handler/src/fastify.ts index dede0fc3288..b512ba7e720 100644 --- a/packages/handler/src/fastify.ts +++ b/packages/handler/src/fastify.ts @@ -187,6 +187,10 @@ export const createHandler = (params: CreateHandlerParams) => { */ const app = fastify({ bodyLimit: 536870912, // 512MB + + // TODO: in the near future, pass own Pino logger instance. + logger: false, + ...(params.options || {}) }); diff --git a/packages/serverless-cms-aws/src/api/plugins/executeDataMigrations.ts b/packages/serverless-cms-aws/src/api/plugins/executeDataMigrations.ts index e0c4bfd66ff..584c7ca95cf 100644 --- a/packages/serverless-cms-aws/src/api/plugins/executeDataMigrations.ts +++ b/packages/serverless-cms-aws/src/api/plugins/executeDataMigrations.ts @@ -6,7 +6,8 @@ import { InteractiveCliStatusReporter, NonInteractiveCliStatusReporter, MigrationRunner, - CliMigrationRunReporter + CliMigrationRunReporter, + MigrationStatusReporter } from "@webiny/data-migration/cli"; /** @@ -43,10 +44,14 @@ export const executeDataMigrations = { const functionName = apiOutput["migrationLambdaArn"]; const logReporter = new LogReporter(functionName); - const statusReporter = - !process.stdout.isTTY || "CI" in process.env + + let statusReporter: MigrationStatusReporter | undefined; + if (inputs.dataMigrationReporter) { + const useNonInteractiveReporter = !process.stdout.isTTY || "CI" in process.env; + statusReporter = useNonInteractiveReporter ? new NonInteractiveCliStatusReporter(logReporter) : new InteractiveCliStatusReporter(logReporter); + } const runner = MigrationRunner.create({ lambdaClient, From 14f314470f3b74ea06f8761cb03cc7aee1001024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Wed, 15 May 2024 15:48:57 +0200 Subject: [PATCH 05/26] fix(api-headless-cms-ddb-es): unpublish latest record (#4137) --- .../src/operations/entry/index.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts b/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts index c0acc0f5b6a..7cb3a077268 100644 --- a/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts +++ b/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts @@ -1454,13 +1454,22 @@ export const createEntriesStorageOperations = ( }) ]; /** - * If we are unpublishing the latest revision, let's also update the latest revision entry's status in ES. + * If we are unpublishing the latest revision, let's also update the latest revision entry's status in both DynamoDB tables. */ if (latestStorageEntry?.id === entry.id) { const { index } = configurations.es({ model }); + items.push( + entity.putBatch({ + ...storageEntry, + PK: partitionKey, + SK: createLatestSortKey(), + TYPE: createLatestRecordType() + }) + ); + const esLatestData = await transformer.getElasticsearchLatestEntryData(); esItems.push( esEntity.putBatch({ From 68b9185e64023cb28c6fd4f86d993d0301bf284c Mon Sep 17 00:00:00 2001 From: Adrian Smijulj Date: Thu, 16 May 2024 15:19:30 +0200 Subject: [PATCH 06/26] fix: replace `--data-migration-reporter` with `WEBINY_MIGRATION_LOG_STREAMING` env var (#4139) --- packages/data-migration/src/cli/index.ts | 1 + .../src/api/plugins/executeDataMigrations.ts | 20 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/data-migration/src/cli/index.ts b/packages/data-migration/src/cli/index.ts index cd9c67861ee..99b5d9bd11a 100644 --- a/packages/data-migration/src/cli/index.ts +++ b/packages/data-migration/src/cli/index.ts @@ -4,6 +4,7 @@ export * from "./MigrationStatusReporter"; export * from "./MigrationRunReporter"; export * from "./InteractiveCliStatusReporter"; export * from "./NonInteractiveCliStatusReporter"; +export * from "./VoidStatusReporter"; export * from "./CliMigrationRunReporter"; export * from "./LogStream"; export * from "./LogReporter"; diff --git a/packages/serverless-cms-aws/src/api/plugins/executeDataMigrations.ts b/packages/serverless-cms-aws/src/api/plugins/executeDataMigrations.ts index 584c7ca95cf..ca4922595d6 100644 --- a/packages/serverless-cms-aws/src/api/plugins/executeDataMigrations.ts +++ b/packages/serverless-cms-aws/src/api/plugins/executeDataMigrations.ts @@ -7,7 +7,8 @@ import { NonInteractiveCliStatusReporter, MigrationRunner, CliMigrationRunReporter, - MigrationStatusReporter + MigrationStatusReporter, + VoidStatusReporter } from "@webiny/data-migration/cli"; /** @@ -34,7 +35,18 @@ export const executeDataMigrations = { const apiOutput = getStackOutput({ folder: "apps/api", env }); - context.info("Executing data migrations Lambda function..."); + context.info("Executing data migrations AWS Lambda function..."); + + const logStreamingEnabled = process.env.WEBINY_MIGRATION_LOG_STREAMING !== "false"; + if (!logStreamingEnabled) { + context.warning( + [ + "Data migration log streaming is disabled.", + "Note that the logs will still be accessible in Amazon CloudWatch.", + "Learn more: https://webiny.link/cloudwatch" + ].join(" ") + ); + } try { const lambdaClient = new LambdaClient({ @@ -45,8 +57,8 @@ export const executeDataMigrations = { const logReporter = new LogReporter(functionName); - let statusReporter: MigrationStatusReporter | undefined; - if (inputs.dataMigrationReporter) { + let statusReporter: MigrationStatusReporter = new VoidStatusReporter(); + if (inputs.dataMigrationLogStreaming) { const useNonInteractiveReporter = !process.stdout.isTTY || "CI" in process.env; statusReporter = useNonInteractiveReporter ? new NonInteractiveCliStatusReporter(logReporter) From 8b1d93200f0fc02f9bf9c5105ef58c9748cf4195 Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Tue, 21 May 2024 22:33:15 +0200 Subject: [PATCH 07/26] fix(data-migration): add support for migration skipping [skip ci] --- .../__tests__/migration.test.ts | 30 ++++++++++ .../data-migration/src/MigrationRunner.ts | 57 +++++++++++++++++-- 2 files changed, 81 insertions(+), 6 deletions(-) diff --git a/packages/data-migration/__tests__/migration.test.ts b/packages/data-migration/__tests__/migration.test.ts index 60f641e0d4d..976a42685c9 100644 --- a/packages/data-migration/__tests__/migration.test.ts +++ b/packages/data-migration/__tests__/migration.test.ts @@ -429,4 +429,34 @@ describe("Migration Lambda Handler", () => { expect(data2.executed[0].id).toBe("2.1.0-001"); expect(data2.executed[1].id).toBe("2.1.0-002"); }); + + it("should skip migrations defined by WEBINY_MIGRATION_SKIP env var", async () => { + const allMigrations = [ + createDdbMigration("1.0.0-001"), + createDdbMigration("1.1.0-001"), + createDdbMigration("2.0.0-001"), + createDdbMigration("2.1.0-001"), + createDdbMigration("2.1.0-002") + ]; + + process.env["WEBINY_MIGRATION_SKIP_2_0_0_001"] = "true"; + process.env["WEBINY_MIGRATION_SKIP_2_1_0_002"] = "true"; + + const handler = useHandler( + createDdbProjectMigration({ + primaryTable: table, + migrations: allMigrations + }) + ); + + const exactMatch = await handler({ version: "1.0.0", pattern: "*" }); + assertNotError(exactMatch.error); + const data1 = groupMigrations(exactMatch.data.migrations); + expect(data1.notApplicable.length).toBe(0); + expect(data1.skipped.length).toBe(2); + expect(data1.executed.length).toBe(3); + expect(data1.executed[0].id).toBe("1.0.0-001"); + expect(data1.executed[1].id).toBe("1.1.0-001"); + expect(data1.executed[2].id).toBe("2.1.0-001"); + }); }); diff --git a/packages/data-migration/src/MigrationRunner.ts b/packages/data-migration/src/MigrationRunner.ts index 168d35076e6..4f2bcea7b14 100644 --- a/packages/data-migration/src/MigrationRunner.ts +++ b/packages/data-migration/src/MigrationRunner.ts @@ -43,6 +43,16 @@ const shouldForceExecute = (mig: DataMigration) => { return process.env[key] === "true"; }; +/** + * This allows us to always skip a migration. + * Example: WEBINY_MIGRATION_SKIP_5_35_0_006=true + */ +const shouldSkip = (mig: DataMigration) => { + const key = `WEBINY_MIGRATION_SKIP_${mig.getId().replace(/[\.\-]/g, "_")}`; + + return process.env[key] === "true"; +}; + class MigrationNotFinished extends Error {} class MigrationInProgress extends Error {} @@ -132,6 +142,7 @@ export class MigrationRunner { const isMigrationApplicable = isApplicable || defaultIsApplicable; this.printForceExecuteEnvVars(); + this.printSkipExecuteEnvVars(); if (forceExecute) { this.logger.info( @@ -141,6 +152,15 @@ export class MigrationRunner { const executableMigrations = this.migrations .filter(mig => { + if (shouldSkip(mig)) { + this.setRunItem(lastRun, { + id: mig.getId(), + status: "skipped" + }); + + return false; + } + if (shouldForceExecute(mig)) { return true; } @@ -247,17 +267,23 @@ export class MigrationRunner { this.logger.error(err, err.message); return; } finally { - // We sum duration from the previous run with the current run. runItem.finishedOn = getCurrentISOTime(); // Update run stats. await this.setRunItemAndSave(lastRun, runItem); - this.logger.info( - `Finished executing migration %s in %sms.`, - migration.getId(), - getRunItemDuration(runItem) - ); + if (runItem.status === "pending") { + this.logger.info( + `Pausing migration %s, awaiting continuation.`, + migration.getId() + ); + } else { + this.logger.info( + `Finished executing migration %s in %sms.`, + migration.getId(), + getRunItemDuration(runItem) + ); + } } await this.repository.logMigration({ @@ -401,6 +427,25 @@ export class MigrationRunner { this.logger.info(`${key}=${process.env[key]}`); } } + + private printSkipExecuteEnvVars() { + const skipKeys = Object.keys(process.env).filter(key => + key.startsWith("WEBINY_MIGRATION_SKIP_") + ); + + if (!skipKeys.length) { + this.logger.info( + `No migrations are skipped via WEBINY_MIGRATION_SKIP environment variable.` + ); + + return; + } + + this.logger.info(`SKIPPED MIGRATIONS DETECTED!`); + for (const key of skipKeys) { + this.logger.info(`${key}=${process.env[key]}`); + } + } } makeInjectable(MigrationRunner, [ From d45451c2cdbf1daef55fbb5671f36180d789fc60 Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Wed, 22 May 2024 12:44:19 +0200 Subject: [PATCH 08/26] fix(app-file-manager): allow underscore in file aliases [skip ci] --- packages/app-file-manager/src/components/fields/Aliases.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app-file-manager/src/components/fields/Aliases.tsx b/packages/app-file-manager/src/components/fields/Aliases.tsx index 8f540417778..bdb0d1d44f9 100644 --- a/packages/app-file-manager/src/components/fields/Aliases.tsx +++ b/packages/app-file-manager/src/components/fields/Aliases.tsx @@ -36,7 +36,7 @@ const FileAliasMessage = styled("span")` font-size: 12px; `; -const PATHNAME_REGEX = /^\/[/.a-zA-Z0-9-]+$/; +const PATHNAME_REGEX = /^\/[/.a-zA-Z0-9-_]+$/; export const Aliases = () => { const { value, onChange } = useBind({ name: "aliases" }); From d4a3c0c6e761b832084e0f509caea78bc4a37bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Wed, 22 May 2024 13:54:39 +0200 Subject: [PATCH 09/26] fix(api-elasticsearch): health and node checks [skip ci] (#4143) --- .../__tests__/operations/catHealth.test.ts | 30 +++ .../__tests__/operations/catNodes.test.ts | 26 +++ .../__tests__/utils/waitUntilHealthy.test.ts | 205 ++++++++++++++++++ packages/api-elasticsearch/src/index.ts | 1 + .../src/operations/ElasticsearchCatHealth.ts | 39 ++++ .../src/operations/ElasticsearchCatNodes.ts | 33 +++ .../api-elasticsearch/src/operations/index.ts | 2 + .../stripConnectionFromException.ts | 15 ++ .../api-elasticsearch/src/operations/types.ts | 38 ++++ .../waitUntilHealthy/UnhealthyClusterError.ts | 10 + .../waitUntilHealthy/WaitUntilHealthy.ts | 186 ++++++++++++++++ .../WaitingHealthyClusterAbortedError.ts | 10 + .../src/utils/waitUntilHealthy/index.ts | 1 + packages/error/src/index.ts | 1 + 14 files changed, 597 insertions(+) create mode 100644 packages/api-elasticsearch/__tests__/operations/catHealth.test.ts create mode 100644 packages/api-elasticsearch/__tests__/operations/catNodes.test.ts create mode 100644 packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts create mode 100644 packages/api-elasticsearch/src/operations/ElasticsearchCatHealth.ts create mode 100644 packages/api-elasticsearch/src/operations/ElasticsearchCatNodes.ts create mode 100644 packages/api-elasticsearch/src/operations/index.ts create mode 100644 packages/api-elasticsearch/src/operations/stripConnectionFromException.ts create mode 100644 packages/api-elasticsearch/src/operations/types.ts create mode 100644 packages/api-elasticsearch/src/utils/waitUntilHealthy/UnhealthyClusterError.ts create mode 100644 packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitUntilHealthy.ts create mode 100644 packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitingHealthyClusterAbortedError.ts create mode 100644 packages/api-elasticsearch/src/utils/waitUntilHealthy/index.ts diff --git a/packages/api-elasticsearch/__tests__/operations/catHealth.test.ts b/packages/api-elasticsearch/__tests__/operations/catHealth.test.ts new file mode 100644 index 00000000000..684ebfbe9e0 --- /dev/null +++ b/packages/api-elasticsearch/__tests__/operations/catHealth.test.ts @@ -0,0 +1,30 @@ +import { ElasticsearchCatHealth } from "~/operations/ElasticsearchCatHealth"; +import { createElasticsearchClient } from "../helpers"; +import { IElasticsearchCatHealthResponse } from "~/operations/types"; + +describe("cat health", () => { + it("should fetch health information", async () => { + const client = createElasticsearchClient(); + const catHealth = new ElasticsearchCatHealth(client); + + const expected: IElasticsearchCatHealthResponse = { + status: expect.stringMatching(/^green|yellow|red$/), + "node.data": expect.stringMatching(/^\d+$/), + "node.total": expect.stringMatching(/^\d+$/), + shards: expect.stringMatching(/^\d+$/), + active_shards_percent: expect.stringMatching(/^([0-9]*[.])?[0-9]%$/), + init: expect.stringMatching(/^\d+$/), + epoch: expect.stringMatching(/^\d+$/), + timestamp: expect.stringMatching(/^\d+:\d+:\d+$/), + cluster: expect.any(String), + pri: expect.stringMatching(/^\d+$/), + relo: expect.stringMatching(/^\d+$/), + unassign: expect.stringMatching(/^\d+$/), + pending_tasks: expect.stringMatching(/^\d+$/), + max_task_wait_time: expect.any(String) + }; + + const response = await catHealth.getHealth(); + expect(response).toMatchObject(expected); + }); +}); diff --git a/packages/api-elasticsearch/__tests__/operations/catNodes.test.ts b/packages/api-elasticsearch/__tests__/operations/catNodes.test.ts new file mode 100644 index 00000000000..a19213370d3 --- /dev/null +++ b/packages/api-elasticsearch/__tests__/operations/catNodes.test.ts @@ -0,0 +1,26 @@ +import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; +import { ElasticsearchCatNodes } from "~/operations"; +import { IElasticsearchCatNodeResponse } from "~/operations/types"; + +describe("cat nodes", () => { + it("should fetch nodes information", async () => { + const client = createElasticsearchClient(); + const catNodes = new ElasticsearchCatNodes(client); + + const expected: Partial[] = [ + { + "heap.percent": expect.any(String), + "ram.percent": expect.any(String), + cpu: expect.any(String), + load_1m: expect.any(String), + "node.role": expect.any(String), + ip: expect.any(String), + name: expect.any(String) + } + ]; + + const result = await catNodes.getNodes(); + + expect(result).toMatchObject(expected); + }); +}); diff --git a/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts b/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts new file mode 100644 index 00000000000..f3f173b0ea3 --- /dev/null +++ b/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts @@ -0,0 +1,205 @@ +import { createWaitUntilHealthy } from "~/utils/waitUntilHealthy"; +import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; +import { ElasticsearchCatHealthStatus } from "~/operations/types"; +import { UnhealthyClusterError } from "~/utils/waitUntilHealthy/UnhealthyClusterError"; +import { WaitingHealthyClusterAbortedError } from "~/utils/waitUntilHealthy/WaitingHealthyClusterAbortedError"; + +describe("wait until healthy", () => { + const client = createElasticsearchClient(); + + it("should wait until the cluster is healthy - single run", async () => { + const waitUntilHealthy = createWaitUntilHealthy(client, { + minStatus: ElasticsearchCatHealthStatus.Yellow, + maxProcessorPercent: 101, + maxWaitingTime: 30, + waitingTimeStep: 5, + maxRamPercent: 101 + }); + + const { runs, runningTime } = await waitUntilHealthy.wait(); + + expect(runs).toEqual(1); + expect(runningTime).toBeLessThan(30000); + }); + + it("should wait until the cluster is health - processor - max waiting time hit", async () => { + expect.assertions(2); + const waitUntilHealthy = createWaitUntilHealthy(client, { + minStatus: ElasticsearchCatHealthStatus.Yellow, + maxProcessorPercent: 1, + maxWaitingTime: 3, + waitingTimeStep: 1, + maxRamPercent: 99 + }); + + try { + await waitUntilHealthy.wait(); + } catch (ex) { + expect(ex).toBeInstanceOf(UnhealthyClusterError); + expect(ex.message).toEqual("Cluster did not become healthy in 3 seconds."); + } + }); + + it("should wait until the cluster is health - memory - max waiting time hit", async () => { + expect.assertions(2); + const waitUntilHealthy = createWaitUntilHealthy(client, { + minStatus: ElasticsearchCatHealthStatus.Yellow, + maxProcessorPercent: 99, + maxWaitingTime: 3, + waitingTimeStep: 1, + maxRamPercent: 1 + }); + + try { + const { runs } = await waitUntilHealthy.wait(); + expect(runs).toEqual("reaching here would fail the test"); + } catch (ex) { + expect(ex).toBeInstanceOf(UnhealthyClusterError); + expect(ex.message).toEqual("Cluster did not become healthy in 3 seconds."); + } + }); + + it("should trigger onUnhealthy callback - once", async () => { + expect.assertions(2); + const waitUntilHealthy = createWaitUntilHealthy(client, { + minStatus: ElasticsearchCatHealthStatus.Green, + maxProcessorPercent: 1, + maxWaitingTime: 1, + waitingTimeStep: 3, + maxRamPercent: 1 + }); + + const onUnhealthy = jest.fn(); + + try { + const { runs } = await waitUntilHealthy.wait({ + async onUnhealthy() { + onUnhealthy(); + } + }); + expect(runs).toEqual("reaching here would fail the test"); + } catch (ex) { + expect(ex).toBeInstanceOf(UnhealthyClusterError); + } + + expect(onUnhealthy).toHaveBeenCalledTimes(1); + }); + + it("should trigger onUnhealthy callback - multiple times", async () => { + expect.assertions(2); + const waitUntilHealthy = createWaitUntilHealthy(client, { + minStatus: ElasticsearchCatHealthStatus.Green, + maxProcessorPercent: 1, + maxWaitingTime: 3, + waitingTimeStep: 1, + maxRamPercent: 1 + }); + + const onUnhealthy = jest.fn(); + + try { + const { runs } = await waitUntilHealthy.wait({ + async onUnhealthy() { + onUnhealthy(); + } + }); + expect(runs).toEqual("reaching here would fail the test"); + } catch (ex) { + expect(ex).toBeInstanceOf(UnhealthyClusterError); + } + + expect(onUnhealthy).toHaveBeenCalledTimes(3); + }); + + it("should trigger onTimeout callback - once", async () => { + expect.assertions(3); + const waitUntilHealthy = createWaitUntilHealthy(client, { + minStatus: ElasticsearchCatHealthStatus.Green, + maxProcessorPercent: 1, + maxWaitingTime: 3, + waitingTimeStep: 1, + maxRamPercent: 1 + }); + + const onUnhealthy = jest.fn(); + const onTimeout = jest.fn(); + + try { + const { runs } = await waitUntilHealthy.wait({ + async onUnhealthy() { + onUnhealthy(); + }, + async onTimeout() { + onTimeout(); + } + }); + expect(runs).toEqual("reaching here would fail the test"); + } catch (ex) { + expect(ex).toBeInstanceOf(UnhealthyClusterError); + } + + expect(onUnhealthy).toHaveBeenCalledTimes(3); + expect(onTimeout).toHaveBeenCalledTimes(1); + }); + + it("should trigger abort even before the checks start", async () => { + expect.assertions(3); + const waitUntilHealthy = createWaitUntilHealthy(client, { + minStatus: ElasticsearchCatHealthStatus.Green, + maxProcessorPercent: 1, + maxWaitingTime: 1, + waitingTimeStep: 3, + maxRamPercent: 1 + }); + + waitUntilHealthy.abort(); + + const onUnhealthy = jest.fn(); + const onTimeout = jest.fn(); + + try { + const { runs } = await waitUntilHealthy.wait({ + async onUnhealthy() { + onUnhealthy(); + waitUntilHealthy.abort(); + }, + async onTimeout() { + onTimeout(); + } + }); + expect(runs).toEqual("reaching here would fail the test"); + } catch (ex) { + expect(ex).toBeInstanceOf(WaitingHealthyClusterAbortedError); + } + + expect(onUnhealthy).toHaveBeenCalledTimes(0); + expect(onTimeout).toHaveBeenCalledTimes(0); + }); + + it("should trigger abort in onUnhealthy callback", async () => { + expect.assertions(2); + const waitUntilHealthy = createWaitUntilHealthy(client, { + minStatus: ElasticsearchCatHealthStatus.Green, + maxProcessorPercent: 1, + maxWaitingTime: 1, + waitingTimeStep: 3, + maxRamPercent: 1 + }); + + const onUnhealthy = jest.fn(); + + try { + const { runs } = await waitUntilHealthy.wait({ + async onUnhealthy() { + onUnhealthy(); + waitUntilHealthy.abort(); + } + }); + expect(runs).toEqual("reaching here would fail the test"); + } catch (ex) { + expect(ex).toBeInstanceOf(WaitingHealthyClusterAbortedError); + } + + expect(onUnhealthy).toHaveBeenCalledTimes(1); + }); +}); diff --git a/packages/api-elasticsearch/src/index.ts b/packages/api-elasticsearch/src/index.ts index 7091611b642..45658c6da58 100644 --- a/packages/api-elasticsearch/src/index.ts +++ b/packages/api-elasticsearch/src/index.ts @@ -20,6 +20,7 @@ export * from "./operators"; export * from "./cursors"; export * from "./client"; export * from "./utils"; +export * from "./operations"; export { createGzipCompression } from "./plugins/GzipCompression"; /** diff --git a/packages/api-elasticsearch/src/operations/ElasticsearchCatHealth.ts b/packages/api-elasticsearch/src/operations/ElasticsearchCatHealth.ts new file mode 100644 index 00000000000..fcf1e17e51a --- /dev/null +++ b/packages/api-elasticsearch/src/operations/ElasticsearchCatHealth.ts @@ -0,0 +1,39 @@ +import { WebinyError } from "@webiny/error"; +import { Client } from "~/client"; +import { IElasticsearchCatHealthResponse } from "./types"; +import { stripConnectionFromException } from "~/operations/stripConnectionFromException"; + +export class ElasticsearchCatHealth { + private readonly client: Client; + + public constructor(client: Client) { + this.client = client; + } + + public async getHealth(): Promise { + try { + const response = await this.client.cat.health< + unknown | [IElasticsearchCatHealthResponse] + >({ + format: "json" + }); + + if (!Array.isArray(response.body) || response.body.length === 0) { + throw new WebinyError({ + message: `There is no valid response from cat.health operation.`, + code: "ELASTICSEARCH_HEALTH_INVALID_RESPONSE", + data: response.body + }); + } + + return { + ...response.body[0] + }; + } catch (ex) { + console.error(`Could not fetch cluster health information: ${ex.message}`); + const error = stripConnectionFromException(ex); + console.log(JSON.stringify(error)); + throw error; + } + } +} diff --git a/packages/api-elasticsearch/src/operations/ElasticsearchCatNodes.ts b/packages/api-elasticsearch/src/operations/ElasticsearchCatNodes.ts new file mode 100644 index 00000000000..0167e3c1fe8 --- /dev/null +++ b/packages/api-elasticsearch/src/operations/ElasticsearchCatNodes.ts @@ -0,0 +1,33 @@ +import { IElasticsearchCatNodesResponse } from "./types"; +import { Client } from "~/client"; +import { WebinyError } from "@webiny/error"; +import { stripConnectionFromException } from "~/operations/stripConnectionFromException"; + +export class ElasticsearchCatNodes { + private readonly client: Client; + + public constructor(client: Client) { + this.client = client; + } + + public async getNodes(): Promise { + try { + const response = await this.client.cat.nodes({ + format: "json" + }); + if (!Array.isArray(response.body) || response.body.length === 0) { + throw new WebinyError({ + message: `There is no valid response from cat.nodes operation.`, + code: "ELASTICSEARCH_NODES_INVALID_RESPONSE", + data: response.body + }); + } + return response.body; + } catch (ex) { + console.error(`Could not fetch cluster nodes information: ${ex.message}`); + const error = stripConnectionFromException(ex); + console.log(JSON.stringify(error)); + throw error; + } + } +} diff --git a/packages/api-elasticsearch/src/operations/index.ts b/packages/api-elasticsearch/src/operations/index.ts new file mode 100644 index 00000000000..c0d0520fb51 --- /dev/null +++ b/packages/api-elasticsearch/src/operations/index.ts @@ -0,0 +1,2 @@ +export * from "./ElasticsearchCatHealth"; +export * from "./ElasticsearchCatNodes"; diff --git a/packages/api-elasticsearch/src/operations/stripConnectionFromException.ts b/packages/api-elasticsearch/src/operations/stripConnectionFromException.ts new file mode 100644 index 00000000000..a45047820a0 --- /dev/null +++ b/packages/api-elasticsearch/src/operations/stripConnectionFromException.ts @@ -0,0 +1,15 @@ +export const stripConnectionFromException = (ex: any): any => { + if (typeof ex !== "object") { + return ex; + } + if (!ex?.meta?.meta?.connection) { + return ex; + } + return { + ...ex.meta, + meta: { + ...ex.meta.meta, + connection: null + } + }; +}; diff --git a/packages/api-elasticsearch/src/operations/types.ts b/packages/api-elasticsearch/src/operations/types.ts new file mode 100644 index 00000000000..cfc8decc94c --- /dev/null +++ b/packages/api-elasticsearch/src/operations/types.ts @@ -0,0 +1,38 @@ +export enum ElasticsearchCatHealthStatus { + Green = "green", + Yellow = "yellow", + Red = "red" +} + +export interface IElasticsearchCatHealthResponse { + epoch: number; + timestamp: `${number}:${number}:${number}`; + cluster: string; + status: ElasticsearchCatHealthStatus; + "node.total": `${number}`; + "node.data": `${number}`; + shards: `${number}`; + pri: `${number}`; + relo: `${number}`; + init: `${number}`; + unassign: `${number}`; + pending_tasks: `${number}`; + max_task_wait_time: string; + active_shards_percent: `${number}%`; + discovered_cluster_manager?: `${boolean}`; +} + +export interface IElasticsearchCatNodeResponse { + ip: string; + "heap.percent": `${number}`; + "ram.percent": `${number}`; + cpu: `${number}`; + load_1m: `${number}` | null; + load_5m: `${number}` | null; + load_15m: `${number}` | null; + "node.role": string; + master?: string; + name: string; +} + +export type IElasticsearchCatNodesResponse = IElasticsearchCatNodeResponse[]; diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/UnhealthyClusterError.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/UnhealthyClusterError.ts new file mode 100644 index 00000000000..564441f16ed --- /dev/null +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/UnhealthyClusterError.ts @@ -0,0 +1,10 @@ +import { WebinyError } from "@webiny/error"; + +export class UnhealthyClusterError extends WebinyError { + public constructor(maxWaitingTime: number) { + super({ + message: `Cluster did not become healthy in ${maxWaitingTime} seconds.`, + code: "UNHEALTHY_CLUSTER" + }); + } +} diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitUntilHealthy.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitUntilHealthy.ts new file mode 100644 index 00000000000..f8bef386cfe --- /dev/null +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitUntilHealthy.ts @@ -0,0 +1,186 @@ +import { Client } from "~/client"; +import { ElasticsearchCatHealth } from "~/operations/ElasticsearchCatHealth"; +import { ElasticsearchCatNodes } from "~/operations/ElasticsearchCatNodes"; +import { ElasticsearchCatHealthStatus, IElasticsearchCatNodesResponse } from "~/operations/types"; +import { UnhealthyClusterError } from "~/utils/waitUntilHealthy/UnhealthyClusterError"; +import { WaitingHealthyClusterAbortedError } from "./WaitingHealthyClusterAbortedError"; + +const WAITING_TIME_STEP = 10; + +export interface IWaitUntilHealthyParams { + /** + * Minimum status allowed, otherwise the cluster is considered unhealthy. + */ + minStatus: ElasticsearchCatHealthStatus.Green | ElasticsearchCatHealthStatus.Yellow; + /** + * Maximum processor percent allowed, otherwise the cluster is considered unhealthy. + */ + maxProcessorPercent: number; + /** + * Maximum RAM percent allowed, otherwise the cluster is considered unhealthy. + */ + maxRamPercent: number; + /** + * Maximum time to wait in seconds. + * This is to prevent infinite waiting in case the cluster never becomes healthy. + */ + maxWaitingTime: number; + /** + * Time in seconds to wait between each check. + * This is to prevent spamming the cluster with requests. + * Default is WAITING_TIME_STEP seconds. + */ + waitingTimeStep?: number; +} + +export interface IWaitOptionsOnUnhealthyParams { + startedAt: Date; + mustEndAt: Date; + waitingTimeStep: number; + runs: number; +} + +export interface IWaitOptionsOnTimeoutParams { + startedAt: Date; + mustEndAt: Date; + waitingTimeStep: number; + runs: number; +} + +export interface IWaitOptions { + onUnhealthy?(params: IWaitOptionsOnUnhealthyParams): Promise; + onTimeout?(params: IWaitOptionsOnTimeoutParams): Promise; +} + +export interface IWaitUntilHealthyWaitResponse { + runningTime: number; + runs: number; +} + +class WaitUntilHealthy { + private readonly client: Client; + private readonly options: IWaitUntilHealthyParams; + + private readonly catHealth: ElasticsearchCatHealth; + private readonly catNodes: ElasticsearchCatNodes; + + private aborted = false; + + public constructor(client: Client, options: IWaitUntilHealthyParams) { + this.client = client; + this.options = options; + + this.catHealth = new ElasticsearchCatHealth(this.client); + this.catNodes = new ElasticsearchCatNodes(this.client); + } + + public abort(): void { + this.aborted = true; + } + /** + * @throws UnhealthyClusterError + * @throws WaitingHealthyClusterAbortedError + */ + public async wait(options?: IWaitOptions): Promise { + if (this.aborted) { + throw new WaitingHealthyClusterAbortedError( + `Waiting for the cluster to become healthy was aborted even before it started.` + ); + } + const startedAt = new Date(); + const mustEndAt = new Date(startedAt.getTime() + this.options.maxWaitingTime * 1000); + const waitingTimeStep = this.options.waitingTimeStep || WAITING_TIME_STEP; + let runs = 1; + while (await this.shouldWait()) { + if (new Date() >= mustEndAt) { + if (options?.onTimeout) { + await options.onTimeout({ + startedAt, + mustEndAt, + waitingTimeStep, + runs + }); + } + throw new UnhealthyClusterError(this.options.maxWaitingTime); + } else if (options?.onUnhealthy) { + await options.onUnhealthy({ + startedAt, + mustEndAt, + waitingTimeStep, + runs + }); + } + /** + * Abort check is separated from other IFs because it can be aborted in onUnhealthy callback. + */ + if (this.aborted) { + throw new WaitingHealthyClusterAbortedError(); + } + runs++; + await new Promise(resolve => { + setTimeout(resolve, waitingTimeStep * 1000); + }); + } + + const runningTime = new Date().getTime() - startedAt.getTime(); + + return { + runningTime, + runs + }; + } + + private async shouldWait(): Promise { + const health = await this.catHealth.getHealth(); + const nodes = await this.catNodes.getNodes(); + + const status = this.transformStatus(health.status); + if (status > this.transformStatus(this.options.minStatus)) { + return true; + } + + const processorPercent = this.getProcessorPercent(nodes); + if (processorPercent > this.options.maxProcessorPercent) { + return true; + } + + const ramPercent = this.getRamPercent(nodes); + return ramPercent > this.options.maxRamPercent; + } + + private getProcessorPercent(nodes: IElasticsearchCatNodesResponse): number { + const total = nodes.reduce((total, node) => { + return total + parseFloat(node.cpu); + }, 0); + return total / nodes.length; + } + + private getRamPercent(nodes: IElasticsearchCatNodesResponse): number { + const total = nodes.reduce((total, node) => { + return total + parseFloat(node["ram.percent"]); + }, 0); + return total / nodes.length; + } + + private transformStatus(status: ElasticsearchCatHealthStatus): number { + switch (status) { + case ElasticsearchCatHealthStatus.Green: + return 1; + case ElasticsearchCatHealthStatus.Yellow: + return 2; + case ElasticsearchCatHealthStatus.Red: + return 3; + default: + return 99; + } + } +} + +export type { WaitUntilHealthy }; + +export const createWaitUntilHealthy = ( + client: Client, + params: IWaitUntilHealthyParams +): WaitUntilHealthy => { + return new WaitUntilHealthy(client, params); +}; diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitingHealthyClusterAbortedError.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitingHealthyClusterAbortedError.ts new file mode 100644 index 00000000000..9c902943d43 --- /dev/null +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitingHealthyClusterAbortedError.ts @@ -0,0 +1,10 @@ +import { WebinyError } from "@webiny/error"; + +export class WaitingHealthyClusterAbortedError extends WebinyError { + public constructor(message?: string) { + super({ + message: message || `Waiting for the cluster to become healthy was aborted.`, + code: "WAITING_HEALTHY_CLUSTER_ABORTED" + }); + } +} diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/index.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/index.ts new file mode 100644 index 00000000000..b260b1e9f80 --- /dev/null +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/index.ts @@ -0,0 +1 @@ +export * from "./WaitUntilHealthy"; diff --git a/packages/error/src/index.ts b/packages/error/src/index.ts index 08b57ea358d..d1bc2f140a4 100644 --- a/packages/error/src/index.ts +++ b/packages/error/src/index.ts @@ -1,4 +1,5 @@ import Error, { ErrorOptions } from "./Error"; export default Error; +export { Error as WebinyError }; export { ErrorOptions }; From dd80b513c52fb53679036ea7e64e9849fdfd3732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Zori=C4=87?= Date: Mon, 3 Jun 2024 15:55:02 +0200 Subject: [PATCH 10/26] fix(api-headless-cms): reference field id is now RevisionId scalar (#4148) --- .../__tests__/utils/plugins.ts | 7 ++- .../__tests__/useGqlHandler.ts | 10 +++- .../contentEntry.crud.validation.test.ts | 10 ++-- .../contentAPI/revisionIdScalar.test.ts | 56 +++++++++++++++++++ packages/api-headless-cms/package.json | 2 +- .../contentEntry/referenceFieldsMapping.ts | 2 +- .../src/graphql/scalars/RevisionId.ts | 22 ++++++++ .../graphql/scalars/RevisionIdScalarPlugin.ts | 11 ++++ .../src/graphql/schema/baseContentSchema.ts | 12 ++-- .../api-headless-cms/src/graphqlFields/ref.ts | 2 +- packages/api-headless-cms/src/index.ts | 2 + 11 files changed, 119 insertions(+), 17 deletions(-) create mode 100644 packages/api-headless-cms/__tests__/contentAPI/revisionIdScalar.test.ts create mode 100644 packages/api-headless-cms/src/graphql/scalars/RevisionId.ts create mode 100644 packages/api-headless-cms/src/graphql/scalars/RevisionIdScalarPlugin.ts diff --git a/packages/api-file-manager/__tests__/utils/plugins.ts b/packages/api-file-manager/__tests__/utils/plugins.ts index e05808b2460..c26466bfb44 100644 --- a/packages/api-file-manager/__tests__/utils/plugins.ts +++ b/packages/api-file-manager/__tests__/utils/plugins.ts @@ -2,7 +2,11 @@ import graphqlHandlerPlugins from "@webiny/handler-graphql"; import { createTenancyAndSecurity } from "~tests/utils/tenancySecurity"; import i18nContext from "@webiny/api-i18n/graphql/context"; import { mockLocalesPlugins } from "@webiny/api-i18n/graphql/testing"; -import { CmsParametersPlugin, createHeadlessCmsContext } from "@webiny/api-headless-cms"; +import { + CmsParametersPlugin, + createHeadlessCmsContext, + createHeadlessCmsGraphQL +} from "@webiny/api-headless-cms"; import { createFileManagerContext, createFileManagerGraphQL, @@ -44,6 +48,7 @@ export const handlerPlugins = (params: HandlerParams) => { }; }), createHeadlessCmsContext({ storageOperations: cmsStorage.storageOperations }), + createHeadlessCmsGraphQL(), createFileManagerContext({ storageOperations: fileManagerStorage.storageOperations }), diff --git a/packages/api-form-builder/__tests__/useGqlHandler.ts b/packages/api-form-builder/__tests__/useGqlHandler.ts index c435b2e9efc..0d6a8108469 100644 --- a/packages/api-form-builder/__tests__/useGqlHandler.ts +++ b/packages/api-form-builder/__tests__/useGqlHandler.ts @@ -41,10 +41,15 @@ import { PluginCollection } from "@webiny/plugins/types"; import { getStorageOps } from "@webiny/project-utils/testing/environment"; import { FileManagerStorageOperations } from "@webiny/api-file-manager/types"; import { HeadlessCmsStorageOperations } from "@webiny/api-headless-cms/types"; -import { CmsParametersPlugin, createHeadlessCmsContext } from "@webiny/api-headless-cms"; +import { + CmsParametersPlugin, + createHeadlessCmsContext, + createHeadlessCmsGraphQL +} from "@webiny/api-headless-cms"; import { FormBuilderStorageOperations } from "~/types"; import { APIGatewayEvent, LambdaContext } from "@webiny/handler-aws/types"; import { createPageBuilderContext } from "@webiny/api-page-builder"; +import { PageBuilderStorageOperations } from "@webiny/api-page-builder/types"; export interface UseGqlHandlerParams { permissions?: SecurityPermission[]; @@ -65,7 +70,7 @@ export default (params: UseGqlHandlerParams = {}) => { const { permissions, identity, plugins = [] } = params; const i18nStorage = getStorageOps("i18n"); const fileManagerStorage = getStorageOps("fileManager"); - const pageBuilderStorage = getStorageOps("pageBuilder"); + const pageBuilderStorage = getStorageOps("pageBuilder"); const formBuilderStorage = getStorageOps("formBuilder"); const cmsStorage = getStorageOps("cms"); @@ -87,6 +92,7 @@ export default (params: UseGqlHandlerParams = {}) => { }; }), createHeadlessCmsContext({ storageOperations: cmsStorage.storageOperations }), + createHeadlessCmsGraphQL(), createPageBuilderContext({ storageOperations: pageBuilderStorage.storageOperations }), diff --git a/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.crud.validation.test.ts b/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.crud.validation.test.ts index e71af68ae09..75da9a6d734 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.crud.validation.test.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/cmsEntryValidation/contentEntry.crud.validation.test.ts @@ -346,7 +346,7 @@ describe("content entry validation", () => { xyzPublishedOn: "2023-01-01T00:00:00.000+00:00", image: "https://webiny.com/image.png", category: { - id: "category-1", + id: "category-1#0001", modelId: "category" }, nested: { @@ -365,7 +365,7 @@ describe("content entry validation", () => { nestedXyzPublishedOn: "2022-01-01T00:00:00.000+02:00", nestedImage: "https://webiny.com/image2.png", nestedCategory: { - id: "category-2", + id: "category-2#0001", modelId: "category" } }, @@ -386,7 +386,7 @@ describe("content entry validation", () => { dzXyzPublishedOn: "2021-01-01T00:00:00.000+02:00", dzImage: "https://webiny.com/image2.png", dzCategory: { - id: "category-3", + id: "category-3#0001", modelId: "category" }, dzNested: { @@ -405,7 +405,7 @@ describe("content entry validation", () => { dzNestedXyzPublishedOn: "2021-01-01T00:00:00.000+02:00", dzNestedImage: "https://webiny.com/image2.png", dzNestedCategory: { - id: "category-4", + id: "category-4#0001", modelId: "category" } } @@ -427,7 +427,7 @@ describe("content entry validation", () => { multiValueXyzPublishedOn: "2021-01-01T00:00:00.000+02:00", multiValueImage: "https://webiny.com/image2.png", multiValueCategory: { - id: "category-11", + id: "category-11#0001", modelId: "category" } } diff --git a/packages/api-headless-cms/__tests__/contentAPI/revisionIdScalar.test.ts b/packages/api-headless-cms/__tests__/contentAPI/revisionIdScalar.test.ts new file mode 100644 index 00000000000..66cf883ec51 --- /dev/null +++ b/packages/api-headless-cms/__tests__/contentAPI/revisionIdScalar.test.ts @@ -0,0 +1,56 @@ +import { createContentModelGroup } from "~tests/contentAPI/mocks/contentModelGroup"; +import models from "~tests/contentAPI/mocks/contentModels"; +import { CmsGroup, CmsModel } from "~/types"; +import { useArticleManageHandler } from "~tests/testHelpers/useArticleManageHandler"; + +describe("revision id scalar", () => { + const manageHandlerOpts = { path: "manage/en-US" }; + + const { createContentModelGroupMutation, createContentModelMutation, createArticle } = + useArticleManageHandler(manageHandlerOpts); + + let group: CmsGroup; + + beforeEach(async () => { + const [result] = await createContentModelGroupMutation({ + data: createContentModelGroup() + }); + group = result.data.createContentModelGroup.data; + + const articleModel = models.find(m => m.modelId === "article") as CmsModel; + + await createContentModelMutation({ + data: { + name: articleModel.name, + modelId: articleModel.modelId, + singularApiName: articleModel.singularApiName, + pluralApiName: articleModel.pluralApiName, + fields: articleModel.fields, + description: "This is a description.", + icon: "fa/fas", + group: group.id + } + }); + }); + + it("should fail when sending malformed revision id into the ref field", async () => { + const [result] = await createArticle({ + data: { + category: { + modelId: "category", + id: "abdefghijklmnopqrstuvwxyz" + } + } + }); + const message = `Variable "$data" got invalid value "abdefghijklmnopqrstuvwxyz" at "data.category.id"; Expected type "RevisionId". RevisionId value must be a valid Revision ID property! Example: "abcdef#0001"`; + expect(result).toMatchObject({ + errors: [ + { + message + } + ] + }); + expect(result.errors).toHaveLength(1); + expect(result.errors[0].message).toEqual(message); + }); +}); diff --git a/packages/api-headless-cms/package.json b/packages/api-headless-cms/package.json index 4d67bf00a7d..cddf33fc297 100644 --- a/packages/api-headless-cms/package.json +++ b/packages/api-headless-cms/package.json @@ -36,6 +36,7 @@ "@webiny/validation": "0.0.0", "code-frame": "^5.0.0", "dot-prop": "^6.0.1", + "graphql": "^15.7.2", "graphql-tag": "^2.12.6", "jsdom": "21.1.2", "lodash": "^4.5.0", @@ -55,7 +56,6 @@ "@webiny/project-utils": "0.0.0", "apollo-graphql": "^0.9.5", "get-yarn-workspaces": "^1.0.2", - "graphql": "^15.7.2", "jest": "^29.5.0", "prettier": "^2.8.3", "rimraf": "^3.0.2", diff --git a/packages/api-headless-cms/src/crud/contentEntry/referenceFieldsMapping.ts b/packages/api-headless-cms/src/crud/contentEntry/referenceFieldsMapping.ts index 0420170c6ba..4fa1fe42440 100644 --- a/packages/api-headless-cms/src/crud/contentEntry/referenceFieldsMapping.ts +++ b/packages/api-headless-cms/src/crud/contentEntry/referenceFieldsMapping.ts @@ -321,7 +321,7 @@ async function validateReferencedEntries({ referencesByModel.forEach((ids, modelId) => { const modelEntriesInDb = entriesByModel[modelId]; for (const id of ids) { - if (!modelEntriesInDb.includes(id)) { + if (!modelEntriesInDb || !modelEntriesInDb.includes(id)) { throw new WebinyError( `Missing referenced entry with id "${id}" in model "${modelId}".`, "ENTRY_NOT_FOUND", diff --git a/packages/api-headless-cms/src/graphql/scalars/RevisionId.ts b/packages/api-headless-cms/src/graphql/scalars/RevisionId.ts new file mode 100644 index 00000000000..6f61932f41a --- /dev/null +++ b/packages/api-headless-cms/src/graphql/scalars/RevisionId.ts @@ -0,0 +1,22 @@ +import { GraphQLScalarType } from "graphql"; +import { parseIdentifier } from "@webiny/utils"; + +export const RevisionIdScalar = new GraphQLScalarType({ + name: "RevisionId", + description: "A Headless CMS Reference field input type.", + parseValue: value => { + if (!value) { + return null; + } else if (typeof value !== "string") { + throw new Error("RevisionId value must be a string!"); + } + + const result = parseIdentifier(value); + if (!result.version) { + throw new Error( + `RevisionId value must be a valid Revision ID property! Example: "abcdef#0001"` + ); + } + return value; + } +}); diff --git a/packages/api-headless-cms/src/graphql/scalars/RevisionIdScalarPlugin.ts b/packages/api-headless-cms/src/graphql/scalars/RevisionIdScalarPlugin.ts new file mode 100644 index 00000000000..d1ba26cbaaa --- /dev/null +++ b/packages/api-headless-cms/src/graphql/scalars/RevisionIdScalarPlugin.ts @@ -0,0 +1,11 @@ +import { GraphQLScalarPlugin } from "@webiny/handler-graphql/types"; +import { RevisionIdScalar } from "~/graphql/scalars/RevisionId"; + +export const createRevisionIdScalarPlugin = (): GraphQLScalarPlugin[] => { + const plugin: GraphQLScalarPlugin = { + name: "headlessCms.graphql.revisionIdScalar", + type: "graphql-scalar", + scalar: RevisionIdScalar + }; + return [plugin]; +}; diff --git a/packages/api-headless-cms/src/graphql/schema/baseContentSchema.ts b/packages/api-headless-cms/src/graphql/schema/baseContentSchema.ts index a8693fa4100..8a4d70a74e0 100644 --- a/packages/api-headless-cms/src/graphql/schema/baseContentSchema.ts +++ b/packages/api-headless-cms/src/graphql/schema/baseContentSchema.ts @@ -1,15 +1,15 @@ import { GraphQLScalarPlugin } from "@webiny/handler-graphql/types"; import { CmsContext } from "~/types"; import { - RefInputScalar, - NumberScalar, AnyScalar, - DateTimeScalar, DateScalar, - TimeScalar, - LongScalar, + DateTimeScalar, + DateTimeZScalar, JsonScalar, - DateTimeZScalar + LongScalar, + NumberScalar, + RefInputScalar, + TimeScalar } from "@webiny/handler-graphql/builtInTypes"; import { GraphQLScalarType } from "graphql"; import { CmsGraphQLSchemaPlugin } from "~/plugins"; diff --git a/packages/api-headless-cms/src/graphqlFields/ref.ts b/packages/api-headless-cms/src/graphqlFields/ref.ts index 96db1095c07..edd7894f473 100644 --- a/packages/api-headless-cms/src/graphqlFields/ref.ts +++ b/packages/api-headless-cms/src/graphqlFields/ref.ts @@ -274,7 +274,7 @@ export const createRefField = (): CmsModelFieldToGraphQLPlugin => { input RefFieldInput { modelId: String! - id: ID! + id: RevisionId! } ${createFilteringTypeDef()} diff --git a/packages/api-headless-cms/src/index.ts b/packages/api-headless-cms/src/index.ts index 61df7685a6b..1d9df68fffc 100644 --- a/packages/api-headless-cms/src/index.ts +++ b/packages/api-headless-cms/src/index.ts @@ -18,12 +18,14 @@ import { createFieldConverters } from "~/fieldConverters"; import { createExportGraphQL } from "~/export"; import { createStorageTransform } from "~/storage"; import { createLexicalHTMLRenderer } from "./htmlRenderer/createLexicalHTMLRenderer"; +import { createRevisionIdScalarPlugin } from "~/graphql/scalars/RevisionIdScalarPlugin"; export * from "./utils/isHeadlessCmsReady"; export * from "./utils/createModelField"; export type CreateHeadlessCmsGraphQLParams = CreateGraphQLParams; export const createHeadlessCmsGraphQL = (params: CreateHeadlessCmsGraphQLParams = {}) => { return [ + createRevisionIdScalarPlugin(), /** * PathParameter plugins are used to determine the type of the cms endpoint */ From 3c3a88b867fe9be4123186261c8921dfafa661e0 Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Tue, 4 Jun 2024 14:27:51 +0200 Subject: [PATCH 11/26] fix(app-page-builder): enable history snapshots on element drop --- packages/app-page-builder/src/editor/helpers.ts | 3 ++- .../src/pageEditor/config/eventActions/updatePageAction.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/app-page-builder/src/editor/helpers.ts b/packages/app-page-builder/src/editor/helpers.ts index 75134295f18..97e104dca8f 100644 --- a/packages/app-page-builder/src/editor/helpers.ts +++ b/packages/app-page-builder/src/editor/helpers.ts @@ -302,7 +302,8 @@ export const onReceived: PbEditorPageElementPlugin["onReceived"] = props => { const result = executeAction(state, meta, updateElementAction, { element: parent, - history: false + // Dropping of elements should always be stored to history, to trigger document save. + history: true }); result.actions.push(new AfterDropElementActionEvent({ element })); diff --git a/packages/app-page-builder/src/pageEditor/config/eventActions/updatePageAction.ts b/packages/app-page-builder/src/pageEditor/config/eventActions/updatePageAction.ts index 594e9f30326..6c427dbcfa1 100644 --- a/packages/app-page-builder/src/pageEditor/config/eventActions/updatePageAction.ts +++ b/packages/app-page-builder/src/pageEditor/config/eventActions/updatePageAction.ts @@ -15,7 +15,7 @@ export const updatePageAction: PageEventActionCallable< }, actions: [ new SaveRevisionActionEvent({ - debounce: args?.debounce || false, + debounce: args?.debounce ?? true, onFinish: args?.onFinish }) ] From 91554b62d20170d4a81a7a49bcce35d4697d3de1 Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Fri, 7 Jun 2024 10:43:59 +0200 Subject: [PATCH 12/26] fix(aws-layers): add layers to ap-east-1 region --- packages/aws-layers/layers.json | 66 +++++++++++++++++---------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/packages/aws-layers/layers.json b/packages/aws-layers/layers.json index d3d18b84c0e..774996d7dcc 100644 --- a/packages/aws-layers/layers.json +++ b/packages/aws-layers/layers.json @@ -18,39 +18,41 @@ "sa-east-1": "arn:aws:lambda:sa-east-1:632417926021:layer:webiny-v4-sharp:1" }, "shelf-io-chrome-aws-lambda-layer": { - "ap-northeast-1": "arn:aws:lambda:ap-northeast-1:764866452798:layer:chrome-aws-lambda:45", - "ap-northeast-2": "arn:aws:lambda:ap-northeast-2:764866452798:layer:chrome-aws-lambda:45", - "ap-south-1": "arn:aws:lambda:ap-south-1:764866452798:layer:chrome-aws-lambda:45", - "ap-southeast-1": "arn:aws:lambda:ap-southeast-1:764866452798:layer:chrome-aws-lambda:45", - "ap-southeast-2": "arn:aws:lambda:ap-southeast-2:764866452798:layer:chrome-aws-lambda:45", - "ca-central-1": "arn:aws:lambda:ca-central-1:764866452798:layer:chrome-aws-lambda:45", - "eu-north-1": "arn:aws:lambda:eu-north-1:764866452798:layer:chrome-aws-lambda:45", - "eu-central-1": "arn:aws:lambda:eu-central-1:764866452798:layer:chrome-aws-lambda:45", - "eu-west-1": "arn:aws:lambda:eu-west-1:764866452798:layer:chrome-aws-lambda:45", - "eu-west-2": "arn:aws:lambda:eu-west-2:764866452798:layer:chrome-aws-lambda:45", - "eu-west-3": "arn:aws:lambda:eu-west-3:764866452798:layer:chrome-aws-lambda:45", - "sa-east-1": "arn:aws:lambda:sa-east-1:764866452798:layer:chrome-aws-lambda:45", - "us-east-1": "arn:aws:lambda:us-east-1:764866452798:layer:chrome-aws-lambda:45", - "us-east-2": "arn:aws:lambda:us-east-2:764866452798:layer:chrome-aws-lambda:45", - "us-west-1": "arn:aws:lambda:us-west-1:764866452798:layer:chrome-aws-lambda:45", - "us-west-2": "arn:aws:lambda:us-west-2:764866452798:layer:chrome-aws-lambda:45" + "us-east-1": "arn:aws:lambda:us-east-1:632417926021:layer:chromium:1", + "us-east-2": "arn:aws:lambda:us-east-2:632417926021:layer:chromium:1", + "us-west-1": "arn:aws:lambda:us-west-1:632417926021:layer:chromium:1", + "us-west-2": "arn:aws:lambda:us-west-2:632417926021:layer:chromium:1", + "ap-south-1": "arn:aws:lambda:ap-south-1:632417926021:layer:chromium:1", + "ap-northeast-2": "arn:aws:lambda:ap-northeast-2:632417926021:layer:chromium:1", + "ap-southeast-1": "arn:aws:lambda:ap-southeast-1:632417926021:layer:chromium:1", + "ap-southeast-2": "arn:aws:lambda:ap-southeast-2:632417926021:layer:chromium:1", + "ap-northeast-1": "arn:aws:lambda:ap-northeast-1:632417926021:layer:chromium:1", + "ca-central-1": "arn:aws:lambda:ca-central-1:632417926021:layer:chromium:1", + "eu-central-1": "arn:aws:lambda:eu-central-1:632417926021:layer:chromium:1", + "eu-west-1": "arn:aws:lambda:eu-west-1:632417926021:layer:chromium:1", + "eu-west-2": "arn:aws:lambda:eu-west-2:632417926021:layer:chromium:1", + "eu-west-3": "arn:aws:lambda:eu-west-3:632417926021:layer:chromium:1", + "eu-north-1": "arn:aws:lambda:eu-north-1:632417926021:layer:chromium:1", + "sa-east-1": "arn:aws:lambda:sa-east-1:632417926021:layer:chromium:1", + "ap-east-1": "arn:aws:lambda:ap-east-1:632417926021:layer:chromium:1" }, "sharp": { - "us-east-1": "arn:aws:lambda:us-east-1:632417926021:layer:sharp:11", - "us-east-2": "arn:aws:lambda:us-east-2:632417926021:layer:sharp:2", - "us-west-1": "arn:aws:lambda:us-west-1:632417926021:layer:sharp:2", - "us-west-2": "arn:aws:lambda:us-west-2:632417926021:layer:sharp:2", - "ap-south-1": "arn:aws:lambda:ap-south-1:632417926021:layer:sharp:2", - "ap-northeast-2": "arn:aws:lambda:ap-northeast-2:632417926021:layer:sharp:2", - "ap-southeast-1": "arn:aws:lambda:ap-southeast-1:632417926021:layer:sharp:2", - "ap-southeast-2": "arn:aws:lambda:ap-southeast-2:632417926021:layer:sharp:2", - "ap-northeast-1": "arn:aws:lambda:ap-northeast-1:632417926021:layer:sharp:2", - "ca-central-1": "arn:aws:lambda:ca-central-1:632417926021:layer:sharp:2", - "eu-central-1": "arn:aws:lambda:eu-central-1:632417926021:layer:sharp:2", - "eu-west-1": "arn:aws:lambda:eu-west-1:632417926021:layer:sharp:2", - "eu-west-2": "arn:aws:lambda:eu-west-2:632417926021:layer:sharp:3", - "eu-west-3": "arn:aws:lambda:eu-west-3:632417926021:layer:sharp:2", - "eu-north-1": "arn:aws:lambda:eu-north-1:632417926021:layer:sharp:2", - "sa-east-1": "arn:aws:lambda:sa-east-1:632417926021:layer:sharp:2" + "us-east-1": "arn:aws:lambda:us-east-1:632417926021:layer:sharp:12", + "us-east-2": "arn:aws:lambda:us-east-2:632417926021:layer:sharp:3", + "us-west-1": "arn:aws:lambda:us-west-1:632417926021:layer:sharp:3", + "us-west-2": "arn:aws:lambda:us-west-2:632417926021:layer:sharp:3", + "ap-south-1": "arn:aws:lambda:ap-south-1:632417926021:layer:sharp:3", + "ap-northeast-2": "arn:aws:lambda:ap-northeast-2:632417926021:layer:sharp:3", + "ap-southeast-1": "arn:aws:lambda:ap-southeast-1:632417926021:layer:sharp:3", + "ap-southeast-2": "arn:aws:lambda:ap-southeast-2:632417926021:layer:sharp:3", + "ap-northeast-1": "arn:aws:lambda:ap-northeast-1:632417926021:layer:sharp:3", + "ca-central-1": "arn:aws:lambda:ca-central-1:632417926021:layer:sharp:3", + "eu-central-1": "arn:aws:lambda:eu-central-1:632417926021:layer:sharp:3", + "eu-west-1": "arn:aws:lambda:eu-west-1:632417926021:layer:sharp:3", + "eu-west-2": "arn:aws:lambda:eu-west-2:632417926021:layer:sharp:4", + "eu-west-3": "arn:aws:lambda:eu-west-3:632417926021:layer:sharp:3", + "eu-north-1": "arn:aws:lambda:eu-north-1:632417926021:layer:sharp:3", + "sa-east-1": "arn:aws:lambda:sa-east-1:632417926021:layer:sharp:3", + "ap-east-1": "arn:aws:lambda:ap-east-1:632417926021:layer:sharp:1" } } From f3655093329f905529fa93582270da7f43df6e8b Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Fri, 7 Jun 2024 12:24:01 +0200 Subject: [PATCH 13/26] fix(serverless-cms-aws): add WEBINY_ADMIN_ENV and WEBINY_WEBSITE_ENV --- .../cwp-template-aws/template/common/types/env/index.d.ts | 2 ++ packages/serverless-cms-aws/src/createAdminAppConfig.ts | 8 ++++++-- packages/serverless-cms-aws/src/createWebsiteAppConfig.ts | 8 ++++++-- typings/env/index.d.ts | 2 ++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/cwp-template-aws/template/common/types/env/index.d.ts b/packages/cwp-template-aws/template/common/types/env/index.d.ts index caf272dcd53..376a7f1d45c 100644 --- a/packages/cwp-template-aws/template/common/types/env/index.d.ts +++ b/packages/cwp-template-aws/template/common/types/env/index.d.ts @@ -24,6 +24,8 @@ declare namespace NodeJS { MOCK_DYNAMODB_ENDPOINT?: string; ELASTICSEARCH_PORT?: string; WEBINY_ENV?: string; + WEBINY_ADMIN_ENV?: string; + WEBINY_WEBSITE_ENV?: string; REACT_APP_DEBUG?: "true" | "false" | string; AWS_REGION?: string; REACT_APP_WEBINY_VERSION?: string; diff --git a/packages/serverless-cms-aws/src/createAdminAppConfig.ts b/packages/serverless-cms-aws/src/createAdminAppConfig.ts index a56b43203c4..c87fbf9505f 100644 --- a/packages/serverless-cms-aws/src/createAdminAppConfig.ts +++ b/packages/serverless-cms-aws/src/createAdminAppConfig.ts @@ -3,9 +3,13 @@ import { ApiOutput } from "@webiny/pulumi-aws"; export const createAdminAppConfig = (modifier?: ReactAppConfigModifier) => { return createReactAppConfig(baseParams => { - const { config } = baseParams; + const { config, options } = baseParams; - config.customEnv(env => ({ ...env, PORT: 3001 })); + config.customEnv(env => ({ + ...env, + PORT: process.env.PORT || 3001, + WEBINY_ADMIN_ENV: options.env + })); config.pulumiOutputToEnv("apps/api", ({ output, env }) => { return { diff --git a/packages/serverless-cms-aws/src/createWebsiteAppConfig.ts b/packages/serverless-cms-aws/src/createWebsiteAppConfig.ts index f85d0151228..63980b4c650 100644 --- a/packages/serverless-cms-aws/src/createWebsiteAppConfig.ts +++ b/packages/serverless-cms-aws/src/createWebsiteAppConfig.ts @@ -3,9 +3,13 @@ import { ApiOutput } from "@webiny/pulumi-aws"; export const createWebsiteAppConfig = (modifier?: ReactAppConfigModifier) => { return createReactAppConfig(baseParams => { - const { config } = baseParams; + const { config, options } = baseParams; - config.customEnv(env => ({ ...env, PORT: 3000 })); + config.customEnv(env => ({ + ...env, + PORT: process.env.PORT || 3000, + WEBINY_WEBSITE_ENV: options.env + })); config.pulumiOutputToEnv("apps/api", ({ output, env }) => { return { diff --git a/typings/env/index.d.ts b/typings/env/index.d.ts index 5f369cd4aa8..17d4a6ce2a2 100644 --- a/typings/env/index.d.ts +++ b/typings/env/index.d.ts @@ -25,6 +25,8 @@ declare namespace NodeJS { MOCK_DYNAMODB_ENDPOINT?: string; ELASTICSEARCH_PORT?: string; WEBINY_ENV?: string; + WEBINY_ADMIN_ENV?: string; + WEBINY_WEBSITE_ENV?: string; REACT_APP_DEBUG?: "true" | "false" | string; AWS_REGION?: string; REACT_APP_WEBINY_VERSION?: string; From f5b2367ed570d2258c0e43e16b321aedb88a5b29 Mon Sep 17 00:00:00 2001 From: Adrian Smijulj Date: Fri, 7 Jun 2024 13:41:02 +0200 Subject: [PATCH 14/26] fix: introduce mock data generation task (#4146) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bruno Zorić --- .github/workflows/pullRequests.yml | 14 +- .github/workflows/pushDev.yml | 14 +- .github/workflows/pushNext.yml | 14 +- .../wac/utils/listPackagesWithJestTests.ts | 26 +- packages/api-background-tasks-es/package.json | 1 + packages/api-background-tasks-es/src/index.ts | 4 +- .../tsconfig.build.json | 1 + .../api-background-tasks-es/tsconfig.json | 3 + packages/api-background-tasks-os/package.json | 1 + packages/api-background-tasks-os/src/index.ts | 4 +- .../tsconfig.build.json | 1 + .../api-background-tasks-os/tsconfig.json | 3 + .../__tests__/event.test.ts | 6 +- .../__tests__/transfer.test.ts | 56 + .../src/NotEnoughRemainingTimeError.ts | 3 + .../src/index.ts | 329 +- .../__tests__/utils/waitUntilHealthy.test.ts | 64 +- packages/api-elasticsearch/src/client.ts | 2 +- .../api-elasticsearch/src/operations/index.ts | 1 + .../api-elasticsearch/src/operations/types.ts | 4 +- packages/api-elasticsearch/src/utils/index.ts | 2 + .../waitUntilHealthy/WaitUntilHealthy.ts | 92 +- .../src/utils/waitUntilHealthy/index.ts | 5 + .../reason/ClusterHealthReason.ts | 27 + .../utils/waitUntilHealthy/reason/IReason.ts | 4 + .../waitUntilHealthy/reason/MemoryReason.ts | 24 + .../reason/ProcessorReason.ts | 24 + .../utils/waitUntilHealthy/reason/index.ts | 3 + .../src/operations/entry/index.ts | 8 +- .../api-headless-cms-es-tasks/.babelrc.js | 1 + packages/api-headless-cms-es-tasks/LICENSE | 21 + packages/api-headless-cms-es-tasks/README.md | 15 + .../__tests__/context/helpers.ts | 90 + .../__tests__/context/plugins.ts | 107 + .../__tests__/context/tenancySecurity.ts | 102 + .../__tests__/context/useHandler.ts | 51 + .../__tests__/graphql/examples.graphql | 68 + .../MockDataManager/calculateAmounts.test.ts | 155 + .../MockDataManager/calculateSeconds.test.ts | 63 + .../tasks/mockDataCreatorTask.test.ts | 65 + .../tasks/mockDataManagerTask.test.ts | 65 + .../api-headless-cms-es-tasks/jest.setup.js | 12 + .../api-headless-cms-es-tasks/package.json | 49 + .../api-headless-cms-es-tasks/src/index.ts | 10 + .../tasks/MockDataCreator/MockDataCreator.ts | 109 + .../src/tasks/MockDataCreator/mockData.ts | 1361 ++++ .../src/tasks/MockDataCreator/types.ts | 8 + .../tasks/MockDataManager/MockDataManager.ts | 115 + .../tasks/MockDataManager/calculateAmounts.ts | 73 + .../tasks/MockDataManager/calculateSeconds.ts | 15 + .../src/tasks/MockDataManager/constants.ts | 1 + .../MockDataManager/createModelAndGroup.ts | 51 + .../src/tasks/MockDataManager/group.ts | 11 + .../src/tasks/MockDataManager/model.ts | 5549 +++++++++++++++++ .../src/tasks/MockDataManager/types.ts | 12 + .../src/tasks/createMockDataCreatorTask.ts | 30 + .../src/tasks/createMockDataManagerTask.ts | 58 + .../api-headless-cms-es-tasks/src/types.ts | 7 + .../src/utils/createIndex.ts | 35 + .../src/utils/disableIndexing.ts | 31 + .../src/utils/enableIndexing.ts | 29 + .../src/utils/index.ts | 3 + .../tsconfig.build.json | 27 + .../api-headless-cms-es-tasks/tsconfig.json | 58 + .../webiny.config.js | 8 + .../storageOperations/entries.test.ts | 6 +- packages/api-headless-cms/src/types.ts | 4 +- packages/create-webiny-project/package.json | 2 +- packages/handler-aws/src/index.ts | 2 + packages/handler-aws/src/utils/index.ts | 2 + .../src/utils/timer/CustomTimer.ts | 14 + .../src/utils}/timer/Timer.ts | 8 + .../src/utils}/timer/abstractions/ITimer.ts | 4 + .../src/utils}/timer/factory.ts | 2 +- .../src/utils}/timer/index.ts | 0 packages/migrations/package.json | 1 + .../getNonNullableFieldsWithMissingValues.ts | 21 + .../5.39.0/001/utils/isMigratedEntry.ts | 2 +- packages/project-utils/testing/tasks/index.ts | 1 + .../tasks/mockTaskTriggerTransportPlugin.ts | 24 + .../project-utils/testing/tasks/runner.ts | 4 +- .../src/apps/core/CoreElasticSearch.ts | 10 +- .../src/apps/core/CoreOpenSearch.ts | 7 +- .../__tests__/runner/taskRunnerAbort.test.ts | 2 +- .../__tests__/runner/taskRunnerCreate.test.ts | 2 +- .../runner/taskRunnerErrorFailedState.test.ts | 2 +- .../taskRunnerErrorSuccessState.test.ts | 2 +- .../runner/taskRunnerSuccess.test.ts | 2 +- .../runner/taskRunnerTaskNotFound.test.ts | 2 +- .../EventBridgeEventTransportPlugin.ts} | 46 +- packages/tasks/src/crud/trigger.tasks.ts | 21 +- packages/tasks/src/handler/index.ts | 2 +- .../src/plugins/TaskTriggerTransportPlugin.ts | 24 + packages/tasks/src/plugins/index.ts | 1 + packages/tasks/src/runner/TaskControl.ts | 2 + packages/tasks/src/runner/TaskRunner.ts | 13 +- packages/tasks/src/timer/CustomTimer.ts | 21 - .../tasks/src/transport/createTransport.ts | 34 + .../tasks/src/utils/getObjectProperties.ts | 3 + yarn.lock | 1322 +++- 100 files changed, 10477 insertions(+), 343 deletions(-) create mode 100644 packages/api-dynamodb-to-elasticsearch/__tests__/transfer.test.ts create mode 100644 packages/api-dynamodb-to-elasticsearch/src/NotEnoughRemainingTimeError.ts create mode 100644 packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/ClusterHealthReason.ts create mode 100644 packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/IReason.ts create mode 100644 packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/MemoryReason.ts create mode 100644 packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/ProcessorReason.ts create mode 100644 packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/index.ts create mode 100644 packages/api-headless-cms-es-tasks/.babelrc.js create mode 100644 packages/api-headless-cms-es-tasks/LICENSE create mode 100644 packages/api-headless-cms-es-tasks/README.md create mode 100644 packages/api-headless-cms-es-tasks/__tests__/context/helpers.ts create mode 100644 packages/api-headless-cms-es-tasks/__tests__/context/plugins.ts create mode 100644 packages/api-headless-cms-es-tasks/__tests__/context/tenancySecurity.ts create mode 100644 packages/api-headless-cms-es-tasks/__tests__/context/useHandler.ts create mode 100644 packages/api-headless-cms-es-tasks/__tests__/graphql/examples.graphql create mode 100644 packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateAmounts.test.ts create mode 100644 packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateSeconds.test.ts create mode 100644 packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataCreatorTask.test.ts create mode 100644 packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataManagerTask.test.ts create mode 100644 packages/api-headless-cms-es-tasks/jest.setup.js create mode 100644 packages/api-headless-cms-es-tasks/package.json create mode 100644 packages/api-headless-cms-es-tasks/src/index.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/MockDataCreator.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/mockData.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/types.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/MockDataManager.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/calculateAmounts.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/calculateSeconds.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/constants.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/createModelAndGroup.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/group.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/model.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/types.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/createMockDataCreatorTask.ts create mode 100644 packages/api-headless-cms-es-tasks/src/tasks/createMockDataManagerTask.ts create mode 100644 packages/api-headless-cms-es-tasks/src/types.ts create mode 100644 packages/api-headless-cms-es-tasks/src/utils/createIndex.ts create mode 100644 packages/api-headless-cms-es-tasks/src/utils/disableIndexing.ts create mode 100644 packages/api-headless-cms-es-tasks/src/utils/enableIndexing.ts create mode 100644 packages/api-headless-cms-es-tasks/src/utils/index.ts create mode 100644 packages/api-headless-cms-es-tasks/tsconfig.build.json create mode 100644 packages/api-headless-cms-es-tasks/tsconfig.json create mode 100644 packages/api-headless-cms-es-tasks/webiny.config.js create mode 100644 packages/handler-aws/src/utils/index.ts create mode 100644 packages/handler-aws/src/utils/timer/CustomTimer.ts rename packages/{tasks/src => handler-aws/src/utils}/timer/Timer.ts (63%) rename packages/{tasks/src => handler-aws/src/utils}/timer/abstractions/ITimer.ts (58%) rename packages/{tasks/src => handler-aws/src/utils}/timer/factory.ts (91%) rename packages/{tasks/src => handler-aws/src/utils}/timer/index.ts (100%) create mode 100644 packages/migrations/src/migrations/5.39.0/001/utils/getNonNullableFieldsWithMissingValues.ts create mode 100644 packages/project-utils/testing/tasks/mockTaskTriggerTransportPlugin.ts rename packages/tasks/src/crud/{EventBridgeEventTransport.ts => transport/EventBridgeEventTransportPlugin.ts} (56%) create mode 100644 packages/tasks/src/plugins/TaskTriggerTransportPlugin.ts create mode 100644 packages/tasks/src/plugins/index.ts delete mode 100644 packages/tasks/src/timer/CustomTimer.ts create mode 100644 packages/tasks/src/transport/createTransport.ts diff --git a/.github/workflows/pullRequests.yml b/.github/workflows/pullRequests.yml index 75a4bf1a310..d3db887983a 100644 --- a/.github/workflows/pullRequests.yml +++ b/.github/workflows/pullRequests.yml @@ -177,7 +177,7 @@ jobs: - 18 package: >- ${{ - fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-dynamodb-to-elasticsearch","id":"api-dynamodb-to-elasticsearch"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') + fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') }} runs-on: ${{ matrix.os }} env: @@ -281,13 +281,15 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-aco_ddb-es_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-dynamodb-to-elasticsearch_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-es,ddb","storage":"ddb-es","id":"api-elasticsearch-tasks_ddb-es_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-es,ddb","storage":"ddb-es","id":"api-file-manager_ddb-es_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder_ddb-es_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder-so-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-mailer + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-headless-cms-es-tasks_ddb-es_ddb"},{"cmd":"packages/api-mailer --storage=ddb-es,ddb","storage":"ddb-es","id":"api-mailer_ddb-es_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-page-builder_ddb-es_ddb"},{"cmd":"packages/api-page-builder-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-page-builder-aco_ddb-es_ddb"},{"cmd":"packages/api-page-builder-so-ddb-es @@ -348,13 +350,15 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-aco_ddb-os_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-dynamodb-to-elasticsearch_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-os,ddb","storage":"ddb-os","id":"api-elasticsearch-tasks_ddb-os_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-os,ddb","storage":"ddb-os","id":"api-file-manager_ddb-os_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder_ddb-os_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder-so-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-mailer + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-headless-cms-es-tasks_ddb-os_ddb"},{"cmd":"packages/api-mailer --storage=ddb-os,ddb","storage":"ddb-os","id":"api-mailer_ddb-os_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-page-builder_ddb-os_ddb"},{"cmd":"packages/api-page-builder-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-page-builder-aco_ddb-os_ddb"},{"cmd":"packages/api-page-builder-so-ddb-es diff --git a/.github/workflows/pushDev.yml b/.github/workflows/pushDev.yml index 7f7bae78712..f1c6199c1f0 100644 --- a/.github/workflows/pushDev.yml +++ b/.github/workflows/pushDev.yml @@ -143,7 +143,7 @@ jobs: - 18 package: >- ${{ - fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-dynamodb-to-elasticsearch","id":"api-dynamodb-to-elasticsearch"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') + fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') }} runs-on: ${{ matrix.os }} env: @@ -247,13 +247,15 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-aco_ddb-es_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-dynamodb-to-elasticsearch_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-es,ddb","storage":"ddb-es","id":"api-elasticsearch-tasks_ddb-es_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-es,ddb","storage":"ddb-es","id":"api-file-manager_ddb-es_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder_ddb-es_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder-so-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-mailer + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-headless-cms-es-tasks_ddb-es_ddb"},{"cmd":"packages/api-mailer --storage=ddb-es,ddb","storage":"ddb-es","id":"api-mailer_ddb-es_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-page-builder_ddb-es_ddb"},{"cmd":"packages/api-page-builder-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-page-builder-aco_ddb-es_ddb"},{"cmd":"packages/api-page-builder-so-ddb-es @@ -313,13 +315,15 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-aco_ddb-os_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-dynamodb-to-elasticsearch_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-os,ddb","storage":"ddb-os","id":"api-elasticsearch-tasks_ddb-os_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-os,ddb","storage":"ddb-os","id":"api-file-manager_ddb-os_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder_ddb-os_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder-so-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-mailer + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-headless-cms-es-tasks_ddb-os_ddb"},{"cmd":"packages/api-mailer --storage=ddb-os,ddb","storage":"ddb-os","id":"api-mailer_ddb-os_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-page-builder_ddb-os_ddb"},{"cmd":"packages/api-page-builder-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-page-builder-aco_ddb-os_ddb"},{"cmd":"packages/api-page-builder-so-ddb-es diff --git a/.github/workflows/pushNext.yml b/.github/workflows/pushNext.yml index ba7a91bf11d..ececef094c5 100644 --- a/.github/workflows/pushNext.yml +++ b/.github/workflows/pushNext.yml @@ -143,7 +143,7 @@ jobs: - 18 package: >- ${{ - fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-dynamodb-to-elasticsearch","id":"api-dynamodb-to-elasticsearch"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') + fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') }} runs-on: ${{ matrix.os }} env: @@ -247,13 +247,15 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-aco_ddb-es_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-dynamodb-to-elasticsearch_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-es,ddb","storage":"ddb-es","id":"api-elasticsearch-tasks_ddb-es_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-es,ddb","storage":"ddb-es","id":"api-file-manager_ddb-es_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder_ddb-es_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder-so-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-mailer + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-headless-cms-es-tasks_ddb-es_ddb"},{"cmd":"packages/api-mailer --storage=ddb-es,ddb","storage":"ddb-es","id":"api-mailer_ddb-es_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-page-builder_ddb-es_ddb"},{"cmd":"packages/api-page-builder-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-page-builder-aco_ddb-es_ddb"},{"cmd":"packages/api-page-builder-so-ddb-es @@ -313,13 +315,15 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-aco_ddb-os_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-dynamodb-to-elasticsearch_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-os,ddb","storage":"ddb-os","id":"api-elasticsearch-tasks_ddb-os_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-os,ddb","storage":"ddb-os","id":"api-file-manager_ddb-os_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder_ddb-os_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder-so-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-mailer + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-headless-cms-es-tasks_ddb-os_ddb"},{"cmd":"packages/api-mailer --storage=ddb-os,ddb","storage":"ddb-os","id":"api-mailer_ddb-os_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-page-builder_ddb-os_ddb"},{"cmd":"packages/api-page-builder-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-page-builder-aco_ddb-os_ddb"},{"cmd":"packages/api-page-builder-so-ddb-es diff --git a/.github/workflows/wac/utils/listPackagesWithJestTests.ts b/.github/workflows/wac/utils/listPackagesWithJestTests.ts index 325d862c6b4..ca92079a1da 100644 --- a/.github/workflows/wac/utils/listPackagesWithJestTests.ts +++ b/.github/workflows/wac/utils/listPackagesWithJestTests.ts @@ -202,6 +202,30 @@ const CUSTOM_HANDLERS: Record Array> = { } ]; }, + "api-dynamodb-to-elasticsearch": () => { + return [ + { + cmd: "packages/api-dynamodb-to-elasticsearch --storage=ddb-es,ddb", + storage: ["ddb-es"] + }, + { + cmd: "packages/api-dynamodb-to-elasticsearch --storage=ddb-os,ddb", + storage: ["ddb-os"] + } + ]; + }, + "api-headless-cms-es-tasks": () => { + return [ + { + cmd: "packages/api-headless-cms-es-tasks --storage=ddb-es,ddb", + storage: ["ddb-es"] + }, + { + cmd: "packages/api-headless-cms-es-tasks --storage=ddb-os,ddb", + storage: ["ddb-os"] + } + ]; + }, tasks: () => { return [ { cmd: "packages/tasks --storage=ddb", storage: "ddb" }, @@ -250,7 +274,7 @@ function hasTestFiles(packageFolderPath: string) { } const files = fs.readdirSync(packageFolderPath); - for (let filename of files) { + for (const filename of files) { const filepath = path.join(packageFolderPath, filename); if (fs.statSync(filepath).isDirectory()) { const hasTFiles = hasTestFiles(filepath); diff --git a/packages/api-background-tasks-es/package.json b/packages/api-background-tasks-es/package.json index 9d2077656a5..cf917979443 100644 --- a/packages/api-background-tasks-es/package.json +++ b/packages/api-background-tasks-es/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@webiny/api-elasticsearch-tasks": "0.0.0", + "@webiny/api-headless-cms-es-tasks": "0.0.0", "@webiny/plugins": "0.0.0", "@webiny/tasks": "0.0.0" }, diff --git a/packages/api-background-tasks-es/src/index.ts b/packages/api-background-tasks-es/src/index.ts index 5e7808ab75d..cdc92f823d0 100644 --- a/packages/api-background-tasks-es/src/index.ts +++ b/packages/api-background-tasks-es/src/index.ts @@ -1,11 +1,13 @@ import { Plugin } from "@webiny/plugins/types"; import { createBackgroundTaskGraphQL, createBackgroundTaskContext } from "@webiny/tasks"; import { createElasticsearchBackgroundTasks } from "@webiny/api-elasticsearch-tasks"; +import { createHeadlessCmsEsTasks } from "@webiny/api-headless-cms-es-tasks"; export const createBackgroundTasks = (): Plugin[] => { return [ ...createBackgroundTaskContext(), ...createBackgroundTaskGraphQL(), - ...createElasticsearchBackgroundTasks() + ...createElasticsearchBackgroundTasks(), + ...createHeadlessCmsEsTasks() ]; }; diff --git a/packages/api-background-tasks-es/tsconfig.build.json b/packages/api-background-tasks-es/tsconfig.build.json index a24fe8b6152..4bb5a0db92b 100644 --- a/packages/api-background-tasks-es/tsconfig.build.json +++ b/packages/api-background-tasks-es/tsconfig.build.json @@ -3,6 +3,7 @@ "include": ["src"], "references": [ { "path": "../api-elasticsearch-tasks/tsconfig.build.json" }, + { "path": "../api-headless-cms-es-tasks/tsconfig.build.json" }, { "path": "../plugins/tsconfig.build.json" }, { "path": "../tasks/tsconfig.build.json" } ], diff --git a/packages/api-background-tasks-es/tsconfig.json b/packages/api-background-tasks-es/tsconfig.json index b98d9beebb2..57fb6ce012b 100644 --- a/packages/api-background-tasks-es/tsconfig.json +++ b/packages/api-background-tasks-es/tsconfig.json @@ -3,6 +3,7 @@ "include": ["src", "__tests__"], "references": [ { "path": "../api-elasticsearch-tasks" }, + { "path": "../api-headless-cms-es-tasks" }, { "path": "../plugins" }, { "path": "../tasks" } ], @@ -15,6 +16,8 @@ "~tests/*": ["./__tests__/*"], "@webiny/api-elasticsearch-tasks/*": ["../api-elasticsearch-tasks/src/*"], "@webiny/api-elasticsearch-tasks": ["../api-elasticsearch-tasks/src"], + "@webiny/api-headless-cms-es-tasks/*": ["../api-headless-cms-es-tasks/src/*"], + "@webiny/api-headless-cms-es-tasks": ["../api-headless-cms-es-tasks/src"], "@webiny/plugins/*": ["../plugins/src/*"], "@webiny/plugins": ["../plugins/src"], "@webiny/tasks/*": ["../tasks/src/*"], diff --git a/packages/api-background-tasks-os/package.json b/packages/api-background-tasks-os/package.json index 83a3f5b8c06..31cbbbc1400 100644 --- a/packages/api-background-tasks-os/package.json +++ b/packages/api-background-tasks-os/package.json @@ -11,6 +11,7 @@ "license": "MIT", "dependencies": { "@webiny/api-elasticsearch-tasks": "0.0.0", + "@webiny/api-headless-cms-es-tasks": "0.0.0", "@webiny/plugins": "0.0.0", "@webiny/tasks": "0.0.0" }, diff --git a/packages/api-background-tasks-os/src/index.ts b/packages/api-background-tasks-os/src/index.ts index 5e7808ab75d..cdc92f823d0 100644 --- a/packages/api-background-tasks-os/src/index.ts +++ b/packages/api-background-tasks-os/src/index.ts @@ -1,11 +1,13 @@ import { Plugin } from "@webiny/plugins/types"; import { createBackgroundTaskGraphQL, createBackgroundTaskContext } from "@webiny/tasks"; import { createElasticsearchBackgroundTasks } from "@webiny/api-elasticsearch-tasks"; +import { createHeadlessCmsEsTasks } from "@webiny/api-headless-cms-es-tasks"; export const createBackgroundTasks = (): Plugin[] => { return [ ...createBackgroundTaskContext(), ...createBackgroundTaskGraphQL(), - ...createElasticsearchBackgroundTasks() + ...createElasticsearchBackgroundTasks(), + ...createHeadlessCmsEsTasks() ]; }; diff --git a/packages/api-background-tasks-os/tsconfig.build.json b/packages/api-background-tasks-os/tsconfig.build.json index a24fe8b6152..4bb5a0db92b 100644 --- a/packages/api-background-tasks-os/tsconfig.build.json +++ b/packages/api-background-tasks-os/tsconfig.build.json @@ -3,6 +3,7 @@ "include": ["src"], "references": [ { "path": "../api-elasticsearch-tasks/tsconfig.build.json" }, + { "path": "../api-headless-cms-es-tasks/tsconfig.build.json" }, { "path": "../plugins/tsconfig.build.json" }, { "path": "../tasks/tsconfig.build.json" } ], diff --git a/packages/api-background-tasks-os/tsconfig.json b/packages/api-background-tasks-os/tsconfig.json index b98d9beebb2..57fb6ce012b 100644 --- a/packages/api-background-tasks-os/tsconfig.json +++ b/packages/api-background-tasks-os/tsconfig.json @@ -3,6 +3,7 @@ "include": ["src", "__tests__"], "references": [ { "path": "../api-elasticsearch-tasks" }, + { "path": "../api-headless-cms-es-tasks" }, { "path": "../plugins" }, { "path": "../tasks" } ], @@ -15,6 +16,8 @@ "~tests/*": ["./__tests__/*"], "@webiny/api-elasticsearch-tasks/*": ["../api-elasticsearch-tasks/src/*"], "@webiny/api-elasticsearch-tasks": ["../api-elasticsearch-tasks/src"], + "@webiny/api-headless-cms-es-tasks/*": ["../api-headless-cms-es-tasks/src/*"], + "@webiny/api-headless-cms-es-tasks": ["../api-headless-cms-es-tasks/src"], "@webiny/plugins/*": ["../plugins/src/*"], "@webiny/plugins": ["../plugins/src"], "@webiny/tasks/*": ["../tasks/src/*"], diff --git a/packages/api-dynamodb-to-elasticsearch/__tests__/event.test.ts b/packages/api-dynamodb-to-elasticsearch/__tests__/event.test.ts index 809695e3ec7..7896a1a35ba 100644 --- a/packages/api-dynamodb-to-elasticsearch/__tests__/event.test.ts +++ b/packages/api-dynamodb-to-elasticsearch/__tests__/event.test.ts @@ -73,7 +73,8 @@ describe("event", () => { }, lambdaContext, request, - reply + reply, + next: jest.fn() }); expect(result).toEqual(null); @@ -86,7 +87,8 @@ describe("event", () => { event, lambdaContext, request, - reply + reply, + next: jest.fn() }); expect(result).toEqual(null); diff --git a/packages/api-dynamodb-to-elasticsearch/__tests__/transfer.test.ts b/packages/api-dynamodb-to-elasticsearch/__tests__/transfer.test.ts new file mode 100644 index 00000000000..3f30a387c25 --- /dev/null +++ b/packages/api-dynamodb-to-elasticsearch/__tests__/transfer.test.ts @@ -0,0 +1,56 @@ +import { createEventHandler, Operations } from "~/index"; +import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; +import { ElasticsearchContext } from "@webiny/api-elasticsearch/types"; +import { Context, LambdaContext, Reply, Request } from "@webiny/handler-aws/types"; +import { marshall } from "@webiny/aws-sdk/client-dynamodb"; +import { PluginsContainer } from "@webiny/plugins"; + +describe("transfer data", () => { + it("should transfer data from event to elasticsearch", async () => { + const event = createEventHandler(); + + const elasticsearch = createElasticsearchClient(); + + const context = { + elasticsearch, + plugins: new PluginsContainer() + } as unknown as ElasticsearchContext & Context; + /** + * Register index which is going to get created, so it can be deleted after the test. + */ + const index = "a-test-index"; + elasticsearch.indices.registerIndex(index); + + const result = await event.cb({ + context, + reply: {} as Reply, + request: {} as Request, + event: { + Records: [ + { + eventName: Operations.INSERT, + dynamodb: { + Keys: marshall({ + PK: "PK_TEST", + SK: "SK_TEST" + }) as any, + NewImage: marshall({ + index, + ignore: false, + data: { + title: "Hello World" + } + }) as any + } + } + ] + }, + lambdaContext: {} as LambdaContext, + next: jest.fn() + }); + + expect(result).toEqual(null); + + await elasticsearch.indices.deleteAll(); + }); +}); diff --git a/packages/api-dynamodb-to-elasticsearch/src/NotEnoughRemainingTimeError.ts b/packages/api-dynamodb-to-elasticsearch/src/NotEnoughRemainingTimeError.ts new file mode 100644 index 00000000000..1aaef7d8dd2 --- /dev/null +++ b/packages/api-dynamodb-to-elasticsearch/src/NotEnoughRemainingTimeError.ts @@ -0,0 +1,3 @@ +import { WebinyError } from "@webiny/error"; + +export class NotEnoughRemainingTimeError extends WebinyError {} diff --git a/packages/api-dynamodb-to-elasticsearch/src/index.ts b/packages/api-dynamodb-to-elasticsearch/src/index.ts index 477bf769cc5..212dec152c0 100644 --- a/packages/api-dynamodb-to-elasticsearch/src/index.ts +++ b/packages/api-dynamodb-to-elasticsearch/src/index.ts @@ -1,11 +1,18 @@ import WebinyError from "@webiny/error"; import { AttributeValue, unmarshall as baseUnmarshall } from "@webiny/aws-sdk/client-dynamodb"; -import { decompress } from "@webiny/api-elasticsearch"; +import { + createWaitUntilHealthy, + decompress, + UnhealthyClusterError, + WaitingHealthyClusterAbortedError +} from "@webiny/api-elasticsearch"; import { ApiResponse, ElasticsearchContext } from "@webiny/api-elasticsearch/types"; -import { createDynamoDBEventHandler } from "@webiny/handler-aws"; +import { createDynamoDBEventHandler, timerFactory } from "@webiny/handler-aws"; +import { ElasticsearchCatClusterHealthStatus } from "@webiny/api-elasticsearch/operations/types"; import pRetry from "p-retry"; +import { NotEnoughRemainingTimeError } from "./NotEnoughRemainingTimeError"; -enum Operations { +export enum Operations { INSERT = "INSERT", MODIFY = "MODIFY", REMOVE = "REMOVE" @@ -39,15 +46,6 @@ const getError = (item: BulkOperationsResponseBodyItem): string | null => { return reason; }; -const getNumberEnvVariable = (name: string, def: number): number => { - const input = process.env[name]; - const value = Number(input); - if (value > 0) { - return value; - } - return def; -}; - const checkErrors = (result?: ApiResponse): void => { if (!result || !result.body || !result.body.items) { return; @@ -67,6 +65,22 @@ const checkErrors = (result?: ApiResponse): void => } }; +const getNumberEnvVariable = (name: string, def: number): number => { + const input = process.env[name]; + const value = Number(input); + if (isNaN(value)) { + return def; + } else if (value <= 0) { + return def; + } + return value; +}; + +const MAX_PROCESSOR_PERCENT = getNumberEnvVariable( + "MAX_ES_PROCESSOR", + process.env.NODE_ENV === "test" ? 101 : 98 +); + interface RecordDynamoDbImage { data: Record; ignore?: boolean; @@ -85,108 +99,182 @@ const unmarshall = (value?: Record): T | undefined => return baseUnmarshall(value) as T; }; +const minRemainingSecondsToTimeout = 120; + +/** + * Also, we need to set the maximum running time for the Lambda Function. + * https://github.com/webiny/webiny-js/blob/f7352d418da2b5ae0b781376be46785aa7ac6ae0/packages/pulumi-aws/src/apps/core/CoreOpenSearch.ts#L232 + * https://github.com/webiny/webiny-js/blob/f7352d418da2b5ae0b781376be46785aa7ac6ae0/packages/pulumi-aws/src/apps/core/CoreElasticSearch.ts#L218 + */ +const MAX_RUNNING_TIME = 900; + export const createEventHandler = () => { - return createDynamoDBEventHandler(async ({ event, context: ctx }) => { + return createDynamoDBEventHandler(async ({ event, context: ctx, lambdaContext }) => { + const timer = timerFactory(lambdaContext); const context = ctx as unknown as ElasticsearchContext; if (!context.elasticsearch) { console.error("Missing elasticsearch definition on context."); return null; } - /** - * Wrap the code we need to run into the function, so it can be called within itself. - */ - const execute = async (): Promise => { - const operations = []; + const operations: Record[] = []; - for (const record of event.Records) { - const dynamodb = record.dynamodb; - if (!dynamodb) { - continue; - } + const operationIdList: string[] = []; + + for (const record of event.Records) { + const dynamodb = record.dynamodb; + if (!dynamodb) { + continue; + } + /** + * TODO: figure out correct types + */ + // @ts-expect-error + const newImage = unmarshall(dynamodb.NewImage); + + // Note that with the `REMOVE` event, there is no `NewImage` property. Which means, + // if the `newImage` is `undefined`, we are dealing with a `REMOVE` event and we still + // need to process it. + if (newImage && newImage.ignore === true) { + continue; + } + /** + * TODO: figure out correct types + */ + // @ts-expect-error + const keys = unmarshall(dynamodb.Keys); + if (!keys?.PK || !keys.SK) { + continue; + } + const _id = `${keys.PK}:${keys.SK}`; + /** + * TODO: figure out correct types + */ + // @ts-expect-error + const oldImage = unmarshall(dynamodb.OldImage); + const operation = record.eventName; + + /** + * On operations other than REMOVE we decompress the data and store it into the Elasticsearch. + * No need to try to decompress if operation is REMOVE since there is no data sent into that operation. + */ + let data: any = undefined; + if (newImage && operation !== Operations.REMOVE) { /** - * TODO: figure out correct types + * We must decompress the data that is going into the Elasticsearch. */ - // @ts-expect-error - const newImage = unmarshall(dynamodb.NewImage); - - // Note that with the `REMOVE` event, there is no `NewImage` property. Which means, - // if the `newImage` is `undefined`, we are dealing with a `REMOVE` event and we still - // need to process it. - if (newImage && newImage.ignore === true) { - continue; - } + data = await decompress(context.plugins, newImage.data); /** - * TODO: figure out correct types + * No point in writing null or undefined data into the Elasticsearch. + * This might happen on some error while decompressing. We will log it. + * + * Data should NEVER be null or undefined in the Elasticsearch DynamoDB table, unless it is a delete operations. + * If it is - it is a bug. */ - // @ts-expect-error - const keys = unmarshall(dynamodb.Keys); - if (!keys?.PK || !keys.SK) { + if (data === undefined || data === null) { + console.error( + `Could not get decompressed data, skipping ES operation "${operation}", ID ${_id}` + ); continue; } - const _id = `${keys.PK}:${keys.SK}`; - /** - * TODO: figure out correct types - */ - // @ts-expect-error - const oldImage = unmarshall(dynamodb.OldImage); - const operation = record.eventName; + } - /** - * On operations other than REMOVE we decompress the data and store it into the Elasticsearch. - * No need to try to decompress if operation is REMOVE since there is no data sent into that operation. - */ - let data: any = undefined; - if (newImage && operation !== Operations.REMOVE) { - /** - * We must decompress the data that is going into the Elasticsearch. - */ - data = await decompress(context.plugins, newImage.data); - /** - * No point in writing null or undefined data into the Elasticsearch. - * This might happen on some error while decompressing. We will log it. - * - * Data should NEVER be null or undefined in the Elasticsearch DynamoDB table, unless it is a delete operations. - * If it is - it is a bug. - */ - if (data === undefined || data === null) { - console.error( - `Could not get decompressed data, skipping ES operation "${operation}", ID ${_id}` + operationIdList.push(_id); + + switch (record.eventName) { + case Operations.INSERT: + case Operations.MODIFY: + if (newImage) { + operations.push( + { + index: { + _id, + _index: newImage.index + } + }, + data ); - continue; } - } - - switch (record.eventName) { - case Operations.INSERT: - case Operations.MODIFY: - if (newImage) { - operations.push( - { - index: { - _id, - _index: newImage.index - } - }, - data - ); + break; + case Operations.REMOVE: + operations.push({ + delete: { + _id, + _index: oldImage?.index || "unknown" } - break; - case Operations.REMOVE: - operations.push({ - delete: { - _id, - _index: oldImage?.index || "unknown" - } - }); - break; - default: - break; - } + }); + break; + default: + break; } + } + /** + * No need to do anything if there are no operations. + */ + if (operations.length === 0) { + return null; + } + /** + * Wrap the code we need to run into the function, so it can be called within itself. + */ + const execute = async (): Promise => { + const remainingTime = timer.getRemainingSeconds(); + const runningTime = MAX_RUNNING_TIME - remainingTime; + const maxWaitingTime = remainingTime - 90; - if (!operations.length) { - return; + if (process.env.DEBUG === "true") { + console.debug( + `The Lambda is already running for ${runningTime}s. Setting Health Check max waiting time: ${maxWaitingTime}s` + ); + } + + const healthCheck = createWaitUntilHealthy(context.elasticsearch, { + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Yellow, + waitingTimeStep: 30, + maxProcessorPercent: MAX_PROCESSOR_PERCENT, + maxWaitingTime + }); + + try { + await healthCheck.wait({ + async onUnhealthy({ + startedAt, + runs, + mustEndAt, + waitingTimeStep, + waitingReason + }) { + console.debug(`Cluster is unhealthy on run #${runs}.`, { + startedAt, + mustEndAt, + waitingTimeStep, + waitingReason + }); + }, + async onTimeout({ + startedAt, + runs, + waitingTimeStep, + mustEndAt, + waitingReason + }) { + console.error(`Cluster health check timeout on run #${runs}.`, { + startedAt, + mustEndAt, + waitingTimeStep, + waitingReason + }); + } + }); + } catch (ex) { + if ( + ex instanceof UnhealthyClusterError || + ex instanceof WaitingHealthyClusterAbortedError + ) { + throw ex; + } + console.error(`Cluster health check failed.`, ex); + throw ex; } try { @@ -195,13 +283,20 @@ export const createEventHandler = () => { }); checkErrors(res); } catch (error) { - if (process.env.DEBUG === "true") { - const meta = error?.meta || {}; - delete meta["meta"]; - console.error("Bulk error", JSON.stringify(error, null, 2)); + if (process.env.DEBUG !== "true") { + throw error; } + const meta = error?.meta || {}; + delete meta["meta"]; + console.error("Bulk error", JSON.stringify(error, null, 2)); throw error; } + if (process.env.DEBUG !== "true") { + return; + } + console.info( + `Transferred ${operations.length / 2} record operations to Elasticsearch.` + ); }; const maxRetryTime = getNumberEnvVariable( @@ -218,22 +313,30 @@ export const createEventHandler = () => { 30000 ); - await pRetry(execute, { - maxRetryTime, - retries, - minTimeout, - maxTimeout, - onFailedAttempt: error => { - /** - * We will only log attempts which are after 3/4 of total attempts. - */ - if (error.attemptNumber < retries * 0.75) { - return; + try { + await pRetry(execute, { + maxRetryTime, + retries, + minTimeout, + maxTimeout, + onFailedAttempt: error => { + if (timer.getRemainingSeconds() < minRemainingSecondsToTimeout) { + throw new NotEnoughRemainingTimeError(error); + } + /** + * We will only log attempts which are after 3/4 of total attempts. + */ + if (error.attemptNumber < retries * 0.75) { + return; + } + console.error(`Attempt #${error.attemptNumber} failed.`); + console.error(error); } - console.error(`Attempt #${error.attemptNumber} failed.`); - console.error(error.message); - } - }); + }); + } catch (ex) { + // TODO implement storing of failed operations + throw ex; + } return null; }); diff --git a/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts b/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts index f3f173b0ea3..d9666fe5efd 100644 --- a/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts +++ b/packages/api-elasticsearch/__tests__/utils/waitUntilHealthy.test.ts @@ -1,6 +1,6 @@ import { createWaitUntilHealthy } from "~/utils/waitUntilHealthy"; import { createElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch/createClient"; -import { ElasticsearchCatHealthStatus } from "~/operations/types"; +import { ElasticsearchCatClusterHealthStatus } from "~/operations/types"; import { UnhealthyClusterError } from "~/utils/waitUntilHealthy/UnhealthyClusterError"; import { WaitingHealthyClusterAbortedError } from "~/utils/waitUntilHealthy/WaitingHealthyClusterAbortedError"; @@ -9,11 +9,25 @@ describe("wait until healthy", () => { it("should wait until the cluster is healthy - single run", async () => { const waitUntilHealthy = createWaitUntilHealthy(client, { - minStatus: ElasticsearchCatHealthStatus.Yellow, + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Yellow, maxProcessorPercent: 101, + maxRamPercent: 101, maxWaitingTime: 30, - waitingTimeStep: 5, - maxRamPercent: 101 + waitingTimeStep: 5 + }); + + const { runs, runningTime } = await waitUntilHealthy.wait(); + + expect(runs).toEqual(1); + expect(runningTime).toBeLessThan(30000); + }); + + it("should wait until the cluster is healthy - no max memory defined", async () => { + const waitUntilHealthy = createWaitUntilHealthy(client, { + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Yellow, + maxProcessorPercent: 101, + maxWaitingTime: 30, + waitingTimeStep: 5 }); const { runs, runningTime } = await waitUntilHealthy.wait(); @@ -25,11 +39,11 @@ describe("wait until healthy", () => { it("should wait until the cluster is health - processor - max waiting time hit", async () => { expect.assertions(2); const waitUntilHealthy = createWaitUntilHealthy(client, { - minStatus: ElasticsearchCatHealthStatus.Yellow, + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Yellow, maxProcessorPercent: 1, + maxRamPercent: 99, maxWaitingTime: 3, - waitingTimeStep: 1, - maxRamPercent: 99 + waitingTimeStep: 1 }); try { @@ -43,11 +57,11 @@ describe("wait until healthy", () => { it("should wait until the cluster is health - memory - max waiting time hit", async () => { expect.assertions(2); const waitUntilHealthy = createWaitUntilHealthy(client, { - minStatus: ElasticsearchCatHealthStatus.Yellow, + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Yellow, maxProcessorPercent: 99, + maxRamPercent: 1, maxWaitingTime: 3, - waitingTimeStep: 1, - maxRamPercent: 1 + waitingTimeStep: 1 }); try { @@ -62,11 +76,11 @@ describe("wait until healthy", () => { it("should trigger onUnhealthy callback - once", async () => { expect.assertions(2); const waitUntilHealthy = createWaitUntilHealthy(client, { - minStatus: ElasticsearchCatHealthStatus.Green, + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Green, maxProcessorPercent: 1, + maxRamPercent: 1, maxWaitingTime: 1, - waitingTimeStep: 3, - maxRamPercent: 1 + waitingTimeStep: 3 }); const onUnhealthy = jest.fn(); @@ -88,11 +102,11 @@ describe("wait until healthy", () => { it("should trigger onUnhealthy callback - multiple times", async () => { expect.assertions(2); const waitUntilHealthy = createWaitUntilHealthy(client, { - minStatus: ElasticsearchCatHealthStatus.Green, + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Green, maxProcessorPercent: 1, + maxRamPercent: 1, maxWaitingTime: 3, - waitingTimeStep: 1, - maxRamPercent: 1 + waitingTimeStep: 1 }); const onUnhealthy = jest.fn(); @@ -114,11 +128,11 @@ describe("wait until healthy", () => { it("should trigger onTimeout callback - once", async () => { expect.assertions(3); const waitUntilHealthy = createWaitUntilHealthy(client, { - minStatus: ElasticsearchCatHealthStatus.Green, + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Green, maxProcessorPercent: 1, + maxRamPercent: 1, maxWaitingTime: 3, - waitingTimeStep: 1, - maxRamPercent: 1 + waitingTimeStep: 1 }); const onUnhealthy = jest.fn(); @@ -145,11 +159,11 @@ describe("wait until healthy", () => { it("should trigger abort even before the checks start", async () => { expect.assertions(3); const waitUntilHealthy = createWaitUntilHealthy(client, { - minStatus: ElasticsearchCatHealthStatus.Green, + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Green, maxProcessorPercent: 1, + maxRamPercent: 1, maxWaitingTime: 1, - waitingTimeStep: 3, - maxRamPercent: 1 + waitingTimeStep: 3 }); waitUntilHealthy.abort(); @@ -179,11 +193,11 @@ describe("wait until healthy", () => { it("should trigger abort in onUnhealthy callback", async () => { expect.assertions(2); const waitUntilHealthy = createWaitUntilHealthy(client, { - minStatus: ElasticsearchCatHealthStatus.Green, + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Green, maxProcessorPercent: 1, + maxRamPercent: 1, maxWaitingTime: 1, - waitingTimeStep: 3, - maxRamPercent: 1 + waitingTimeStep: 3 }); const onUnhealthy = jest.fn(); diff --git a/packages/api-elasticsearch/src/client.ts b/packages/api-elasticsearch/src/client.ts index ef8ba161140..73b84e1a3ce 100644 --- a/packages/api-elasticsearch/src/client.ts +++ b/packages/api-elasticsearch/src/client.ts @@ -72,7 +72,7 @@ export const createElasticsearchClient = (options: ElasticsearchClientOptions): ...rest, auth: undefined }; - console.log({ + console.error({ ...data }); throw new WebinyError( diff --git a/packages/api-elasticsearch/src/operations/index.ts b/packages/api-elasticsearch/src/operations/index.ts index c0d0520fb51..4a8a803a831 100644 --- a/packages/api-elasticsearch/src/operations/index.ts +++ b/packages/api-elasticsearch/src/operations/index.ts @@ -1,2 +1,3 @@ export * from "./ElasticsearchCatHealth"; export * from "./ElasticsearchCatNodes"; +export * from "./types"; diff --git a/packages/api-elasticsearch/src/operations/types.ts b/packages/api-elasticsearch/src/operations/types.ts index cfc8decc94c..6c2abc67c39 100644 --- a/packages/api-elasticsearch/src/operations/types.ts +++ b/packages/api-elasticsearch/src/operations/types.ts @@ -1,4 +1,4 @@ -export enum ElasticsearchCatHealthStatus { +export enum ElasticsearchCatClusterHealthStatus { Green = "green", Yellow = "yellow", Red = "red" @@ -8,7 +8,7 @@ export interface IElasticsearchCatHealthResponse { epoch: number; timestamp: `${number}:${number}:${number}`; cluster: string; - status: ElasticsearchCatHealthStatus; + status: ElasticsearchCatClusterHealthStatus; "node.total": `${number}`; "node.data": `${number}`; shards: `${number}`; diff --git a/packages/api-elasticsearch/src/utils/index.ts b/packages/api-elasticsearch/src/utils/index.ts index 14d0e3eae28..fb384855b13 100644 --- a/packages/api-elasticsearch/src/utils/index.ts +++ b/packages/api-elasticsearch/src/utils/index.ts @@ -1 +1,3 @@ +export * from "./waitUntilHealthy"; export * from "./createIndex"; +export * from "./waitUntilHealthy"; diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitUntilHealthy.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitUntilHealthy.ts index f8bef386cfe..93475f45cec 100644 --- a/packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitUntilHealthy.ts +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/WaitUntilHealthy.ts @@ -1,17 +1,33 @@ import { Client } from "~/client"; import { ElasticsearchCatHealth } from "~/operations/ElasticsearchCatHealth"; import { ElasticsearchCatNodes } from "~/operations/ElasticsearchCatNodes"; -import { ElasticsearchCatHealthStatus, IElasticsearchCatNodesResponse } from "~/operations/types"; +import { + ElasticsearchCatClusterHealthStatus, + IElasticsearchCatHealthResponse, + IElasticsearchCatNodesResponse +} from "~/operations/types"; import { UnhealthyClusterError } from "~/utils/waitUntilHealthy/UnhealthyClusterError"; +import { + ClusterHealthReason, + createClusterHealthStatusReason, + createMemoryReason, + createProcessorReason, + MemoryReason, + ProcessorReason +} from "./reason"; import { WaitingHealthyClusterAbortedError } from "./WaitingHealthyClusterAbortedError"; const WAITING_TIME_STEP = 10; +export type WaitingReason = ProcessorReason | MemoryReason | ClusterHealthReason; + export interface IWaitUntilHealthyParams { /** * Minimum status allowed, otherwise the cluster is considered unhealthy. */ - minStatus: ElasticsearchCatHealthStatus.Green | ElasticsearchCatHealthStatus.Yellow; + minClusterHealthStatus: + | ElasticsearchCatClusterHealthStatus.Green + | ElasticsearchCatClusterHealthStatus.Yellow; /** * Maximum processor percent allowed, otherwise the cluster is considered unhealthy. */ @@ -19,7 +35,7 @@ export interface IWaitUntilHealthyParams { /** * Maximum RAM percent allowed, otherwise the cluster is considered unhealthy. */ - maxRamPercent: number; + maxRamPercent?: number; /** * Maximum time to wait in seconds. * This is to prevent infinite waiting in case the cluster never becomes healthy. @@ -38,6 +54,7 @@ export interface IWaitOptionsOnUnhealthyParams { mustEndAt: Date; waitingTimeStep: number; runs: number; + waitingReason: WaitingReason; } export interface IWaitOptionsOnTimeoutParams { @@ -45,6 +62,7 @@ export interface IWaitOptionsOnTimeoutParams { mustEndAt: Date; waitingTimeStep: number; runs: number; + waitingReason: WaitingReason; } export interface IWaitOptions { @@ -91,13 +109,15 @@ class WaitUntilHealthy { const mustEndAt = new Date(startedAt.getTime() + this.options.maxWaitingTime * 1000); const waitingTimeStep = this.options.waitingTimeStep || WAITING_TIME_STEP; let runs = 1; - while (await this.shouldWait()) { + let waitingReason: WaitingReason | false; + while ((waitingReason = await this.shouldWait())) { if (new Date() >= mustEndAt) { if (options?.onTimeout) { await options.onTimeout({ startedAt, mustEndAt, waitingTimeStep, + waitingReason, runs }); } @@ -107,6 +127,7 @@ class WaitUntilHealthy { startedAt, mustEndAt, waitingTimeStep, + waitingReason, runs }); } @@ -130,22 +151,61 @@ class WaitUntilHealthy { }; } - private async shouldWait(): Promise { - const health = await this.catHealth.getHealth(); - const nodes = await this.catNodes.getNodes(); + private async shouldWait(): Promise { + let health: IElasticsearchCatHealthResponse; + let nodes: IElasticsearchCatNodesResponse; + try { + health = await this.catHealth.getHealth(); + } catch (ex) { + return createClusterHealthStatusReason({ + description: ex.message, + minimum: this.options.minClusterHealthStatus, + current: ElasticsearchCatClusterHealthStatus.Red + }); + } + try { + nodes = await this.catNodes.getNodes(); + } catch (ex) { + return createClusterHealthStatusReason({ + description: ex.message, + minimum: this.options.minClusterHealthStatus, + current: ElasticsearchCatClusterHealthStatus.Red + }); + } - const status = this.transformStatus(health.status); - if (status > this.transformStatus(this.options.minStatus)) { - return true; + const clusterHealthStatus = this.transformClusterHealthStatus(health.status); + const minClusterHealthStatus = this.transformClusterHealthStatus( + this.options.minClusterHealthStatus + ); + if (clusterHealthStatus > minClusterHealthStatus) { + return createClusterHealthStatusReason({ + minimum: this.options.minClusterHealthStatus, + current: health.status + }); } const processorPercent = this.getProcessorPercent(nodes); if (processorPercent > this.options.maxProcessorPercent) { - return true; + return createProcessorReason({ + maximum: this.options.maxProcessorPercent, + current: processorPercent + }); + } + /** + * Possibly no max ram definition? + */ + if (this.options.maxRamPercent === undefined) { + return false; } const ramPercent = this.getRamPercent(nodes); - return ramPercent > this.options.maxRamPercent; + if (ramPercent > this.options.maxRamPercent) { + return createMemoryReason({ + maximum: this.options.maxRamPercent, + current: ramPercent + }); + } + return false; } private getProcessorPercent(nodes: IElasticsearchCatNodesResponse): number { @@ -162,13 +222,13 @@ class WaitUntilHealthy { return total / nodes.length; } - private transformStatus(status: ElasticsearchCatHealthStatus): number { + private transformClusterHealthStatus(status: ElasticsearchCatClusterHealthStatus): number { switch (status) { - case ElasticsearchCatHealthStatus.Green: + case ElasticsearchCatClusterHealthStatus.Green: return 1; - case ElasticsearchCatHealthStatus.Yellow: + case ElasticsearchCatClusterHealthStatus.Yellow: return 2; - case ElasticsearchCatHealthStatus.Red: + case ElasticsearchCatClusterHealthStatus.Red: return 3; default: return 99; diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/index.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/index.ts index b260b1e9f80..0d8016d6417 100644 --- a/packages/api-elasticsearch/src/utils/waitUntilHealthy/index.ts +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/index.ts @@ -1 +1,6 @@ +export * from "./WaitingHealthyClusterAbortedError"; +export * from "./UnhealthyClusterError"; export * from "./WaitUntilHealthy"; +export * from "./UnhealthyClusterError"; +export * from "./WaitUntilHealthy"; +export * from "./reason"; diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/ClusterHealthReason.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/ClusterHealthReason.ts new file mode 100644 index 00000000000..60861210ff6 --- /dev/null +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/ClusterHealthReason.ts @@ -0,0 +1,27 @@ +import { ElasticsearchCatClusterHealthStatus } from "~/operations"; +import { IReason } from "~/utils/waitUntilHealthy/reason/IReason"; + +export interface IClusterHealthReasonParams { + minimum: ElasticsearchCatClusterHealthStatus; + current: ElasticsearchCatClusterHealthStatus; + description?: string; +} + +export class ClusterHealthReason implements IReason { + public readonly name = "clusterHealth"; + public readonly minimum: ElasticsearchCatClusterHealthStatus; + public readonly current: ElasticsearchCatClusterHealthStatus; + public readonly description?: string; + + public constructor(params: IClusterHealthReasonParams) { + this.minimum = params.minimum; + this.current = params.current; + this.description = params.description; + } +} + +export const createClusterHealthStatusReason = ( + params: IClusterHealthReasonParams +): ClusterHealthReason => { + return new ClusterHealthReason(params); +}; diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/IReason.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/IReason.ts new file mode 100644 index 00000000000..8677ad4d856 --- /dev/null +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/IReason.ts @@ -0,0 +1,4 @@ +export interface IReason { + name: string; + description?: string; +} diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/MemoryReason.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/MemoryReason.ts new file mode 100644 index 00000000000..c02edf8fcca --- /dev/null +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/MemoryReason.ts @@ -0,0 +1,24 @@ +import { IReason } from "~/utils/waitUntilHealthy/reason/IReason"; + +export interface IMemoryReasonParams { + maximum: number; + current: number; + description?: string; +} + +export class MemoryReason implements IReason { + public readonly name = "memory"; + public readonly maximum: number; + public readonly current: number; + public readonly description?: string; + + public constructor(params: IMemoryReasonParams) { + this.maximum = params.maximum; + this.current = params.current; + this.description = params.description; + } +} + +export const createMemoryReason = (params: IMemoryReasonParams): MemoryReason => { + return new MemoryReason(params); +}; diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/ProcessorReason.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/ProcessorReason.ts new file mode 100644 index 00000000000..880fc65695f --- /dev/null +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/ProcessorReason.ts @@ -0,0 +1,24 @@ +import { IReason } from "~/utils/waitUntilHealthy/reason/IReason"; + +export interface IProcessorReasonParams { + maximum: number; + current: number; + description?: string; +} + +export class ProcessorReason implements IReason { + public readonly name = "processor"; + public readonly maximum: number; + public readonly current: number; + public readonly description?: string; + + public constructor(params: IProcessorReasonParams) { + this.maximum = params.maximum; + this.current = params.current; + this.description = params.description; + } +} + +export const createProcessorReason = (params: IProcessorReasonParams): ProcessorReason => { + return new ProcessorReason(params); +}; diff --git a/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/index.ts b/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/index.ts new file mode 100644 index 00000000000..3e9ab4f7fb6 --- /dev/null +++ b/packages/api-elasticsearch/src/utils/waitUntilHealthy/reason/index.ts @@ -0,0 +1,3 @@ +export * from "./ClusterHealthReason"; +export * from "./MemoryReason"; +export * from "./ProcessorReason"; diff --git a/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts b/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts index 7cb3a077268..9742c42422a 100644 --- a/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts +++ b/packages/api-headless-cms-ddb-es/src/operations/entry/index.ts @@ -68,10 +68,14 @@ const IGNORED_ES_SEARCH_EXCEPTIONS = [ "search_phase_execution_exception" ]; -const shouldIgnoreElasticsearchException = (ex: Pick) => { +const shouldIgnoreElasticsearchException = (ex: WebinyError) => { if (IGNORED_ES_SEARCH_EXCEPTIONS.includes(ex.message)) { console.log(`Ignoring Elasticsearch exception: ${ex.message}`); - console.log(ex); + console.log({ + code: ex.code, + data: ex.data, + stack: ex.stack + }); return true; } return false; diff --git a/packages/api-headless-cms-es-tasks/.babelrc.js b/packages/api-headless-cms-es-tasks/.babelrc.js new file mode 100644 index 00000000000..9da7674cb52 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/.babelrc.js @@ -0,0 +1 @@ +module.exports = require("@webiny/project-utils").createBabelConfigForNode({ path: __dirname }); diff --git a/packages/api-headless-cms-es-tasks/LICENSE b/packages/api-headless-cms-es-tasks/LICENSE new file mode 100644 index 00000000000..f772d04d4db --- /dev/null +++ b/packages/api-headless-cms-es-tasks/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Webiny + +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/api-headless-cms-es-tasks/README.md b/packages/api-headless-cms-es-tasks/README.md new file mode 100644 index 00000000000..c266143a38c --- /dev/null +++ b/packages/api-headless-cms-es-tasks/README.md @@ -0,0 +1,15 @@ +# @webiny/api-headless-cms-tasks +[![](https://img.shields.io/npm/dw/@webiny/api-headless-cms-tasks.svg)](https://www.npmjs.com/package/@webiny/api-headless-cms-tasks) +[![](https://img.shields.io/npm/v/@webiny/api-headless-cms-tasks.svg)](https://www.npmjs.com/package/@webiny/api-headless-cms-tasks) +[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +## Install +``` +npm install --save @webiny/api-headless-cms-tasks +``` + +Or if you prefer yarn: +``` +yarn add @webiny/api-headless-cms-tasks +``` diff --git a/packages/api-headless-cms-es-tasks/__tests__/context/helpers.ts b/packages/api-headless-cms-es-tasks/__tests__/context/helpers.ts new file mode 100644 index 00000000000..688a4588b86 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/__tests__/context/helpers.ts @@ -0,0 +1,90 @@ +import { SecurityIdentity } from "@webiny/api-security/types"; +import { ContextPlugin } from "@webiny/api"; +import { Context } from "~/types"; + +export interface PermissionsArg { + name: string; + locales?: string[]; + rwd?: string; + pw?: string; + own?: boolean; +} + +export const identity = { + id: "id-12345678", + displayName: "John Doe", + type: "admin" +}; + +const getSecurityIdentity = () => { + return identity; +}; + +export const createPermissions = (permissions?: PermissionsArg[]): PermissionsArg[] => { + if (permissions) { + return permissions; + } + return [ + { + name: "cms.settings" + }, + { + name: "cms.contentModel", + rwd: "rwd" + }, + { + name: "cms.contentModelGroup", + rwd: "rwd" + }, + { + name: "cms.contentEntry", + rwd: "rwd", + pw: "rcpu" + }, + { + name: "cms.endpoint.read" + }, + { + name: "cms.endpoint.manage" + }, + { + name: "cms.endpoint.preview" + }, + { + name: "content.i18n", + locales: ["en-US", "de-DE"] + } + ]; +}; + +export const createIdentity = (identity?: SecurityIdentity) => { + if (!identity) { + return getSecurityIdentity(); + } + return identity; +}; + +export const createDummyLocales = () => { + return new ContextPlugin(async context => { + const { i18n, security } = context; + + await security.authenticate(""); + + await security.withoutAuthorization(async () => { + const [items] = await i18n.locales.listLocales({ + where: {} + }); + if (items.length > 0) { + return; + } + await i18n.locales.createLocale({ + code: "en-US", + default: true + }); + await i18n.locales.createLocale({ + code: "de-DE", + default: true + }); + }); + }); +}; diff --git a/packages/api-headless-cms-es-tasks/__tests__/context/plugins.ts b/packages/api-headless-cms-es-tasks/__tests__/context/plugins.ts new file mode 100644 index 00000000000..9526cb78e3e --- /dev/null +++ b/packages/api-headless-cms-es-tasks/__tests__/context/plugins.ts @@ -0,0 +1,107 @@ +import apiKeyAuthentication from "@webiny/api-security/plugins/apiKeyAuthentication"; +import apiKeyAuthorization from "@webiny/api-security/plugins/apiKeyAuthorization"; +import i18nContext from "@webiny/api-i18n/graphql/context"; +import graphQLHandlerPlugins from "@webiny/handler-graphql"; +import { createHeadlessCmsContext, createHeadlessCmsGraphQL } from "@webiny/api-headless-cms"; +import { createWcpContext } from "@webiny/api-wcp"; +import { createTenancyAndSecurity } from "./tenancySecurity"; +import { createDummyLocales, createPermissions, PermissionsArg } from "./helpers"; +import { ApiKey, SecurityIdentity } from "@webiny/api-security/types"; +import { ContextPlugin } from "@webiny/api"; +import { Context } from "~/types"; +import { mockLocalesPlugins } from "@webiny/api-i18n/graphql/testing"; +import { Plugin, PluginCollection } from "@webiny/plugins/types"; +import { getStorageOps } from "@webiny/project-utils/testing/environment"; +import { createBackgroundTaskContext } from "@webiny/tasks"; +import { HeadlessCmsStorageOperations } from "@webiny/api-headless-cms/types"; +import { createHeadlessCmsEsTasks } from "~/index"; +import { createMockTaskTriggerTransportPlugin } from "@webiny/project-utils/testing/tasks/mockTaskTriggerTransportPlugin"; + +export interface CreateHandlerCoreParams { + setupTenancyAndSecurityGraphQL?: boolean; + permissions?: PermissionsArg[]; + identity?: SecurityIdentity; + topPlugins?: Plugin | Plugin[] | Plugin[][] | PluginCollection; + plugins?: Plugin | Plugin[] | Plugin[][] | PluginCollection; + bottomPlugins?: Plugin | Plugin[] | Plugin[][] | PluginCollection; + path?: `manage/${string}-${string}}` | `read/${string}-${string}}` | string; +} + +export const createHandlerCore = (params: CreateHandlerCoreParams = {}) => { + const tenant = { + id: "root", + name: "Root", + parent: null + }; + const { + permissions, + identity, + plugins = [], + topPlugins = [], + bottomPlugins = [], + setupTenancyAndSecurityGraphQL + } = params; + + const cmsStorage = getStorageOps("cms"); + const i18nStorage = getStorageOps("i18n"); + + return { + storageOperations: cmsStorage.storageOperations, + tenant, + plugins: [ + topPlugins, + createWcpContext(), + ...cmsStorage.plugins, + ...createTenancyAndSecurity({ + setupGraphQL: setupTenancyAndSecurityGraphQL, + permissions: createPermissions(permissions), + identity + }), + { + type: "context", + name: "context-security-tenant", + async apply(context) { + context.security.getApiKeyByToken = async ( + token: string + ): Promise => { + if (!token || token !== "aToken") { + return null; + } + const apiKey = "a1234567890"; + return { + id: apiKey, + name: apiKey, + tenant: tenant.id, + permissions: identity?.permissions || [], + token, + createdBy: { + id: "test", + displayName: "test", + type: "admin" + }, + description: "test", + createdOn: new Date().toISOString(), + webinyVersion: context.WEBINY_VERSION + }; + }; + } + } as ContextPlugin, + apiKeyAuthentication({ identityType: "api-key" }), + apiKeyAuthorization({ identityType: "api-key" }), + i18nContext(), + i18nStorage.storageOperations, + createDummyLocales(), + mockLocalesPlugins(), + createHeadlessCmsContext({ + storageOperations: cmsStorage.storageOperations + }), + createBackgroundTaskContext(), + createHeadlessCmsGraphQL(), + plugins, + graphQLHandlerPlugins(), + createHeadlessCmsEsTasks(), + createMockTaskTriggerTransportPlugin(), + bottomPlugins + ] + }; +}; diff --git a/packages/api-headless-cms-es-tasks/__tests__/context/tenancySecurity.ts b/packages/api-headless-cms-es-tasks/__tests__/context/tenancySecurity.ts new file mode 100644 index 00000000000..cf869285b1f --- /dev/null +++ b/packages/api-headless-cms-es-tasks/__tests__/context/tenancySecurity.ts @@ -0,0 +1,102 @@ +import { Plugin } from "@webiny/plugins/Plugin"; +import { createTenancyContext, createTenancyGraphQL } from "@webiny/api-tenancy"; +import { createSecurityContext, createSecurityGraphQL } from "@webiny/api-security"; +import { + SecurityIdentity, + SecurityPermission, + SecurityStorageOperations +} from "@webiny/api-security/types"; +import { ContextPlugin } from "@webiny/api"; +import { BeforeHandlerPlugin } from "@webiny/handler"; +import { Context } from "~/types"; +import { getStorageOps } from "@webiny/project-utils/testing/environment"; +import { TenancyStorageOperations, Tenant } from "@webiny/api-tenancy/types"; + +interface Config { + setupGraphQL?: boolean; + permissions: SecurityPermission[]; + identity?: SecurityIdentity | null; +} + +export const defaultIdentity: SecurityIdentity = { + id: "id-12345678", + type: "admin", + displayName: "John Doe" +}; + +export const createTenancyAndSecurity = ({ + setupGraphQL, + permissions, + identity +}: Config): Plugin[] => { + const tenancyStorage = getStorageOps("tenancy"); + const securityStorage = getStorageOps("security"); + + return [ + createTenancyContext({ storageOperations: tenancyStorage.storageOperations }), + setupGraphQL ? createTenancyGraphQL() : null, + createSecurityContext({ storageOperations: securityStorage.storageOperations }), + setupGraphQL ? createSecurityGraphQL() : null, + new ContextPlugin(async context => { + await context.tenancy.createTenant({ + id: "root", + name: "Root", + parent: "", + description: "Root tenant", + tags: [] + }); + + await context.tenancy.createTenant({ + id: "webiny", + name: "Webiny", + parent: "", + description: "Webiny tenant", + tags: [] + }); + + await context.tenancy.createTenant({ + id: "dev", + name: "Dev", + parent: "", + description: "Dev tenant", + tags: [] + }); + + await context.tenancy.createTenant({ + id: "sales", + name: "Sales", + parent: "", + description: "Sales tenant", + tags: [] + }); + }), + new ContextPlugin(async context => { + context.tenancy.setCurrentTenant({ + id: "root", + name: "Root", + webinyVersion: context.WEBINY_VERSION + } as unknown as Tenant); + + context.security.addAuthenticator(async () => { + return identity || defaultIdentity; + }); + + context.security.addAuthorizer(async () => { + const { headers = {} } = context.request || {}; + if (headers["authorization"]) { + return null; + } + + return permissions || [{ name: "*" }]; + }); + }), + new BeforeHandlerPlugin(context => { + const { headers = {} } = context.request || {}; + if (headers["authorization"]) { + return context.security.authenticate(headers["authorization"]); + } + + return context.security.authenticate(""); + }) + ].filter(Boolean) as Plugin[]; +}; diff --git a/packages/api-headless-cms-es-tasks/__tests__/context/useHandler.ts b/packages/api-headless-cms-es-tasks/__tests__/context/useHandler.ts new file mode 100644 index 00000000000..a7d92dd89d7 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/__tests__/context/useHandler.ts @@ -0,0 +1,51 @@ +import { createHandlerCore, CreateHandlerCoreParams } from "./plugins"; +import { createRawEventHandler, createRawHandler } from "@webiny/handler-aws"; +import { Context } from "~/types"; +import { defaultIdentity } from "./tenancySecurity"; +import { LambdaContext } from "@webiny/handler-aws/types"; +import { getElasticsearchClient } from "@webiny/project-utils/testing/elasticsearch"; + +interface CmsHandlerEvent { + path: string; + headers: { + ["x-tenant"]: string; + [key: string]: string; + }; +} + +type Params = CreateHandlerCoreParams; +export const useHandler = (params: Params = {}) => { + const core = createHandlerCore(params); + + const plugins = [...core.plugins].concat([ + createRawEventHandler(async ({ context }) => { + return context; + }) + ]); + + const handler = createRawHandler({ + plugins, + debug: process.env.DEBUG === "true" + }); + + const { elasticsearchClient } = getElasticsearchClient({ name: "api-headless-cms-ddb-es" }); + + return { + plugins, + identity: params.identity || defaultIdentity, + tenant: core.tenant, + elasticsearch: elasticsearchClient, + handler: (input?: CmsHandlerEvent) => { + const payload: CmsHandlerEvent = { + path: "/cms/manage/en-US", + headers: { + "x-webiny-cms-endpoint": "manage", + "x-webiny-cms-locale": "en-US", + "x-tenant": "root" + }, + ...input + }; + return handler(payload, {} as LambdaContext); + } + }; +}; diff --git a/packages/api-headless-cms-es-tasks/__tests__/graphql/examples.graphql b/packages/api-headless-cms-es-tasks/__tests__/graphql/examples.graphql new file mode 100644 index 00000000000..11f142f5a17 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/__tests__/graphql/examples.graphql @@ -0,0 +1,68 @@ +mutation StartMockDataGenerator { + backgroundTasks { + triggerTask(definition: "mockDataManager", input: { + modelId: "cars", + amount: 10000 + }) { + data { + id + } + error { + message + code + data + } + } + } +} + + +mutation AbortMockDataGenerator { + backgroundTasks { + abortTask(id: "YOUR_TASK_ID") { + data { + id + } + error { + message + code + data + } + } + } +} + + +query GetMockDataGenerator { + backgroundTasks { + getTask(id: "YOUR_TASK_ID") { + data { + id + taskStatus + } + error { + message + code + data + } + } + } +} + +query ListChildMockDataCreators { + backgroundTasks { + listTasks(where: { + parentId: "YOUR_TASK_ID" + }) { + data { + id + taskStatus + } + error { + message + code + data + } + } + } +} diff --git a/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateAmounts.test.ts b/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateAmounts.test.ts new file mode 100644 index 00000000000..dc6a7147f0a --- /dev/null +++ b/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateAmounts.test.ts @@ -0,0 +1,155 @@ +import { calculateAmounts } from "~/tasks/MockDataManager/calculateAmounts"; + +describe("calculateAmounts", () => { + it.skip("should properly calculate the amount of tasks and records - 50", async () => { + const values = calculateAmounts(50); + + expect(values).toEqual({ + amountOfTasks: 1, + amountOfRecords: 50 + }); + }); + it.skip("should properly calculate the amount of tasks and records - 100", async () => { + const values = calculateAmounts(100); + + expect(values).toEqual({ + amountOfTasks: 1, + amountOfRecords: 100 + }); + }); + it.skip("should properly calculate the amount of tasks and records - 249", async () => { + const values = calculateAmounts(249); + + expect(values).toEqual({ + amountOfTasks: 1, + amountOfRecords: 249 + }); + }); + it.skip("should properly calculate the amount of tasks and records - 251", async () => { + const values = calculateAmounts(251); + + expect(values).toEqual({ + amountOfTasks: 1, + amountOfRecords: 251 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 500", async () => { + const values = calculateAmounts(500); + + expect(values).toEqual({ + amountOfTasks: 1, + amountOfRecords: 500 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 999", async () => { + const values = calculateAmounts(999); + + expect(values).toEqual({ + amountOfTasks: 1, + amountOfRecords: 999 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 9999", async () => { + const values = calculateAmounts(9999); + + expect(values).toEqual({ + amountOfTasks: 5, + amountOfRecords: 2000 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 10001", async () => { + const values = calculateAmounts(10001); + + expect(values).toEqual({ + amountOfTasks: 5, + amountOfRecords: 2000 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 25001", async () => { + const values = calculateAmounts(25001); + + expect(values).toEqual({ + amountOfTasks: 5, + amountOfRecords: 5000 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 250000", async () => { + const values = calculateAmounts(250000); + + expect(values).toEqual({ + amountOfTasks: 10, + amountOfRecords: 25000 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 990000", async () => { + const values = calculateAmounts(990000); + + expect(values).toEqual({ + amountOfTasks: 50, + amountOfRecords: 19800 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 2900000", async () => { + const values = calculateAmounts(2900000); + + expect(values).toEqual({ + amountOfTasks: 100, + amountOfRecords: 29000 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 3100000", async () => { + const values = calculateAmounts(3100000); + + expect(values).toEqual({ + amountOfTasks: 100, + amountOfRecords: 31000 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 5100000", async () => { + const values = calculateAmounts(5100000); + + expect(values).toEqual({ + amountOfTasks: 200, + amountOfRecords: 25500 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 10000000", async () => { + const values = calculateAmounts(10000000); + + expect(values).toEqual({ + amountOfTasks: 200, + amountOfRecords: 50000 + }); + }); + + it.skip("should properly calculate the amount of tasks and records - 10000001", async () => { + expect.assertions(1); + + try { + calculateAmounts(10000001); + } catch (ex) { + expect(ex.message).toBe(`No valid value found - input value is too large: 10000001.`); + } + }); + + it.skip("should properly calculate the amount of tasks and records - 50000000", async () => { + expect.assertions(1); + + try { + calculateAmounts(50000000); + } catch (ex) { + expect(ex.message).toBe(`No valid value found - input value is too large: 50000000.`); + } + }); +}); diff --git a/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateSeconds.test.ts b/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateSeconds.test.ts new file mode 100644 index 00000000000..a053f162cae --- /dev/null +++ b/packages/api-headless-cms-es-tasks/__tests__/tasks/MockDataManager/calculateSeconds.test.ts @@ -0,0 +1,63 @@ +import { calculateSeconds } from "~/tasks/MockDataManager/calculateSeconds"; + +describe("calculate seconds to wait for task based on amount of records", () => { + it("should properly calculate the amount of seconds - 5", async () => { + const values = calculateSeconds(5); + + expect(values).toBe(15); + }); + + it("should properly calculate the amount of seconds - 10", async () => { + const values = calculateSeconds(10); + + expect(values).toBe(15); + }); + + it("should properly calculate the amount of seconds - 14", async () => { + const values = calculateSeconds(14); + + expect(values).toBe(15); + }); + + it("should properly calculate the amount of seconds - 16", async () => { + const values = calculateSeconds(16); + + expect(values).toBe(15); + }); + + it("should properly calculate the amount of seconds - 50", async () => { + const values = calculateSeconds(50); + + expect(values).toBe(15); + }); + + it("should properly calculate the amount of seconds - 100", async () => { + const values = calculateSeconds(100); + + expect(values).toBe(25); + }); + + it("should properly calculate the amount of seconds - 200", async () => { + const values = calculateSeconds(200); + + expect(values).toBe(50); + }); + + it("should properly calculate the amount of seconds - 300", async () => { + const values = calculateSeconds(300); + + expect(values).toBe(75); + }); + + it("should properly calculate the amount of seconds - 400", async () => { + const values = calculateSeconds(400); + + expect(values).toBe(90); + }); + + it("should properly calculate the amount of seconds - 500", async () => { + const values = calculateSeconds(500); + + expect(values).toBe(90); + }); +}); diff --git a/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataCreatorTask.test.ts b/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataCreatorTask.test.ts new file mode 100644 index 00000000000..472057bdd8a --- /dev/null +++ b/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataCreatorTask.test.ts @@ -0,0 +1,65 @@ +import { useHandler } from "~tests/context/useHandler"; +import { createRunner } from "@webiny/project-utils/testing/tasks"; +import { Context } from "~/types"; +import { IMockDataCreatorInput, IMockDataCreatorOutput } from "~/tasks/MockDataCreator/types"; +import { + createMockDataCreatorTask, + MOCK_DATA_CREATOR_TASK_ID +} from "~/tasks/createMockDataCreatorTask"; +import { TaskResponseStatus } from "@webiny/tasks"; +import { + createModelAndGroup, + ICreateModelAndGroupResultSuccess +} from "~/tasks/MockDataManager/createModelAndGroup"; +import { CARS_MODEL_ID } from "~/tasks/MockDataManager/constants"; +import { disableIndexing, enableIndexing } from "~/utils"; + +jest.setTimeout(120000); + +describe("mock data creator task", () => { + it("should create a mock data creator task", async () => { + const { handler } = useHandler(); + + const context = await handler(); + + const modelAndGroupResult = (await createModelAndGroup({ + context, + modelId: CARS_MODEL_ID + })) as ICreateModelAndGroupResultSuccess; + expect(modelAndGroupResult).not.toBeInstanceOf(String); + + await disableIndexing({ + client: context.elasticsearch, + model: modelAndGroupResult.model + }); + + const task = await context.tasks.createTask({ + definitionId: MOCK_DATA_CREATOR_TASK_ID, + name: "Testing of a Mock Data Creator Task", + input: { + createdAmount: 0, + totalAmount: 100 + } + }); + + const runner = createRunner({ + context, + task: createMockDataCreatorTask() + }); + + const result = await runner({ + webinyTaskId: task.id, + tenant: "root", + locale: "en-US" + }); + + await enableIndexing({ + client: context.elasticsearch, + model: modelAndGroupResult.model + }); + + expect(result).toMatchObject({ + status: TaskResponseStatus.DONE + }); + }); +}); diff --git a/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataManagerTask.test.ts b/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataManagerTask.test.ts new file mode 100644 index 00000000000..1748d555b84 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/__tests__/tasks/mockDataManagerTask.test.ts @@ -0,0 +1,65 @@ +import { + MOCK_DATA_MANAGER_TASK_ID, + createMockDataManagerTask +} from "~/tasks/createMockDataManagerTask"; +import { useHandler } from "~tests/context/useHandler"; +import { createRunner } from "@webiny/project-utils/testing/tasks"; +import { Context, IMockDataManagerInput, IMockDataManagerOutput } from "~/types"; +import { TaskResponseStatus } from "@webiny/tasks"; +import { CARS_MODEL_ID } from "~/tasks/MockDataManager/constants"; + +describe("mock data manager task", () => { + it("should create a mock data manager task", async () => { + const { handler } = useHandler(); + + const context = await handler(); + + const task = await context.tasks.createTask({ + definitionId: MOCK_DATA_MANAGER_TASK_ID, + name: "Testing of a Mock Data Manager Task", + input: { + modelId: CARS_MODEL_ID, + amount: 1 + } + }); + + const runner = createRunner({ + context, + task: createMockDataManagerTask() + }); + + const result = await runner({ + webinyTaskId: task.id, + tenant: "root", + locale: "en-US" + }); + + expect(result).toMatchObject({ + status: TaskResponseStatus.CONTINUE, + wait: 15, + input: { + amount: 1, + seconds: 15, + amountOfTasks: 1, + amountOfRecords: 1 + } + }); + + const childTasks = await context.tasks.listTasks({ + where: { + parentId: task.id + }, + limit: 10000 + }); + expect(childTasks).toMatchObject({ + items: [ + { + name: "Mock Data Creator Task #1 of 1" + } + ], + meta: { + totalCount: 1 + } + }); + }); +}); diff --git a/packages/api-headless-cms-es-tasks/jest.setup.js b/packages/api-headless-cms-es-tasks/jest.setup.js new file mode 100644 index 00000000000..07ca953f954 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/jest.setup.js @@ -0,0 +1,12 @@ +const base = require("../../jest.config.base"); +const presets = require("@webiny/project-utils/testing/presets")( + ["@webiny/api-admin-users", "storage-operations"], + ["@webiny/api-headless-cms", "storage-operations"], + ["@webiny/api-i18n", "storage-operations"], + ["@webiny/api-security", "storage-operations"], + ["@webiny/api-tenancy", "storage-operations"] +); + +module.exports = { + ...base({ path: __dirname }, presets) +}; diff --git a/packages/api-headless-cms-es-tasks/package.json b/packages/api-headless-cms-es-tasks/package.json new file mode 100644 index 00000000000..c9dfebabcbf --- /dev/null +++ b/packages/api-headless-cms-es-tasks/package.json @@ -0,0 +1,49 @@ +{ + "name": "@webiny/api-headless-cms-es-tasks", + "version": "0.0.0", + "main": "index.js", + "description": "Elasticsearch Background tasks for Webiny Headless CMS", + "keywords": [ + "api-headless-cms-es-tasks:base" + ], + "repository": { + "type": "git", + "url": "https://github.com/webiny/webiny-js.git", + "directory": "packages/api-headless-cms-es-tasks" + }, + "license": "MIT", + "dependencies": { + "@webiny/api-elasticsearch": "0.0.0", + "@webiny/api-headless-cms": "0.0.0", + "@webiny/api-headless-cms-ddb-es": "0.0.0", + "@webiny/handler": "0.0.0", + "@webiny/handler-aws": "0.0.0", + "@webiny/tasks": "0.0.0", + "@webiny/utils": "0.0.0" + }, + "devDependencies": { + "@babel/cli": "^7.22.6", + "@babel/core": "^7.22.8", + "@babel/preset-env": "^7.22.7", + "@faker-js/faker": "^8.4.1", + "@webiny/api": "0.0.0", + "@webiny/api-i18n": "0.0.0", + "@webiny/api-security": "0.0.0", + "@webiny/api-tenancy": "0.0.0", + "@webiny/api-wcp": "0.0.0", + "@webiny/cli": "0.0.0", + "@webiny/handler-graphql": "0.0.0", + "@webiny/plugins": "0.0.0", + "@webiny/project-utils": "0.0.0", + "ttypescript": "^1.5.13", + "typescript": "^4.7.4" + }, + "scripts": { + "build": "yarn webiny run build", + "watch": "yarn webiny run watch" + }, + "publishConfig": { + "access": "public", + "directory": "dist" + } +} diff --git a/packages/api-headless-cms-es-tasks/src/index.ts b/packages/api-headless-cms-es-tasks/src/index.ts new file mode 100644 index 00000000000..3901b078ae0 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/index.ts @@ -0,0 +1,10 @@ +import { createMockDataManagerTask } from "~/tasks/createMockDataManagerTask"; +import { createMockDataCreatorTask } from "~/tasks/createMockDataCreatorTask"; + +export * from "./tasks/createMockDataManagerTask"; +export * from "./tasks/createMockDataCreatorTask"; + +export const createHeadlessCmsEsTasks = () => [ + createMockDataManagerTask(), + createMockDataCreatorTask() +]; diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/MockDataCreator.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/MockDataCreator.ts new file mode 100644 index 00000000000..885deaee757 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/MockDataCreator.ts @@ -0,0 +1,109 @@ +import { ITaskResponseResult, ITaskRunParams } from "@webiny/tasks"; +import { IMockDataCreatorInput, IMockDataCreatorOutput } from "./types"; +import { CmsModelManager } from "@webiny/api-headless-cms/types"; +import { mockData } from "./mockData"; +import { createWaitUntilHealthy } from "@webiny/api-elasticsearch/utils/waitUntilHealthy"; +import { Context } from "~/types"; +import { ElasticsearchCatClusterHealthStatus } from "@webiny/api-elasticsearch/operations/types"; +import { mdbid } from "@webiny/utils"; + +export class MockDataCreator< + C extends Context, + I extends IMockDataCreatorInput, + O extends IMockDataCreatorOutput +> { + public async execute(params: ITaskRunParams): Promise> { + const { context, isAborted, input, response, isCloseToTimeout } = params; + + if (isAborted()) { + return response.aborted(); + } else if (isCloseToTimeout()) { + return response.continue({ + ...input + }); + } + + let manager: CmsModelManager; + try { + manager = await context.cms.getEntryManager("cars"); + } catch (ex) { + return response.error(ex); + } + + const healthCheck = createWaitUntilHealthy(context.elasticsearch, { + waitingTimeStep: 20, + maxWaitingTime: 150, + maxProcessorPercent: 80, + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Yellow, + maxRamPercent: 101 + }); + + let createdAmount = input.createdAmount; + + for (; createdAmount < input.totalAmount; createdAmount++) { + if (isAborted()) { + return response.aborted(); + } else if (isCloseToTimeout()) { + return response.continue({ + ...input, + createdAmount + }); + } + if (createdAmount % 50 === 0) { + try { + await healthCheck.wait({ + async onUnhealthy({ + waitingTimeStep, + startedAt, + mustEndAt, + runs, + waitingReason + }) { + console.warn(`Cluster is unhealthy on run #${runs}.`, { + startedAt, + mustEndAt, + waitingTimeStep, + waitingReason + }); + }, + async onTimeout({ + waitingTimeStep, + startedAt, + mustEndAt, + runs, + waitingReason + }) { + console.warn(`Cluster health check timed out on run #${runs}.`, { + startedAt, + mustEndAt, + waitingTimeStep, + waitingReason + }); + } + }); + } catch (ex) { + return response.continue( + { + ...input, + createdAmount + }, + { + seconds: 30 + } + ); + } + } + const taskId = params.store.getTask().id; + try { + await manager.create({ + id: `${taskId}${mdbid()}`, + ...mockData + }); + } catch (ex) { + return response.error(ex); + } + } + + return params.response.done(`Created ${input.totalAmount} records.`); + } +} diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/mockData.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/mockData.ts new file mode 100644 index 00000000000..861386928ec --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/mockData.ts @@ -0,0 +1,1361 @@ +import { ROOT_FOLDER } from "@webiny/api-headless-cms/constants"; + +const text = + "orem ipsum dolor sit amet, consectetur adipiscing elit. Sed augue justo, tempor vel aliquet id, sodales ut est. Morbi sodales lacus lacinia justo molestie, a vulputate ligula ornare. Cras commodo augue sed suscipit auctor. Mauris dapibus vulputate nibh, ultrices porta risus ullamcorper in. Praesent iaculis faucibus tellus, eget egestas mauris ultrices in. Ut dapibus felis id tincidunt tempor. Cras imperdiet lectus et mollis facilisis. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Curabitur vitae nulla ut quam cursus viverra ac sed felis. Cras eget nulla nunc. Phasellus facilisis ante in velit tincidunt posuere. Aenean a cursus ex. In a accumsan metus. Nullam faucibus sapien ac pulvinar volutpat. Sed varius sem quis libero pharetra ullamcorper."; + +const paragraph = (): string => { + return text; +}; + +const paragraphs = (length = 1): string => { + return Array.from({ length }) + .map(() => paragraph()) + .join("\n"); +}; + +const createMockData = () => { + return { + wbyAco_location: { + folderId: ROOT_FOLDER + }, + standardTires: "P235/75R15 BSW", + newUsedBg: "USED", + ymmMaxPriceRange: 23810, + carsEditorialRating: null, + priceRangeSlug: "under-20000", + specifications: { + specGvwr: "5,150 lb", + stdMpgWithUnits: "16/22 mpg", + specHorsepower: "185@5,600", + driveTrain: "4WD", + rearShoulderRoom: "N/A", + specTonnage: "N/A", + vehicleClass: "Compact Pickup 4WD", + cylinderConfiguration: "In-line", + seatingCapacity: "3/3", + specWidth: "68.6 in", + transmissionType: "Manual", + frontShoulderRoom: "57.1 in", + heroValue1: "16/22", + numberOfCylinders: "4", + specWheelase: "111.3 in", + rearLegroom: "N/A", + fuelCapacity: "19.0", + engineType: "Gas", + rearHeadroom: "N/A", + groundClearance: "7.9 in", + payloadCapacity: "1,535 lb", + specHeight: "67.6 in", + stdEpaMpg: "16/22", + curbWeight: "3,615 lb", + specTorque: "190@2,800", + heroLabel1: "MPG", + frontLegroom: "42.2 in", + drivingRange: "361 miles", + specLength: "192.4 in", + fuelType: "Unleaded Regular", + engineName: "4-Cyl, 2.9 Liter", + cargoCapacity: "N/A", + transmissionName: "5 Speed Manual w/Overdrive", + frontHeadroom: "39.6 in", + towingCapacity: "4,000 lb" + }, + carsVehicle: "Chevrolet-Colorado-2007-LS 4WD Regular Cab", + marketingImage: null, + priceRangeText: "Under $20K", + baseVehicle: 0, + carsUid: 756335, + bodyTypeText: "Trucks", + slugBodyType: "truck", + carsMakePageShow: 0, + slugYearMakeModel: "2007/chevrolet/colorado", + safetyRatings: { + nhtsaRatingFrontDriver: "4", + nhtsaRatingRollover: "4", + nhtsaRatingFrontPassenger: "4", + iihsBestPick: "0", + nhtsaRatingRearSide: "No Data", + iihsOverallSideCrash: "N/R", + nhtsaRatingOverall: "N/R", + nhtsaRatingFrontSide: "4", + iihsFrontModerateOverlap: "N/R", + iihsFrontSmallOverlap: "N/R", + iihsRearCrash: "N/R", + iihsRoofStrength: "N/R" + }, + bodyStyle: "Truck", + slugMake: "chevrolet", + bodyType: "Truck", + secondaryBodyTypeOrder: null, + ymmLowestPriceRange: 14085, + cpoComparison: { + cpoMake: "Chevrolet", + cpoYear: 2007, + cpoTotalMonthly: null, + usedMonthly: null, + usedMaintenanceRepairs: null, + vehicleRating: "N/A", + cpoMaintenanceRepairs: null, + usedCarTrim: "LS 4WD Regular Cab", + usedTotalMonthly: null, + modelName: "Colorado", + cpoPrice: "N/R", + usedCarPrice: null, + cpoMonthly: null + }, + secondaryBodyType: null, + slugHybridElectricCategory: null, + featuredImage: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-angular-front.png", + featuresIntellicar: { + driveCategory: [ + { + categorySequenceNmb: 10, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Drivetrain, 4WD", + availability: "Std" + } + ], + mirrorsCategory: [ + { + categorySequenceNmb: 16, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Dual Manual", + availability: "Std" + } + ], + suspensionCategory: [ + { + categorySequenceNmb: 25, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Springs, Front, 2755-lb Cap", + availability: "Std" + }, + { + categorySequenceNmb: 25, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Springs, Rear, 2900-lb Cap", + availability: "Std" + }, + { + categorySequenceNmb: 25, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Stabilizer Bar, Front", + availability: "Std" + } + ], + soundCategory: [ + { + categorySequenceNmb: 22, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Radio, AM/FM Stereo", + availability: "Std" + }, + { + categorySequenceNmb: 22, + includesNote: null, + invoice: 361.05, + sequenceNmb: 1, + retail: 435, + name: " Radio, AM/FM Stereo w/CD & MP3", + availability: "Opt" + } + ], + engineCategory: [ + { + categorySequenceNmb: 2, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Engine: 4-Cyl, 2.9 Liter", + availability: "Std" + }, + { + categorySequenceNmb: 2, + includesNote: null, + invoice: 830, + sequenceNmb: 1, + retail: 1000, + name: " Engine: 5-Cyl, 3.7 Liter", + availability: "Opt" + } + ], + packageCategory: [ + { + categorySequenceNmb: 1, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Option Pkg", + availability: "Std" + }, + { + categorySequenceNmb: 1, + includesNote: " INCLUDES: [**W] Vinyl Seat Trim", + invoice: 141.75, + sequenceNmb: 1, + retail: 150, + name: " Option Pkg, Work Truck", + availability: "Opt" + }, + { + categorySequenceNmb: 1, + includesNote: paragraphs(1), + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Street Pack", + availability: "Opt" + }, + { + categorySequenceNmb: 1, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Suspension Pkg, Standard", + availability: "Std" + } + ], + otherCategory: [], + paintCategory: [ + { + categorySequenceNmb: 19, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Solid", + availability: "Std" + } + ], + specialFeesCreditsOptionsCategory: [ + { + categorySequenceNmb: 23, + includesNote: null, + invoice: 50, + sequenceNmb: 1, + retail: 0, + name: " New Jersey Surcharge", + availability: "Opt" + }, + { + categorySequenceNmb: 23, + includesNote: null, + invoice: -50, + sequenceNmb: 1, + retail: 0, + name: " New Jersey Surcharge Refund", + availability: "Opt" + } + ], + transmissionCategory: [ + { + categorySequenceNmb: 3, + includesNote: null, + invoice: 908.85, + sequenceNmb: 1, + retail: 1095, + name: " 4 Speed Automatic w/Overdrive", + availability: "Opt" + }, + { + categorySequenceNmb: 3, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " 5 Speed Manual w/Overdrive", + availability: "Std" + } + ], + interiorCategory: [ + { + categorySequenceNmb: 13, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Cargo Mat Delete", + availability: "Std" + }, + { + categorySequenceNmb: 13, + includesNote: " ", + invoice: 58.1, + sequenceNmb: 1, + retail: 70, + name: " Carpeting", + availability: "Opt" + }, + { + categorySequenceNmb: 13, + includesNote: null, + invoice: 20.75, + sequenceNmb: 1, + retail: 25, + name: " Floor Mats, Vinyl", + availability: "Opt" + } + ], + convenienceCategory: [ + { + categorySequenceNmb: 9, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Air Conditioning, Manual", + availability: "Std" + }, + { + categorySequenceNmb: 9, + includesNote: " ", + invoice: 601.75, + sequenceNmb: 1, + retail: 725, + name: " Cargo Cover, Hard", + availability: "Opt" + }, + { + categorySequenceNmb: 9, + includesNote: null, + invoice: 211.65, + sequenceNmb: 1, + retail: 255, + name: " Cargo Cover, Soft", + availability: "Opt" + }, + { + categorySequenceNmb: 9, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Clock, Digital (w/Radio)", + availability: "Std" + }, + { + categorySequenceNmb: 9, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Cupholders, (2)", + availability: "Std" + }, + { + categorySequenceNmb: 9, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Driver's Information Center", + availability: "Std" + }, + { + categorySequenceNmb: 9, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Headlamp Control, Automatic", + availability: "Std" + }, + { + categorySequenceNmb: 9, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Mirror, RH Visor Vanity", + availability: "Std" + }, + { + categorySequenceNmb: 9, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Power Outlets, (2)", + availability: "Std" + }, + { + categorySequenceNmb: 9, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Speed Control", + availability: "Std" + }, + { + categorySequenceNmb: 9, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Steering Wheel, Tilt", + availability: "Std" + }, + { + categorySequenceNmb: 9, + includesNote: null, + invoice: 145.25, + sequenceNmb: 1, + retail: 175, + name: " Window, Sliding Rear", + availability: "Opt" + } + ], + topColorCategory: [], + safetyCategory: [ + { + categorySequenceNmb: 20, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Lights, Daytime Running", + availability: "Std" + }, + { + categorySequenceNmb: 20, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Restraint System, Dual Front Air Bag", + availability: "Std" + }, + { + categorySequenceNmb: 20, + includesNote: null, + invoice: 327.85, + sequenceNmb: 1, + retail: 395, + name: " Restraint System, F&R Head Curtain Air Bag", + availability: "Opt" + }, + { + categorySequenceNmb: 20, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Tire Pressure Monitor", + availability: "Std" + }, + { + categorySequenceNmb: 20, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " W/S Wipers, Intermittent", + availability: "Std" + } + ], + truckBedsCategory: [], + lightingCategory: [], + bodyCategory: [ + { + categorySequenceNmb: 7, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Body, Fleetside", + availability: "Std" + } + ], + engineeringCategory: [ + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " 5150-lb GVWR", + availability: "N/C" + }, + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Alternator, 125-Amp", + availability: "Std" + }, + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Axle Ratio, 3.73", + availability: "Std" + }, + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Axle, Front, 2753-lb Cap", + availability: "Std" + }, + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 244.85, + sequenceNmb: 1, + retail: 295, + name: " Axle, Locking Rear", + availability: "Opt" + }, + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Axle, Rear, 2900-lb Cap", + availability: "Std" + }, + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Battery, HD 690-cca", + availability: "Std" + }, + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Fuel Tank, 19.0 Gal Cap", + availability: "Std" + }, + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 41.5, + sequenceNmb: 1, + retail: 50, + name: " Heater, Engine Block", + availability: "Opt" + }, + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Tachometer", + availability: "Std" + }, + { + categorySequenceNmb: 11, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Transfer Case, Electronic Insta-Trac", + availability: "Std" + } + ], + brakesCategory: [ + { + categorySequenceNmb: 8, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Power Disc/Drum with 4 Wheel ABS", + availability: "Std" + } + ], + exteriorColorCategory: [ + { + categorySequenceNmb: 4, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Birch Silver", + availability: "N/C" + }, + { + categorySequenceNmb: 4, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Black", + availability: "N/C" + }, + { + categorySequenceNmb: 4, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Deep Ruby", + availability: "N/C" + }, + { + categorySequenceNmb: 4, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Granite Blue", + availability: "N/C" + }, + { + categorySequenceNmb: 4, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Imperial Blue", + availability: "N/C" + }, + { + categorySequenceNmb: 4, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Pace Blue", + availability: "N/C" + }, + { + categorySequenceNmb: 4, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Summit White", + availability: "N/C" + }, + { + categorySequenceNmb: 4, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Sunburst Orange", + availability: "N/C" + }, + { + categorySequenceNmb: 4, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Victory Red", + availability: "N/C" + }, + { + categorySequenceNmb: 4, + includesNote: null, + invoice: 136.95, + sequenceNmb: 1, + retail: 165, + name: " Yellow", + availability: "Opt" + } + ], + noteCategory: [], + tiresCategory: [ + { + categorySequenceNmb: 26, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " P225/75R15 BSW", + availability: "N/C" + }, + { + categorySequenceNmb: 26, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " P235/75R15 BSW", + availability: "Std" + }, + { + categorySequenceNmb: 26, + includesNote: null, + invoice: 78.85, + sequenceNmb: 1, + retail: 95, + name: " Spare Tire, Conventional", + availability: "Opt" + }, + { + categorySequenceNmb: 26, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Spare Tire, Limited Use", + availability: "Std" + } + ], + mandatoryCategory: [ + { + categorySequenceNmb: 15, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Emission Equipment Override, CA/MA/ME/NY/VT", + availability: "N/C" + }, + { + categorySequenceNmb: 15, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Emission Equipment Override, Federal", + availability: "N/C" + }, + { + categorySequenceNmb: 15, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Emission Equipment, California", + availability: "N/C" + }, + { + categorySequenceNmb: 15, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Emission Equipment, Federal", + availability: "N/C" + }, + { + categorySequenceNmb: 15, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Emission Equipment, MA/ME/NY/VT", + availability: "N/C" + } + ], + steeringCategory: [ + { + categorySequenceNmb: 24, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Steering, Power", + availability: "Std" + } + ], + interiorColorCategory: [ + { + categorySequenceNmb: 5, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Medium Pewter", + availability: "N/C" + } + ], + towingCategory: [ + { + categorySequenceNmb: 27, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Towing Cap, 4000-lb Max (When Properly Equipped)", + availability: "Std" + }, + { + categorySequenceNmb: 27, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Trailer Harness", + availability: "Std" + }, + { + categorySequenceNmb: 27, + includesNote: " INCLUDES: Trailer Harness", + invoice: 224.1, + sequenceNmb: 1, + retail: 270, + name: " Trailer Hitch", + availability: "Opt" + }, + { + categorySequenceNmb: 27, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Trailer Hitch Delete", + availability: "Std" + } + ], + wheelsCategory: [], + exteriorCategory: [ + { + categorySequenceNmb: 12, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Bracket, Front License Plate", + availability: "N/C" + }, + { + categorySequenceNmb: 12, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Bumpers, Chrome F&R w/Rear Step", + availability: "Std" + }, + { + categorySequenceNmb: 12, + includesNote: null, + invoice: 62.25, + sequenceNmb: 1, + retail: 75, + name: " Glass, Deep Tinted", + availability: "Opt" + }, + { + categorySequenceNmb: 12, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Grille Surround, Dark Smoke Gray", + availability: "Std" + }, + { + categorySequenceNmb: 12, + includesNote: " ", + invoice: 83, + sequenceNmb: 1, + retail: 100, + name: " Moldings, Body Side", + availability: "Opt" + }, + { + categorySequenceNmb: 12, + includesNote: null, + invoice: 170.15, + sequenceNmb: 1, + retail: 205, + name: paragraph(), + availability: "Opt" + }, + { + categorySequenceNmb: 12, + includesNote: " ", + invoice: 112.05, + sequenceNmb: 1, + retail: 135, + name: " Pickup Box Protectors, Top Rail", + availability: "Opt" + }, + { + categorySequenceNmb: 12, + includesNote: null, + invoice: 311.25, + sequenceNmb: 1, + retail: 375, + name: " Running Boards", + availability: "Opt" + }, + { + categorySequenceNmb: 12, + includesNote: null, + invoice: 332, + sequenceNmb: 1, + retail: 400, + name: paragraph(), + availability: "Opt" + }, + { + categorySequenceNmb: 12, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Skid Plate, Front Underbody Shield", + availability: "Std" + }, + { + categorySequenceNmb: 12, + includesNote: null, + invoice: 83, + sequenceNmb: 1, + retail: 100, + name: " Tailgate Edge Protector", + availability: "Opt" + }, + { + categorySequenceNmb: 12, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: paragraph(), + availability: "Std" + } + ], + seatsCategory: [ + { + categorySequenceNmb: 21, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Seat Trim, Cloth ", + availability: "Std" + }, + { + categorySequenceNmb: 21, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Seat Trim, Cloth **D", + availability: "N/C" + }, + { + categorySequenceNmb: 21, + includesNote: null, + invoice: 0, + sequenceNmb: 2, + retail: 0, + name: " Seat Trim, Cloth **D", + availability: "N/C" + }, + { + categorySequenceNmb: 21, + includesNote: " ", + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Seat Trim, Vinyl", + availability: "N/C" + }, + { + categorySequenceNmb: 21, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Seat, Split Bench ", + availability: "Std" + }, + { + categorySequenceNmb: 21, + includesNote: null, + invoice: 0, + sequenceNmb: 1, + retail: 0, + name: " Seat, Split Bench AM6", + availability: "N/C" + }, + { + categorySequenceNmb: 21, + includesNote: null, + invoice: 0, + sequenceNmb: 2, + retail: 0, + name: " Seat, Split Bench AM6", + availability: "N/C" + } + ] + }, + vehicleRankingClass: [], + slugMakeModel: null, + secondaryBodyTypeText: null, + latestYear: 0, + ownershipCosts: { + depreciationTotal: "N/A", + total5YearOcCostLessHybrid: null, + total5YearOcCost: "N/A", + valueRating: "N/A", + repairsTotal: "N/A", + hybridTax: "N/A", + stateFeesTotal: "N/A", + fuelTotal: "N/A", + maintenanceTotal: "N/A", + similarVehicles: null, + financingTotal: "N/A", + difference5YearCost: null, + insuranceTotal: "N/A" + }, + carsMake: "Chevrolet", + carsYear: 2007, + slugModelName: "colorado", + mainCategory: "Utility/Offroad", + vehicleStatus: 1, + vehicleNmb: 19335, + slugDieselCategory: null, + warranty: { + roadsideWarrantyMonths: null, + fullWarrantyMiles: "36,000", + powertrainWarrantyMiles: "100,000", + corrosionWarrantyMonths: "72", + powertrainWarrantyMonths: "60", + corrosionWarrantyMiles: "100,000", + maintenanceWarrantyMonths: "None", + fullWarrantyMonths: "36", + maintenanceWarrantyMiles: "None", + roadsideWarrantyMiles: "N/A" + }, + makeDiscontinued: 0, + slugSubcategory: "midsize-pickup", + makeIcon: "chevrolet.png", + slugSecondaryBodyType: null, + makeFeaturedImage: "chevy.jpg", + carsRebates: [], + pricing: { + pMsrpValue: "17485.00", + pExcellentRetailValue: null, + pFmpOrCrvLabel: "Clean Retail Value", + pMsrp: 17485, + pTotalTargetPrice: 0, + pTargetPrice: 0, + pGasGuzzlerTax: 0, + pMsrpLabel: "Original MSRP", + pNewMonthly: 0, + pAverageSalesTaxAndFees: 0, + pCpoPrice: "N/R", + pFmpOrCrvValue: "N/A", + pInvoice: 16523.33, + pTargetRebate: 0, + pEffectiveOn: "2007-03-26T00:00:00.000Z", + pDestination: 685 + }, + recalls: [ + { + recallsPotaff: 3227, + correctiveAction: paragraphs(2), + yearText: 2007, + rcDate: "2006-08-11T00:00:00.000Z", + mfgText: "GENERAL MOTORS CORP.", + makeText: "CHEVROLET", + modelText: "COLORADO", + consequenceDefect: paragraphs(2), + descDefect: paragraphs(3), + recallsCampNumber: "06V307000", + recallId: 63244, + compName: "WHEELS:RIM " + }, + { + recallsPotaff: 42540, + correctiveAction: paragraphs(1), + yearText: 2007, + rcDate: "2009-05-11T00:00:00.000Z", + mfgText: "DOPE, INC.", + makeText: "CHEVROLET", + modelText: "S10", + consequenceDefect: paragraph(), + descDefect: paragraphs(4), + recallsCampNumber: "09E025000", + recallId: 102448, + compName: "EXTERIOR LIGHTING:HEADLIGHTS" + }, + { + recallsPotaff: 185903, + correctiveAction: paragraphs(4), + yearText: 2007, + rcDate: "2009-07-29T00:00:00.000Z", + mfgText: "GENERAL MOTORS CORP.", + makeText: "CHEVROLET", + modelText: "COLORADO", + consequenceDefect: paragraphs(2), + descDefect: paragraphs(2), + recallsCampNumber: "09V310000", + recallId: 102549, + compName: "EXTERIOR LIGHTING:BRAKE LIGHTS:SWITCH" + }, + { + recallsPotaff: 192676, + correctiveAction: paragraphs(2), + yearText: 2007, + rcDate: "2010-11-18T00:00:00.000Z", + mfgText: "GENERAL MOTORS CORP.", + makeText: "CHEVROLET", + modelText: "COLORADO", + consequenceDefect: paragraphs(6), + descDefect: paragraphs(2), + recallsCampNumber: "10V575000", + recallId: 121363, + compName: "CHILD SEAT" + } + ], + cpoProgram: { + cpoWarrantyBbnc: paragraph(), + cpoInspectionPoint: "172", + cpoWebsite: "https://www.gmcertified.com", + cpoAdditionalBenefits: paragraphs(2), + cpoAgeMileage: paragraph(), + cpoName: "Chevrolet/Buick/GMC Certified Pre-Owned Vehicles", + cpoLease: "No", + cpoCustomerServiceNumber: "(866) 694-6546", + cpoInspectionScore: 99, + cpoWarranty: paragraphs(2), + cpoReturnExchange: "3-day/150-mile Vehicle Exchange Program", + cpoFinancing: "Yes", + cpoWarrantyExtended: "Yes", + cpoHistoryReport: 1, + cpoParticipation: "3,400 dealerships enrolled (94% of available dealerships)", + cpoProgramOverview: paragraphs(6), + cpoWarrantyDeductible: "No", + cpoWarrantyTransferable: "Yes", + cpoRoadside: paragraph() + }, + priceRangeValue: 1, + dieselCategory: null, + carsPricePageShow: 0, + combinedPrice: 18170, + carsSubcategory: "Midsize Pickup", + hubs: [ + { + hubsImage: "epa.svg", + hubsText: "16 / 22 mpg", + makeModelHub: 1, + hubsName: "Fuel Economy" + }, + { + hubsImage: "engine.svg", + hubsText: "185@5,600", + makeModelHub: 2, + hubsName: "Horsepower" + }, + { + hubsImage: "torque.svg", + hubsText: "190@2,800", + makeModelHub: 3, + hubsName: "Torque" + }, + { + hubsImage: null, + hubsText: null, + makeModelHub: 4, + hubsName: null + } + ], + carsDiscontinued: 0, + updatedOn: "2024-01-08T17:09:18.000Z", + retainedValue: "N/A", + carMatchCustomRankings: [], + carsModelName: "Colorado", + makeThumbnailUrl: "https://mocks.webiny.com/chevrolet.png", + slugBodystyle: "truck", + slugMainCategory: "utilityoffroad", + powertrains: [ + { + ptCityMpg: 15, + ptHwyMpg: 21, + ptHorseower: 185 + }, + { + ptCityMpg: 15, + ptHwyMpg: 21, + ptHorseower: 242 + }, + { + ptCityMpg: 16, + ptHwyMpg: 22, + ptHorseower: 185 + } + ], + trimName: "LS 4WD Regular Cab", + carsCombinedEpaMpg: 18.7, + releaseType: "Complete", + ymmPriceRange: "$14,085 - $23,810", + seoText: { + seoContent: paragraphs(5), + seoTitle: "Chevrolet Trucks", + seoType: "truck" + }, + slugTrimName: "ls-4wd-regular-cab", + oemUrl: "www.chevrolet.com", + propertyType: "Standard", + bodyTypeOrder: 3, + horsePowerVal: 185, + images: [ + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-angular-front.png", + imageAngle: "angular front", + imageOrder: 1, + imageType: "exterior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-angular-rear.png", + imageAngle: "angular rear", + imageOrder: 2, + imageType: "exterior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-dashboard.png", + imageAngle: "dashboard", + imageOrder: 3, + imageType: "interior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-side-view.png", + imageAngle: "side view", + imageOrder: 4, + imageType: "exterior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-wheel-cap.png", + imageAngle: "wheel cap", + imageOrder: 5, + imageType: "exterior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-front-view.png", + imageAngle: "front view", + imageOrder: 6, + imageType: "exterior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-rear-view.png", + imageAngle: "rear view", + imageOrder: 7, + imageType: "exterior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-steering-wheel.png", + imageAngle: "steering wheel", + imageOrder: 8, + imageType: "interior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-instrument-cluster.png", + imageAngle: "instrument cluster", + imageOrder: 9, + imageType: "interior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-front-seat.png", + imageAngle: "front seat", + imageOrder: 11, + imageType: "interior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-rear-seat.png", + imageAngle: "rear seat", + imageOrder: 12, + imageType: "interior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-instrument-panel.png", + imageAngle: "instrument panel", + imageOrder: 13, + imageType: "interior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-grille.png", + imageAngle: "grille", + imageOrder: 15, + imageType: "exterior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-headlight.png", + imageAngle: "headlight", + imageOrder: 16, + imageType: "exterior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-taillight.png", + imageAngle: paragraph(), + imageOrder: 17, + imageType: "exterior" + }, + { + imageUrl: "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-doors.png", + imageAngle: "doors", + imageOrder: 18, + imageType: "exterior" + }, + { + imageUrl: "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-trunk.png", + imageAngle: "trunk", + imageOrder: 19, + imageType: "exterior" + }, + { + imageUrl: + "https://mocks.webiny.com/2007-chevrolet-colorado-ls-2wd-truck-door-controls.png", + imageAngle: paragraph(), + imageOrder: 22, + imageType: "interior" + } + ], + hybridElectricCategory: null, + manufacturerCd: "CT15403" + }; +}; + +export const mockData = createMockData(); diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/types.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/types.ts new file mode 100644 index 00000000000..7219fe4ae01 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataCreator/types.ts @@ -0,0 +1,8 @@ +import { ITaskResponseDoneResultOutput } from "@webiny/tasks"; + +export interface IMockDataCreatorInput { + totalAmount: number; + createdAmount: number; +} + +export type IMockDataCreatorOutput = ITaskResponseDoneResultOutput; diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/MockDataManager.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/MockDataManager.ts new file mode 100644 index 00000000000..e0857e5696b --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/MockDataManager.ts @@ -0,0 +1,115 @@ +import { ITask, ITaskResponseResult, ITaskRunParams, TaskDataStatus } from "@webiny/tasks"; +import { IMockDataManagerInput, IMockDataManagerOutput } from "~/tasks/MockDataManager/types"; +import { calculateAmounts } from "./calculateAmounts"; +import { IMockDataCreatorInput } from "~/tasks/MockDataCreator/types"; +import { calculateSeconds, WAIT_MAX_SECONDS } from "./calculateSeconds"; +import { MOCK_DATA_CREATOR_TASK_ID } from "~/tasks/createMockDataCreatorTask"; +import { createModelAndGroup } from "~/tasks/MockDataManager/createModelAndGroup"; +import { Context } from "~/types"; +import { disableIndexing, enableIndexing } from "~/utils"; + +export class MockDataManager< + C extends Context, + I extends IMockDataManagerInput, + O extends IMockDataManagerOutput +> { + public async execute(params: ITaskRunParams): Promise> { + const { context, isAborted, input, response, trigger, store } = params; + + const taskId = store.getTask().id; + if (isAborted()) { + await this.abortChildTasks(context, taskId); + return response.aborted(); + } else if (input.seconds) { + const items = await this.listChildTasksNotDone(context, taskId); + + /** + * If there are still running creator tasks, we need to wait a bit more. + */ + if (items.length > 0) { + return response.continue( + { + ...input + }, + { + seconds: input.seconds || WAIT_MAX_SECONDS + } + ); + } + /** + * If there are no running tasks, we can enable indexing and finish the manager task. + */ + await enableIndexing({ + client: context.elasticsearch, + model: { + modelId: input.modelId, + tenant: "root", + locale: "en-US" + } + }); + return response.done(); + } + + const result = await createModelAndGroup({ + context, + modelId: input.modelId, + overwrite: input.overwrite + }); + if (typeof result === "string") { + return response.done(result); + } + + await disableIndexing({ + model: result.model, + client: context.elasticsearch + }); + + const { amountOfTasks, amountOfRecords } = calculateAmounts(input.amount); + + const seconds = calculateSeconds(amountOfRecords); + + for (let current = 0; current < amountOfTasks; current++) { + await trigger({ + definition: MOCK_DATA_CREATOR_TASK_ID, + input: { + totalAmount: amountOfRecords, + createdAmount: 0 + }, + name: `Mock Data Creator Task #${current + 1} of ${amountOfTasks}` + }); + } + + return response.continue( + { + ...input, + seconds, + amountOfTasks, + amountOfRecords + }, + { + seconds + } + ); + } + + private async listChildTasksNotDone(context: Context, id: string): Promise { + const { items } = await context.tasks.listTasks({ + where: { + parentId: id, + taskStatus_in: [TaskDataStatus.PENDING, TaskDataStatus.RUNNING] + }, + limit: 10000 + }); + return items; + } + + private async abortChildTasks(context: Context, id: string): Promise { + const items = await this.listChildTasksNotDone(context, id); + for (const item of items) { + await context.tasks.abort({ + id: item.id, + message: "Aborted by parent task." + }); + } + } +} diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/calculateAmounts.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/calculateAmounts.ts new file mode 100644 index 00000000000..b85d8b2451e --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/calculateAmounts.ts @@ -0,0 +1,73 @@ +interface ICalculateAmounts { + amountOfTasks: number; + amountOfRecords: number; +} + +interface IMaxRecordsPerTask { + amount: number; + percentagePerTask: number; +} + +const constrains: IMaxRecordsPerTask[] = [ + { + amount: 50, + percentagePerTask: 100 + }, + { + amount: 1000, + percentagePerTask: 50 + }, + { + amount: 100000, + percentagePerTask: 20 + } + // { + // amount: 50000, + // percentagePerTask: 10 + // }, + // { + // amount: 750000, + // percentagePerTask: 10 + // }, + // { + // amount: 1000000, + // percentagePerTask: 2 + // }, + // { + // amount: 5000000, + // percentagePerTask: 1 + // }, + // { + // amount: 10000000, + // percentagePerTask: 0.5 + // } +]; + +const findValue = (input: number): IMaxRecordsPerTask => { + for (const value of constrains) { + if (input <= value.amount) { + return value; + } + } + throw new Error(`No valid value found - input value is too large: ${input}.`); +}; + +export const calculateAmounts = (input: number): ICalculateAmounts => { + const values = findValue(input); + + const { percentagePerTask } = values; + /** + * Do not ask... + */ + const amountOfRecords = + percentagePerTask < 100 + ? Math.round(parseFloat(String(input / (100 / percentagePerTask)))) + : input; + + const amountOfTasks = Math.ceil(100 / percentagePerTask); + + return { + amountOfRecords, + amountOfTasks + }; +}; diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/calculateSeconds.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/calculateSeconds.ts new file mode 100644 index 00000000000..9cb44fcd2fa --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/calculateSeconds.ts @@ -0,0 +1,15 @@ +const recordsPerSecond = 4; +export const WAIT_MIN_SECONDS = 15; +export const WAIT_MAX_SECONDS = 90; + +export const calculateSeconds = (records: number): number => { + const seconds = Math.ceil(records / recordsPerSecond); + if (seconds > WAIT_MAX_SECONDS) { + return WAIT_MAX_SECONDS; + } else if (seconds < WAIT_MIN_SECONDS) { + return WAIT_MIN_SECONDS; + } else if (seconds > 0) { + return seconds; + } + return WAIT_MAX_SECONDS; +}; diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/constants.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/constants.ts new file mode 100644 index 00000000000..bb8925e8a72 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/constants.ts @@ -0,0 +1 @@ +export const CARS_MODEL_ID = "cars"; diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/createModelAndGroup.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/createModelAndGroup.ts new file mode 100644 index 00000000000..53ce0406b4b --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/createModelAndGroup.ts @@ -0,0 +1,51 @@ +import { CmsGroup, CmsModel } from "@webiny/api-headless-cms/types"; +import { Context } from "~/types"; +import { createGroupData } from "./group"; +import { createCarsModel } from "./model"; +import { createIndex } from "~/utils"; + +interface ICreateModelAndGroupParams { + context: Context; + modelId: string; + overwrite?: boolean; +} +export interface ICreateModelAndGroupResultSuccess { + group: CmsGroup; + model: CmsModel; +} +export type ICreateModelAndGroupResult = string | ICreateModelAndGroupResultSuccess; + +export const createModelAndGroup = async ( + params: ICreateModelAndGroupParams +): Promise => { + const { context, modelId, overwrite = false } = params; + /** + * First we need to check if the model already exists in the database. If not, we need to create it. + */ + let model = (await context.cms.listModels()).find(m => m.modelId === modelId); + let group: CmsGroup | undefined; + if (model && !overwrite) { + return `Model "${modelId}" already exists.`; + } else if (!model) { + group = (await context.cms.listGroups()).find(group => group.slug === "mocks"); + if (!group) { + const groupData = createGroupData(); + group = await context.cms.createGroup(groupData); + } + /** + * Possibly we need to create the model. + */ + const carsModel = createCarsModel(group); + model = await context.cms.createModel(carsModel); + } + await createIndex({ + model, + client: context.elasticsearch, + plugins: context.plugins + }); + + return { + group: group as CmsGroup, + model: model as CmsModel + }; +}; diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/group.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/group.ts new file mode 100644 index 00000000000..78fbea800f2 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/group.ts @@ -0,0 +1,11 @@ +import { CmsGroupCreateInput } from "@webiny/api-headless-cms/types"; + +export const createGroupData = (): CmsGroupCreateInput => { + return { + id: "mocks", + icon: "fas/star", + name: "Mocks", + description: "A group for mock models", + slug: "mocks" + }; +}; diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/model.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/model.ts new file mode 100644 index 00000000000..823c6c1a555 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/model.ts @@ -0,0 +1,5549 @@ +import { CmsModelCreateInput } from "@webiny/api-headless-cms/types"; +import { CmsGroup } from "@webiny/api-headless-cms/types"; +import { CARS_MODEL_ID } from "./constants"; + +export const createCarsModel = (group: CmsGroup): CmsModelCreateInput => { + return { + name: "Cars", + modelId: CARS_MODEL_ID, + singularApiName: "Cars", + pluralApiName: "Cars", + description: "Cars Data Model", + group: group.id, + fields: [ + { + id: "carsVehicle", + fieldId: "carsVehicle", + type: "text", + label: "Vehicle", + helpText: "Make Model Year and Trim", + renderer: { + name: "text-input" + }, + validation: [ + { + name: "required", + message: "Value is required." + } + ] + }, + { + id: "vehicleNmb", + fieldId: "vehicleNmb", + type: "number", + label: "VehicleNumber", + helpText: "A unique vehicle number", + renderer: { + name: "number-input" + }, + validation: [ + { + name: "required", + message: "Value is required." + } + ] + }, + { + id: "carsYear", + fieldId: "carsYear", + type: "number", + label: "Year", + renderer: { + name: "number-input" + } + }, + { + id: "carsMake", + fieldId: "carsMake", + type: "text", + label: "Make", + renderer: { + name: "text-input" + } + }, + { + id: "carsModelName", + fieldId: "carsModelName", + type: "text", + label: "ModelName", + renderer: { + name: "text-input" + } + }, + { + id: "trimName", + fieldId: "trimName", + type: "text", + label: "TrimName", + multipleValues: false, + renderer: { + name: "text-input" + } + }, + { + id: "bodyStyle", + fieldId: "bodyStyle", + multipleValues: false, + type: "text", + label: "BodyStyle", + renderer: { + name: "text-input" + } + }, + { + id: "manufacturerCd", + fieldId: "manufacturerCd", + type: "text", + label: "Manufacturer Code", + renderer: { + name: "text-input" + } + }, + { + id: "releaseType", + fieldId: "releaseType", + type: "text", + label: "ReleaseType (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "newUsedBg", + fieldId: "newUsedBg", + type: "text", + label: "NewUsedBg (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "carsUid", + fieldId: "carsUid", + type: "number", + label: "UID", + renderer: { + name: "number-input" + } + }, + { + id: "carsDiscontinued", + fieldId: "carsDiscontinued", + type: "number", + label: "Discontinued", + renderer: { + name: "number-input" + } + }, + { + id: "slugMake", + fieldId: "slugMake", + type: "text", + label: "Slug Make", + renderer: { + name: "text-input" + } + }, + { + id: "slugModelName", + fieldId: "slugModelName", + type: "text", + label: "SlugModelName", + renderer: { + name: "text-input" + } + }, + { + id: "slugTrimName", + fieldId: "slugTrimName", + type: "text", + label: "SlugTrimName (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "slugBodystyle", + fieldId: "slugBodystyle", + type: "text", + label: "SlugBodystyle (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "makeFeaturedImage", + fieldId: "makeFeaturedImage", + type: "text", + label: "MakeFeaturedImage (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "makeIcon", + fieldId: "makeIcon", + type: "text", + label: "MakeIcon (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "makeDiscontinued", + fieldId: "makeDiscontinued", + type: "number", + label: "Make Discontinued", + renderer: { + name: "number-input" + } + }, + { + id: "baseVehicle", + fieldId: "baseVehicle", + type: "number", + label: "BaseVehicle (non-jato)", + renderer: { + name: "number-input" + }, + helpText: "This is a Required Field." + }, + { + id: "oemUrl", + fieldId: "oemUrl", + type: "text", + label: "OemUrl (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "carsSubcategory", + fieldId: "carsSubcategory", + type: "text", + label: "Subcategory (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "slugSubcategory", + fieldId: "slugSubcategory", + type: "text", + label: "SlugSubcategory (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "mainCategory", + fieldId: "mainCategory", + type: "text", + label: "MainCategory (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "slugMainCategory", + fieldId: "slugMainCategory", + type: "text", + label: "SlugMainCategory (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "hybridElectricCategory", + fieldId: "hybridElectricCategory", + type: "text", + label: "HybridElectricCategory (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "slugHybridElectricCategory", + fieldId: "slugHybridElectricCategory", + type: "text", + label: "SlugHybridElectricCategory (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "dieselCategory", + fieldId: "dieselCategory", + type: "text", + label: "DieselCategory (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "slugDieselCategory", + fieldId: "slugDieselCategory", + type: "text", + label: "SlugDieselCategory (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "updatedOn", + fieldId: "updatedOn", + type: "text", + label: "UpdatedOn", + renderer: { + name: "text-input" + } + }, + { + id: "vehicleStatus", + fieldId: "vehicleStatus", + type: "number", + label: "VehicleStatus (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "featuredImage", + fieldId: "featuredImage", + type: "text", + label: "FeaturedImage (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "propertyType", + fieldId: "propertyType", + type: "text", + label: "PropertyType (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "marketingImage", + fieldId: "marketingImage", + type: "text", + label: "MarketingImage (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "priceRangeValue", + fieldId: "priceRangeValue", + type: "number", + label: "PriceRangeValue (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "priceRangeText", + fieldId: "priceRangeText", + type: "text", + label: "PriceRangeText (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "ymmPriceRange", + fieldId: "ymmPriceRange", + type: "text", + label: "YMMPriceRange (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "bodyType", + fieldId: "bodyType", + type: "text", + label: "BodyType (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "bodyTypeText", + fieldId: "bodyTypeText", + type: "text", + label: "BodyType Text (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "slugBodyType", + fieldId: "slugBodyType", + type: "text", + label: "SlugBodyType (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "bodyTypeOrder", + fieldId: "bodyTypeOrder", + type: "number", + label: "BodyTypeOrder (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "secondaryBodyType", + fieldId: "secondaryBodyType", + type: "text", + label: "SecondaryBodyType (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "secondaryBodyTypeText", + fieldId: "secondaryBodyTypeText", + type: "text", + label: "SecondaryBodyTypeText (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "slugSecondaryBodyType", + fieldId: "slugSecondaryBodyType", + type: "text", + label: "SlugSecondaryBodyType (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "secondaryBodyTypeOrder", + fieldId: "secondaryBodyTypeOrder", + type: "number", + label: "SecondaryBodyTypeOrder (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "priceRangeSlug", + fieldId: "priceRangeSlug", + type: "text", + label: "PriceRangeSlug (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "latestYear", + fieldId: "latestYear", + type: "number", + label: "LatestYear (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "ymmLowestPriceRange", + fieldId: "ymmLowestPriceRange", + type: "number", + label: "YMMLowestPriceRange (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "ymmMaxPriceRange", + fieldId: "ymmMaxPriceRange", + type: "number", + label: "YMMMaxPriceRange (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "makeThumbnailUrl", + fieldId: "makeThumbnailUrl", + type: "text", + label: "MakeThumbnailUrl (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "combinedPrice", + fieldId: "combinedPrice", + type: "number", + label: "CombinedPrice (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "carsCombinedEpaMpg", + fieldId: "carsCombinedEpaMpg", + type: "number", + label: "CombinedEpaMPG (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "horsePowerVal", + fieldId: "horsePowerVal", + type: "number", + label: "HorsePowerVal (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "slugMakeModel", + fieldId: "slugMakeModel", + type: "text", + label: "SlugMakeModel (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "slugYearMakeModel", + fieldId: "slugYearMakeModel", + type: "text", + label: "SlugYearMakeModel (non-jato)", + renderer: { + name: "text-input" + }, + helpText: "This is a Required Field." + }, + { + id: "retainedValue", + fieldId: "retainedValue", + type: "text", + label: "RetainedValue (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "standardTires", + fieldId: "standardTires", + type: "text", + label: "StandardTires (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "carsMakePageShow", + fieldId: "carsMakePageShow", + type: "number", + label: "Make Page Show (non-jato)", + renderer: { + name: "number-input" + }, + helpText: "This is a Required Field." + }, + { + id: "carsPricePageShow", + fieldId: "carsPricePageShow", + type: "number", + label: "PriceRange Page Show (non-jato)", + renderer: { + name: "number-input" + }, + helpText: "This is a Required Field." + }, + { + id: "carsEditorialRating", + fieldId: "editorialRating", + type: "number", + label: "Editorial Rating (non-jato)", + renderer: { + name: "number-input" + } + }, + { + id: "specifications", + fieldId: "specifications", + type: "object", + label: "Specifications", + renderer: { + name: "object-accordion" + }, + settings: { + layout: [ + ["seatingCapacity", "specWidth", "specLength", "driveTrain"], + ["specHeight", "specWheelase", "frontHeadroom"], + ["rearHeadroom", "frontShoulderRoom", "rearShoulderRoom"], + ["frontLegroom", "rearLegroom", "groundClearance"], + ["curbWeight", "cargoCapacity", "specGvwr"], + ["engineName", "specHorsepower", "specTonnage"], + ["specTorque", "fuelType", "fuelCapacity", "stdEpaMpg"], + ["transmissionName", "transmissionType", "towingCapacity"], + ["drivingRange", "cylinderConfiguration", "numberOfCylinders"], + ["stdMpgWithUnits", "heroLabel1", "heroValue1"], + ["payloadCapacity", "vehicleClass", "engineType"] + ], + fields: [ + { + id: "driveTrain", + fieldId: "driveTrain", + multipleValues: false, + type: "text", + label: "Drivetrain", + renderer: { + name: "text-input" + } + }, + { + id: "seatingCapacity", + fieldId: "seatingCapacity", + multipleValues: false, + type: "text", + label: "SeatingCapacity", + renderer: { + name: "text-input" + } + }, + { + id: "specWidth", + fieldId: "specWidth", + multipleValues: false, + type: "text", + label: "Width", + renderer: { + name: "text-input" + } + }, + { + id: "specLength", + fieldId: "specLength", + multipleValues: false, + type: "text", + label: "Length", + renderer: { + name: "text-input" + } + }, + { + id: "specHeight", + fieldId: "specHeight", + multipleValues: false, + type: "text", + label: "Height", + renderer: { + name: "text-input" + } + }, + { + id: "specWheelase", + fieldId: "specWheelbase", + type: "text", + multipleValues: false, + label: "Wheelbase", + renderer: { + name: "text-input" + } + }, + { + id: "frontHeadroom", + fieldId: "frontHeadroom", + type: "text", + multipleValues: false, + label: "FrontHeadroom", + renderer: { + name: "text-input" + } + }, + { + id: "rearHeadroom", + fieldId: "rearHeadroom", + type: "text", + multipleValues: false, + label: "RearHeadroom", + renderer: { + name: "text-input" + } + }, + { + id: "frontShoulderRoom", + fieldId: "frontShoulderRoom", + type: "text", + multipleValues: false, + label: "FrontShoulderRoom", + renderer: { + name: "text-input" + } + }, + { + id: "rearShoulderRoom", + fieldId: "rearShoulderRoom", + type: "text", + multipleValues: false, + label: "RearShoulderRoom", + renderer: { + name: "text-input" + } + }, + { + id: "frontLegroom", + fieldId: "frontLegroom", + type: "text", + multipleValues: false, + label: "FrontLegroom", + renderer: { + name: "text-input" + } + }, + { + id: "rearLegroom", + fieldId: "rearLegroom", + type: "text", + multipleValues: false, + label: "RearLegroom", + renderer: { + name: "text-input" + } + }, + { + id: "groundClearance", + fieldId: "groundClearance", + type: "text", + multipleValues: false, + label: "GroundClearance", + renderer: { + name: "text-input" + } + }, + { + id: "curbWeight", + fieldId: "curbWeight", + type: "text", + multipleValues: false, + label: "CurbWeight", + renderer: { + name: "text-input" + } + }, + { + id: "cargoCapacity", + fieldId: "cargoCapacity", + type: "text", + multipleValues: false, + label: "CargoCapacity", + renderer: { + name: "text-input" + } + }, + { + id: "specGvwr", + fieldId: "specGvwr", + type: "text", + multipleValues: false, + label: "GVWR", + renderer: { + name: "text-input" + } + }, + { + id: "payloadCapacity", + fieldId: "payloadCapacity", + type: "text", + multipleValues: false, + label: "PayloadCapacity", + renderer: { + name: "text-input" + } + }, + { + id: "towingCapacity", + fieldId: "towingCapacity", + type: "text", + multipleValues: false, + label: "TowingCapacity", + renderer: { + name: "text-input" + } + }, + { + id: "engineName", + fieldId: "engineName", + type: "text", + multipleValues: false, + label: "EngineName", + renderer: { + name: "text-input" + } + }, + { + id: "specHorsepower", + fieldId: "specHorsepower", + type: "text", + multipleValues: false, + label: "Horsepower", + renderer: { + name: "text-input" + } + }, + { + id: "specTorque", + fieldId: "specTorque", + type: "text", + multipleValues: false, + label: "Torque", + renderer: { + name: "text-input" + } + }, + { + id: "fuelType", + fieldId: "fuelType", + multipleValues: false, + type: "text", + label: "FuelType", + renderer: { + name: "text-input" + } + }, + { + id: "fuelCapacity", + fieldId: "fuelCapacity", + multipleValues: false, + type: "text", + label: "FuelCapacity (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "stdEpaMpg", + fieldId: "stdEpaMpg", + type: "text", + multipleValues: false, + label: "StdEpaMpg", + renderer: { + name: "text-input" + }, + helpText: "This is a Required Field." + }, + { + id: "transmissionName", + fieldId: "transmissionName", + type: "text", + multipleValues: false, + label: "TransmissionName", + renderer: { + name: "text-input" + } + }, + { + id: "transmissionType", + fieldId: "transmissionType", + type: "text", + multipleValues: false, + label: "TransmissionType", + renderer: { + name: "text-input" + } + }, + { + id: "drivingRange", + fieldId: "drivingRange", + type: "text", + multipleValues: false, + label: "DrivingRange", + renderer: { + name: "text-input" + } + }, + { + id: "cylinderConfiguration", + fieldId: "cylinderConfiguration", + type: "text", + multipleValues: false, + label: "CylinderConfiguration", + renderer: { + name: "text-input" + } + }, + { + id: "numberOfCylinders", + fieldId: "numberOfCylinders", + type: "text", + multipleValues: false, + label: "NumberOfCylinders", + renderer: { + name: "text-input" + } + }, + { + id: "specTonnage", + fieldId: "specTonnage", + type: "text", + multipleValues: false, + label: "Tonnage (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "stdMpgWithUnits", + fieldId: "stdMpgWithUnits", + type: "text", + multipleValues: false, + label: "StdMpg With Units (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "heroLabel1", + fieldId: "heroLabel1", + type: "text", + multipleValues: false, + label: "Hero Label1 (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "heroValue1", + fieldId: "heroValue1", + type: "text", + multipleValues: false, + label: "Hero Value1 (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "vehicleClass", + fieldId: "vehicleClass", + type: "text", + multipleValues: false, + label: "VehicleClass (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "engineType", + fieldId: "engineType", + type: "text", + multipleValues: false, + label: "Engine Type (Non-Jato)", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "powertrains", + fieldId: "powertrains", + multipleValues: true, + label: "Powertrains (Non-Jato)", + renderer: { + name: "objects-accordion" + }, + type: "object", + settings: { + layout: [["ptHorseower", "ptCityMpg", "ptHwyMpg"]], + fields: [ + { + id: "ptHorseower", + fieldId: "ptHorseower", + type: "number", + multipleValues: false, + label: "Horsepower", + renderer: { + name: "number-input" + } + }, + { + id: "ptCityMpg", + fieldId: "ptCityMpg", + type: "number", + multipleValues: false, + label: "CityMpg", + renderer: { + name: "number-input" + } + }, + { + id: "ptHwyMpg", + fieldId: "ptHwyMpg", + type: "number", + multipleValues: false, + label: "HwyMpg", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "warranty", + fieldId: "warranty", + type: "object", + label: "Warranty", + renderer: { + name: "object-accordion" + }, + settings: { + layout: [ + ["fullWarrantyMiles", "fullWarrantyMonths", "powertrainWarrantyMiles"], + [ + "powertrainWarrantyMonths", + "maintenanceWarrantyMiles", + "maintenanceWarrantyMonths" + ], + ["roadsideWarrantyMiles", "roadsideWarrantyMonths"], + ["corrosionWarrantyMiles", "corrosionWarrantyMonths"] + ], + fields: [ + { + id: "fullWarrantyMiles", + fieldId: "fullWarrantyMiles", + type: "text", + multipleValues: false, + label: "FullWarrantyMiles", + renderer: { + name: "text-input" + } + }, + { + id: "fullWarrantyMonths", + fieldId: "fullWarrantyMonths", + type: "text", + multipleValues: false, + label: "FullWarrantyMonths", + renderer: { + name: "text-input" + } + }, + { + id: "powertrainWarrantyMiles", + fieldId: "powertrainWarrantyMiles", + type: "text", + multipleValues: false, + label: "PowertrainWarrantyMiles", + renderer: { + name: "text-input" + } + }, + { + id: "powertrainWarrantyMonths", + fieldId: "powertrainWarrantyMonths", + type: "text", + multipleValues: false, + label: "PowertrainWarrantyMonths", + renderer: { + name: "text-input" + } + }, + { + id: "maintenanceWarrantyMiles", + fieldId: "maintenanceWarrantyMiles", + type: "text", + multipleValues: false, + label: "MaintenanceWarrantyMiles (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "maintenanceWarrantyMonths", + fieldId: "maintenanceWarrantyMonths", + type: "text", + multipleValues: false, + label: "MaintenanceWarrantyMonths (non-jato)", + renderer: { + name: "text-input" + } + }, + { + id: "roadsideWarrantyMiles", + fieldId: "roadsideWarrantyMiles", + type: "text", + multipleValues: false, + label: "RoadsideWarrantyMiles", + renderer: { + name: "text-input" + } + }, + { + id: "roadsideWarrantyMonths", + fieldId: "roadsideWarrantyMonths", + type: "text", + multipleValues: false, + label: "RoadsideWarrantyMonths", + renderer: { + name: "text-input" + } + }, + { + id: "corrosionWarrantyMiles", + fieldId: "corrosionWarrantyMiles", + type: "text", + multipleValues: false, + label: "CorrosionWarrantyMiles", + renderer: { + name: "text-input" + } + }, + { + id: "corrosionWarrantyMonths", + fieldId: "corrosionWarrantyMonths", + type: "text", + multipleValues: false, + label: "CorrosionWarrantyMonths", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "pricing", + fieldId: "pricing", + type: "object", + label: "Pricing", + renderer: { + name: "object-accordion" + }, + settings: { + layout: [ + ["pInvoice", "pMsrp", "pDestination"], + ["pEffectiveOn", "pTargetPrice", "pTotalTargetPrice"], + ["pAverageSalesTaxAndFees", "pGasGuzzlerTax", "pTargetRebate"], + ["pNewMonthly", "pCpoPrice", "pExcellentRetailValue"], + ["pMsrpLabel", "pMsrpValue", "pFmpOrCrvLabel"], + ["pFmpOrCrvValue"] + ], + fields: [ + { + id: "pInvoice", + fieldId: "pInvoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "pMsrp", + fieldId: "pMsrp", + type: "number", + multipleValues: false, + label: "MSRP", + renderer: { + name: "number-input" + } + }, + { + id: "pDestination", + fieldId: "pDestination", + type: "number", + multipleValues: false, + label: "Destination", + renderer: { + name: "number-input" + } + }, + { + id: "pEffectiveOn", + fieldId: "pEffectiveOn", + type: "text", + multipleValues: false, + label: "PriceEffectiveOn", + renderer: { + name: "text-input" + } + }, + { + id: "pTargetPrice", + fieldId: "pTargetPrice", + type: "number", + multipleValues: false, + label: "Target Price(Non-Jato)", + renderer: { + name: "number-input" + } + }, + { + id: "pTotalTargetPrice", + fieldId: "pTotalTargetPrice", + type: "number", + multipleValues: false, + label: "Total TargetPrice(Non-Jato)", + renderer: { + name: "number-input" + } + }, + { + id: "pAverageSalesTaxAndFees", + fieldId: "pAverageSalesTaxAndFees", + type: "number", + multipleValues: false, + label: "AverageSalesTaxAndFees(Non-Jato)", + renderer: { + name: "number-input" + } + }, + { + id: "pGasGuzzlerTax", + fieldId: "pGasGuzzlerTax", + type: "number", + multipleValues: false, + label: "GasGuzzlerTax(Non-Jato)", + renderer: { + name: "number-input" + } + }, + { + id: "pTargetRebate", + fieldId: "pTargetRebate", + type: "number", + multipleValues: false, + label: "Target Rebate(Non-Jato)", + renderer: { + name: "number-input" + } + }, + { + id: "pNewMonthly", + fieldId: "pNewMonthly", + type: "number", + multipleValues: false, + label: "NewMonthly(Non-Jato)", + renderer: { + name: "number-input" + } + }, + { + id: "pCpoPrice", + fieldId: "pCpoPrice", + type: "text", + multipleValues: false, + label: "CpoPrice(Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "pExcellentRetailValue", + fieldId: "pExcellentRetailValue", + type: "number", + multipleValues: false, + label: "ExcellentRetailValue(Non-Jato)", + renderer: { + name: "number-input" + } + }, + { + id: "pMsrpLabel", + fieldId: "pMsrpLabel", + type: "text", + multipleValues: false, + label: "MsrpLabel(Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "pMsrpValue", + fieldId: "pMsrpValue", + type: "text", + multipleValues: false, + label: "MsrpValue(Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "pFmpOrCrvLabel", + fieldId: "pFmpOrCrvLabel", + type: "text", + multipleValues: false, + label: "FmpOrCrvLabel(Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "pFmpOrCrvValue", + fieldId: "pFmpOrCrvValue", + type: "text", + multipleValues: false, + label: "FmpOrCrvValue(Non-Jato)", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "safetyRatings", + fieldId: "safetyRatings", + type: "object", + label: "SafetyRatings", + renderer: { + name: "object-accordion" + }, + settings: { + layout: [ + ["nhtsaRatingOverall", "nhtsaRatingRollover", "nhtsaRatingFrontDriver"], + [ + "nhtsaRatingFrontPassenger", + "nhtsaRatingFrontSide", + "nhtsaRatingRearSide" + ], + ["iihsFrontModerateOverlap", "iihsOverallSideCrash", "iihsBestPick"], + ["iihsRearCrash", "iihsRoofStrength", "iihsFrontSmallOverlap"] + ], + fields: [ + { + id: "nhtsaRatingOverall", + fieldId: "nhtsaRatingOverall", + type: "text", + multipleValues: false, + label: "NhtsaRatingOverall", + renderer: { + name: "text-input" + } + }, + { + id: "nhtsaRatingRollover", + fieldId: "nhtsaRatingRollover", + type: "text", + multipleValues: false, + label: "NhtsaRatingRollover", + renderer: { + name: "text-input" + } + }, + { + id: "nhtsaRatingFrontDriver", + fieldId: "nhtsaRatingFrontDriver", + type: "text", + multipleValues: false, + label: "NhtsaRatingFrontDriver (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "nhtsaRatingFrontPassenger", + fieldId: "nhtsaRatingFrontPassenger", + type: "text", + multipleValues: false, + label: "NhtsaRatingFrontPassenger (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "nhtsaRatingFrontSide", + fieldId: "nhtsaRatingFrontSide", + type: "text", + multipleValues: false, + label: "NhtsaRatingFrontSide (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "nhtsaRatingRearSide", + fieldId: "nhtsaRatingRearSide", + type: "text", + multipleValues: false, + label: "NhtsaRatingRearSide (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "iihsFrontModerateOverlap", + fieldId: "iihsFrontModerateOverlap", + type: "text", + multipleValues: false, + label: "IihsFrontModerateOverlap (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "iihsOverallSideCrash", + fieldId: "iihsOverallSideCrash", + type: "text", + multipleValues: false, + label: "IihsOverallSideCrash (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "iihsBestPick", + fieldId: "iihsBestPick", + type: "text", + multipleValues: false, + label: "IihsBestPick (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "iihsRearCrash", + fieldId: "iihsRearCrash", + type: "text", + multipleValues: false, + label: "IihsRearCrash (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "iihsRoofStrength", + fieldId: "iihsRoofStrength", + type: "text", + multipleValues: false, + label: "IihsRoofStrength (Non-Jato)", + renderer: { + name: "text-input" + } + }, + { + id: "iihsFrontSmallOverlap", + fieldId: "iihsFrontSmallOverlap", + type: "text", + multipleValues: false, + label: "IihsFrontSmallOverlap (Non-Jato)", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "ownershipCosts", + fieldId: "ownershipCosts", + type: "object", + label: "Ownership Costs (Non-Jato)", + renderer: { + name: "object-accordion" + }, + settings: { + layout: [ + ["depreciationTotal", "financingTotal", "insuranceTotal"], + ["stateFeesTotal", "fuelTotal", "maintenanceTotal"], + ["repairsTotal", "total5YearOcCost", "total5YearOcCostLessHybrid"], + ["similarVehicles", "difference5YearCost", "hybridTax"], + ["valueRating"] + ], + fields: [ + { + id: "depreciationTotal", + fieldId: "depreciationTotal", + type: "text", + multipleValues: false, + label: "DepreciationTotal", + renderer: { + name: "text-input" + } + }, + { + id: "financingTotal", + fieldId: "financingTotal", + type: "text", + multipleValues: false, + label: "FinancingTotal", + renderer: { + name: "text-input" + } + }, + { + id: "insuranceTotal", + fieldId: "insuranceTotal", + type: "text", + multipleValues: false, + label: "InsuranceTotal", + renderer: { + name: "text-input" + } + }, + { + id: "stateFeesTotal", + fieldId: "stateFeesTotal", + type: "text", + multipleValues: false, + label: "StateFeesTotal", + renderer: { + name: "text-input" + } + }, + { + id: "fuelTotal", + fieldId: "fuelTotal", + type: "text", + multipleValues: false, + label: "FuelTotal", + renderer: { + name: "text-input" + } + }, + { + id: "maintenanceTotal", + fieldId: "maintenanceTotal", + type: "text", + multipleValues: false, + label: "MaintenanceTotal", + renderer: { + name: "text-input" + } + }, + { + id: "repairsTotal", + fieldId: "repairsTotal", + type: "text", + multipleValues: false, + label: "RepairsTotal", + renderer: { + name: "text-input" + } + }, + { + id: "total5YearOcCost", + fieldId: "total5YearOcCost", + type: "text", + multipleValues: false, + label: "Total5YearOcCost", + renderer: { + name: "text-input" + } + }, + { + id: "total5YearOcCostLessHybrid", + fieldId: "total5YearOcCostLessHybrid", + type: "number", + multipleValues: false, + label: "Total5YearOcCostLessHybrid", + renderer: { + name: "number-input" + } + }, + { + id: "similarVehicles", + fieldId: "similarVehicles", + type: "number", + multipleValues: false, + label: "SimilarVehicles", + renderer: { + name: "number-input" + } + }, + { + id: "difference5YearCost", + fieldId: "difference5YearCost", + type: "number", + multipleValues: false, + label: "Difference5YearCost", + renderer: { + name: "number-input" + } + }, + { + id: "hybridTax", + fieldId: "hybridTax", + type: "text", + multipleValues: false, + label: "HybridTax", + renderer: { + name: "text-input" + } + }, + { + id: "valueRating", + fieldId: "valueRating", + type: "text", + multipleValues: false, + label: "ValueRating", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "cpoComparison", + fieldId: "cpoComparison", + type: "object", + label: "CPOComparison (Non-Jato)", + renderer: { + name: "object-accordion" + }, + settings: { + layout: [ + ["usedMonthly", "cpoMonthly", "usedMaintenanceRepairs"], + ["cpoMaintenanceRepairs", "usedTotalMonthly", "cpoTotalMonthly"], + ["cpoYear", "cpoMake", "modelName"], + ["usedCarTrim", "cpoPrice", "usedCarPrice"], + ["vehicleRating"] + ], + fields: [ + { + id: "usedMonthly", + fieldId: "usedMonthly", + type: "number", + multipleValues: false, + label: "UsedMonthly", + renderer: { + name: "number-input" + } + }, + { + id: "cpoMonthly", + fieldId: "cpoMonthly", + type: "number", + multipleValues: false, + label: "CPOMonthly", + renderer: { + name: "number-input" + } + }, + { + id: "usedMaintenanceRepairs", + fieldId: "usedMaintenanceRepairs", + type: "number", + multipleValues: false, + label: "UsedMaintenanceRepairs", + renderer: { + name: "number-input" + } + }, + { + id: "cpoMaintenanceRepairs", + fieldId: "cpoMaintenanceRepairs", + type: "number", + multipleValues: false, + label: "CPOMaintenanceRepairs", + renderer: { + name: "number-input" + } + }, + { + id: "usedTotalMonthly", + fieldId: "usedTotalMonthly", + type: "number", + multipleValues: false, + label: "UsedTotalMonthly", + renderer: { + name: "number-input" + } + }, + { + id: "cpoTotalMonthly", + fieldId: "cpoTotalMonthly", + type: "number", + multipleValues: false, + label: "CPOTotalMonthly", + renderer: { + name: "number-input" + } + }, + { + id: "cpoYear", + fieldId: "cpoYear", + type: "number", + multipleValues: false, + label: "Year", + renderer: { + name: "number-input" + } + }, + { + id: "cpoMake", + fieldId: "cpoMake", + type: "text", + multipleValues: false, + label: "Make", + renderer: { + name: "text-input" + } + }, + { + id: "modelName", + fieldId: "modelName", + type: "text", + multipleValues: false, + label: "ModelName", + renderer: { + name: "text-input" + } + }, + { + id: "usedCarTrim", + fieldId: "usedCarTrim", + type: "text", + multipleValues: false, + label: "UsedCarTrim", + renderer: { + name: "text-input" + } + }, + { + id: "cpoPrice", + fieldId: "cpoPrice", + type: "text", + multipleValues: false, + label: "CPOPrice", + renderer: { + name: "text-input" + } + }, + { + id: "usedCarPrice", + fieldId: "usedCarPrice", + type: "number", + multipleValues: false, + label: "UsedCarPrice", + renderer: { + name: "number-input" + } + }, + { + id: "vehicleRating", + fieldId: "vehicleRating", + type: "text", + multipleValues: false, + label: "VehicleRating", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "historicalMotortrendScores", + fieldId: "historicalMotortrendScores", + type: "object", + label: "HistoricalMotortrendScores (Non-Jato)", + renderer: { + name: "object-accordion" + }, + settings: { + layout: [ + ["vrPerformance", "toolTipPerformance"], + ["overallScore", "toolTipOverallScore"], + ["fuelEconomy", "toolTipFuelEconomy"], + ["techInnovation", "toolTipTechInnovation"], + ["vrValue", "toolTipValue"] + ], + fields: [ + { + id: "vrPerformance", + fieldId: "vrPerformance", + type: "number", + multipleValues: false, + label: "Performance", + renderer: { + name: "number-input" + } + }, + { + id: "toolTipPerformance", + fieldId: "toolTipPerformance", + type: "text", + multipleValues: false, + label: "ToolTipPerformance", + renderer: { + name: "text-input" + } + }, + { + id: "overallScore", + fieldId: "overallScore", + type: "number", + multipleValues: false, + label: "OverallScore", + renderer: { + name: "number-input" + } + }, + { + id: "toolTipOverallScore", + fieldId: "toolTipOverallScore", + type: "text", + multipleValues: false, + label: "ToolTipOverallScore", + renderer: { + name: "text-input" + } + }, + { + id: "fuelEconomy", + fieldId: "fuelEconomy", + type: "number", + multipleValues: false, + label: "fuelEconomy", + renderer: { + name: "number-input" + } + }, + { + id: "toolTipFuelEconomy", + fieldId: "toolTipFuelEconomy", + type: "text", + multipleValues: false, + label: "toolTipFuelEconomy", + renderer: { + name: "text-input" + } + }, + { + id: "techInnovation", + fieldId: "techInnovation", + type: "number", + multipleValues: false, + label: "techInnovation", + renderer: { + name: "number-input" + } + }, + { + id: "toolTipTechInnovation", + fieldId: "toolTipTechInnovation", + type: "text", + multipleValues: false, + label: "toolTipTechInnovation", + renderer: { + name: "text-input" + } + }, + { + id: "vrValue", + fieldId: "vrValue", + type: "number", + multipleValues: false, + label: "Value", + renderer: { + name: "number-input" + } + }, + { + id: "toolTipValue", + fieldId: "toolTipValue", + type: "text", + multipleValues: false, + label: "toolTipValue", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "recalls", + fieldId: "recalls", + multipleValues: true, + label: "Recalls (Non-Jato)", + renderer: { + name: "objects-accordion" + }, + type: "object", + settings: { + layout: [ + ["recallId", "recallsCampNumber"], + ["makeText", "modelText", "yearText", "compName"], + ["mfgText", "recallsPotaff", "rcDate"], + ["descDefect", "consequenceDefect", "correctiveAction"] + ], + fields: [ + { + id: "recallId", + fieldId: "recallId", + type: "number", + multipleValues: false, + label: "RecallID", + renderer: { + name: "number-input" + } + }, + { + id: "recallsCampNumber", + fieldId: "recallsCampNumber", + type: "text", + multipleValues: false, + label: "Campno", + renderer: { + name: "text-input" + } + }, + { + id: "makeText", + fieldId: "makeText", + type: "text", + multipleValues: false, + label: "Maketxt", + renderer: { + name: "text-input" + } + }, + { + id: "modelText", + fieldId: "modelText", + type: "text", + multipleValues: false, + label: "Modeltxt", + renderer: { + name: "text-input" + } + }, + { + id: "yearText", + fieldId: "yearText", + type: "number", + multipleValues: false, + label: "Yeartxt", + renderer: { + name: "number-input" + } + }, + { + id: "compName", + fieldId: "compName", + type: "text", + multipleValues: false, + label: "Compname", + renderer: { + name: "text-input" + } + }, + { + id: "mfgText", + fieldId: "mfgText", + type: "text", + multipleValues: false, + label: "Mfgtxt", + renderer: { + name: "text-input" + } + }, + { + id: "recallsPotaff", + fieldId: "recallsPotaff", + type: "number", + multipleValues: false, + label: "Potaff", + renderer: { + name: "number-input" + } + }, + { + id: "rcDate", + fieldId: "rcDate", + type: "text", + multipleValues: false, + label: "Rcdate", + renderer: { + name: "text-input" + } + }, + { + id: "descDefect", + fieldId: "descDefect", + type: "text", + multipleValues: false, + label: "DescDefect", + renderer: { + name: "text-input" + } + }, + { + id: "consequenceDefect", + fieldId: "consequenceDefect", + type: "text", + multipleValues: false, + label: "ConsequenceDefect", + renderer: { + name: "text-input" + } + }, + { + id: "correctiveAction", + fieldId: "correctiveAction", + type: "text", + multipleValues: false, + label: "CorrectiveAction", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "carsRebates", + fieldId: "carsRebates", + multipleValues: true, + label: "Rebates (Non-Jato)", + renderer: { + name: "objects-accordion" + }, + type: "object", + settings: { + layout: [ + ["rebatesLow", "rebatesHigh", "rebateText"], + ["nationallyAvailable", "rebatesDescription", "rebatesExpDate"] + ], + fields: [ + { + id: "rebatesExpDate", + fieldId: "rebatesExpDate", + type: "text", + multipleValues: false, + label: "ExpDate", + renderer: { + name: "text-input" + } + }, + { + id: "rebatesLow", + fieldId: "rebatesLow", + type: "number", + multipleValues: false, + label: "Low", + renderer: { + name: "number-input" + } + }, + { + id: "rebatesHigh", + fieldId: "rebatesHigh", + type: "number", + multipleValues: false, + label: "High", + renderer: { + name: "number-input" + } + }, + { + id: "rebateText", + fieldId: "rebateText", + type: "text", + multipleValues: false, + label: "RebateText", + renderer: { + name: "text-input" + } + }, + { + id: "nationallyAvailable", + fieldId: "nationallyAvailable", + type: "number", + multipleValues: false, + label: "Nationally Available", + renderer: { + name: "number-input" + } + }, + { + id: "rebatesDescription", + fieldId: "rebatesDescription", + type: "text", + multipleValues: false, + label: "Description", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "cpoProgram", + fieldId: "cpoProgram", + type: "object", + label: "CpoProgram (Non-Jato)", + renderer: { + name: "object-accordion" + }, + settings: { + layout: [ + ["cpoName", "cpoInspectionPoint", "cpoInspectionScore"], + ["cpoAgeMileage", "cpoWarranty", "cpoWarrantyDeductible"], + ["cpoWarrantyBbnc", "cpoWarrantyTransferable", "cpoWarrantyExtended"], + ["cpoRoadside", "cpoReturnExchange", "cpoFinancing"], + ["cpoLease", "cpoWebsite", "cpoCustomerServiceNumber"], + ["cpoParticipation", "cpoHistoryReport", "cpoAdditionalBenefits"], + ["cpoProgramOverview"] + ], + fields: [ + { + id: "cpoName", + fieldId: "cpoName", + type: "text", + multipleValues: false, + label: "CpoName", + renderer: { + name: "text-input" + } + }, + { + id: "cpoInspectionPoint", + fieldId: "cpoInspectionPoint", + type: "text", + multipleValues: false, + label: "CPOInspectionPoint", + renderer: { + name: "text-input" + } + }, + { + id: "cpoInspectionScore", + fieldId: "cpoInspectionScore", + type: "number", + multipleValues: false, + label: "CPOInspectionScore", + renderer: { + name: "number-input" + } + }, + { + id: "cpoAgeMileage", + fieldId: "cpoAgeMileage", + type: "text", + multipleValues: false, + label: "CPOAgeMileage", + renderer: { + name: "text-input" + } + }, + { + id: "cpoWarranty", + fieldId: "cpoWarranty", + type: "text", + multipleValues: false, + label: "CPOWarranty", + renderer: { + name: "text-input" + } + }, + { + id: "cpoWarrantyDeductible", + fieldId: "cpoWarrantyDeductible", + type: "text", + multipleValues: false, + label: "CPOWarrantyDeductible", + renderer: { + name: "text-input" + } + }, + { + id: "cpoWarrantyBbnc", + fieldId: "cpoWarrantyBbnc", + type: "text", + multipleValues: false, + label: "CPOWarrantyBbnc", + renderer: { + name: "text-input" + } + }, + { + id: "cpoWarrantyTransferable", + fieldId: "cpoWarrantyTransferable", + type: "text", + multipleValues: false, + label: "CPOWarrantyTransferable", + renderer: { + name: "text-input" + } + }, + { + id: "cpoWarrantyExtended", + fieldId: "cpoWarrantyExtended", + type: "text", + multipleValues: false, + label: "CPOWarrantyExtended", + renderer: { + name: "text-input" + } + }, + { + id: "cpoRoadside", + fieldId: "cpoRoadside", + type: "text", + multipleValues: false, + label: "CPORoadside", + renderer: { + name: "text-input" + } + }, + { + id: "cpoReturnExchange", + fieldId: "cpoReturnExchange", + type: "text", + multipleValues: false, + label: "CPOReturnExchange", + renderer: { + name: "text-input" + } + }, + { + id: "cpoFinancing", + fieldId: "cpoFinancing", + type: "text", + multipleValues: false, + label: "CPOFinancing", + renderer: { + name: "text-input" + } + }, + { + id: "cpoLease", + fieldId: "cpoLease", + type: "text", + multipleValues: false, + label: "CPOLease", + renderer: { + name: "text-input" + } + }, + { + id: "cpoWebsite", + fieldId: "cpoWebsite", + type: "text", + multipleValues: false, + label: "CPOWebsite", + renderer: { + name: "text-input" + } + }, + { + id: "cpoCustomerServiceNumber", + fieldId: "cpoCustomerServiceNumber", + type: "text", + multipleValues: false, + label: "CPOCustomerServiceNumber", + renderer: { + name: "text-input" + } + }, + { + id: "cpoParticipation", + fieldId: "cpoParticipation", + type: "text", + multipleValues: false, + label: "CPOParticipation", + renderer: { + name: "text-input" + } + }, + { + id: "cpoHistoryReport", + fieldId: "cpoHistoryReport", + type: "number", + multipleValues: false, + label: "CPOHistoryReport", + renderer: { + name: "number-input" + } + }, + { + id: "cpoAdditionalBenefits", + fieldId: "cpoAdditionalBenefits", + type: "text", + multipleValues: false, + label: "CPOAdditionalBenefits", + renderer: { + name: "text-input" + } + }, + { + id: "cpoProgramOverview", + fieldId: "cpoProgramOverview", + type: "text", + multipleValues: false, + label: "CPOProgramOverview", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "realmpg", + fieldId: "realmpg", + type: "object", + label: "RealMpg (Non-Jato)", + renderer: { + name: "object-accordion" + }, + settings: { + layout: [ + ["realmpgAverageMpg", "realmpgAverageMpgCity", "realmpgAverageMpgHwy"] + ], + fields: [ + { + id: "realmpgAverageMpg", + fieldId: "realmpgAverageMpg", + type: "number", + multipleValues: false, + label: "RealmpgAverageMpg", + renderer: { + name: "number-input" + } + }, + { + id: "realmpgAverageMpgCity", + fieldId: "realmpgAverageMpgCity", + type: "number", + multipleValues: false, + label: "RealmpgAverageMpgCity", + renderer: { + name: "number-input" + } + }, + { + id: "realmpgAverageMpgHwy", + fieldId: "realmpgAverageMpgHwy", + type: "number", + multipleValues: false, + label: "RealmpgAverageMpgHwy", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "hubs", + fieldId: "hubs", + multipleValues: true, + label: "Hubs (Non-Jato)", + renderer: { + name: "objects-accordion" + }, + type: "object", + settings: { + layout: [["hubsImage", "makeModelHub", "hubsName", "hubsText"]], + fields: [ + { + id: "hubsImage", + fieldId: "hubsImage", + type: "text", + multipleValues: false, + label: "Image", + renderer: { + name: "text-input" + } + }, + { + id: "makeModelHub", + fieldId: "makeModelHub", + type: "number", + multipleValues: false, + label: "MakeModelHub", + renderer: { + name: "number-input" + } + }, + { + id: "hubsName", + fieldId: "hubsName", + type: "text", + multipleValues: false, + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "hubsText", + fieldId: "hubsText", + type: "text", + multipleValues: false, + label: "Text", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "seoText", + fieldId: "seoText", + type: "object", + label: "Seo", + renderer: { + name: "object-accordion" + }, + settings: { + layout: [["seoType", "seoTitle"], ["seoContent"]], + fields: [ + { + id: "seoType", + fieldId: "seoType", + multipleValues: false, + type: "text", + label: "Type", + renderer: { + name: "text-input" + } + }, + { + id: "seoTitle", + fieldId: "seoTitle", + multipleValues: false, + type: "text", + label: "Title", + renderer: { + name: "text-input" + } + }, + { + id: "seoContent", + fieldId: "seoContent", + multipleValues: false, + type: "text", + label: "Content", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "images", + fieldId: "images", + multipleValues: true, + label: "Images (Non-Jato)", + renderer: { + name: "objects-accordion" + }, + type: "object", + settings: { + layout: [["imageUrl"], ["imageAngle", "imageType", "imageOrder"]], + fields: [ + { + id: "imageUrl", + fieldId: "imageUrl", + type: "text", + label: "Image Url", + renderer: { + name: "text-input" + }, + helpText: "This is a Required Field." + }, + { + id: "imageAngle", + fieldId: "imageAngle", + type: "text", + helpText: "can be front or rear...etc", + label: "Image Angle", + renderer: { + name: "text-input" + } + }, + { + id: "imageType", + fieldId: "imageType", + type: "text", + helpText: "can be exterior or interior", + label: "Image Type", + renderer: { + name: "text-input" + } + }, + { + id: "imageOrder", + fieldId: "imageOrder", + type: "number", + helpText: "can be use for display order", + label: "Image Order", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "featuresIntellicar", + fieldId: "featuresIntellicar", + type: "object", + label: "Features(Non-Jato)", + multipleValues: false, + renderer: { + name: "object-accordion" + }, + settings: { + layout: [ + ["packageCategory"], + ["engineCategory"], + ["transmissionCategory"], + ["exteriorColorCategory"], + ["interiorColorCategory"], + ["topColorCategory"], + ["bodyCategory"], + ["brakesCategory"], + ["convenienceCategory"], + ["driveCategory"], + ["engineeringCategory"], + ["exteriorCategory"], + ["interiorCategory"], + ["lightingCategory"], + ["mandatoryCategory"], + ["mirrorsCategory"], + ["noteCategory"], + ["otherCategory"], + ["paintCategory"], + ["safetyCategory"], + ["seatsCategory"], + ["soundCategory"], + ["specialFeesCreditsOptionsCategory"], + ["steeringCategory"], + ["suspensionCategory"], + ["tiresCategory"], + ["towingCategory"], + ["truckBedsCategory"], + ["wheelsCategory"] + ], + fields: [ + { + id: "packageCategory", + fieldId: "packageCategory", + type: "object", + label: "PACKAGE", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "engineCategory", + fieldId: "engineCategory", + type: "object", + label: "ENGINE", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "SequenceNmb", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "transmissionCategory", + fieldId: "transmissionCategory", + type: "object", + label: "TRANSMISSION", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "exteriorColorCategory", + fieldId: "exteriorColorCategory", + type: "object", + label: "EXTERIOR COLOR", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "interiorColorCategory", + fieldId: "interiorColorCategory", + type: "object", + label: "INTERIOR COLOR", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "topColorCategory", + fieldId: "topColorCategory", + type: "object", + label: "TOP COLOR", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "bodyCategory", + fieldId: "bodyCategory", + type: "object", + label: "BODY", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "brakesCategory", + fieldId: "brakesCategory", + type: "object", + label: "BRAKES", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "convenienceCategory", + fieldId: "convenienceCategory", + type: "object", + label: "CONVENIENCE", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "driveCategory", + fieldId: "driveCategory", + type: "object", + label: "DRIVE", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "engineeringCategory", + fieldId: "engineeringCategory", + type: "object", + label: "ENGINEERING", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "exteriorCategory", + fieldId: "exteriorCategory", + type: "object", + label: "EXTERIOR", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "interiorCategory", + fieldId: "interiorCategory", + type: "object", + label: "INTERIOR", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "lightingCategory", + fieldId: "lightingCategory", + type: "object", + label: "LIGHTING", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "mandatoryCategory", + fieldId: "mandatoryCategory", + type: "object", + label: "MANDATORY", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "mirrorsCategory", + fieldId: "mirrorsCategory", + type: "object", + label: "MIRRORS", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "noteCategory", + fieldId: "noteCategory", + type: "object", + label: "NOTE", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "otherCategory", + fieldId: "otherCategory", + type: "object", + label: "OTHER", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "paintCategory", + fieldId: "paintCategory", + type: "object", + label: "PAINT", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "safetyCategory", + fieldId: "safetyCategory", + type: "object", + label: "SAFETY", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "seatsCategory", + fieldId: "seatsCategory", + type: "object", + label: "SEATS", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "soundCategory", + fieldId: "soundCategory", + type: "object", + label: "SOUND", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "specialFeesCreditsOptionsCategory", + fieldId: "specialFeesCreditsOptionsCategory", + type: "object", + label: "SPECIAL FEES CREDITS OPTIONS", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "steeringCategory", + fieldId: "steeringCategory", + type: "object", + label: "STEERING", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "suspensionCategory", + fieldId: "suspensionCategory", + type: "object", + label: "SUSPENSION", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "tiresCategory", + fieldId: "tiresCategory", + type: "object", + label: "TIRES", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "towingCategory", + fieldId: "towingCategory", + type: "object", + label: "TOWING", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "truckBedsCategory", + fieldId: "truckBedsCategory", + type: "object", + label: "TRUCK BEDS", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + }, + { + id: "wheelsCategory", + fieldId: "wheelsCategory", + type: "object", + label: "WHEELS", + multipleValues: true, + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["name", "availability", "invoice"], + ["includesNote", "retail"], + ["sequenceNmb", "categorySequenceNmb"] + ], + fields: [ + { + id: "name", + fieldId: "name", + type: "text", + label: "Name", + renderer: { + name: "text-input" + } + }, + { + id: "availability", + fieldId: "availability", + type: "text", + label: "Availability", + renderer: { + name: "text-input" + } + }, + { + id: "invoice", + fieldId: "invoice", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "includesNote", + fieldId: "includesNote", + type: "text", + label: "IncludesNote", + renderer: { + name: "text-input" + } + }, + { + id: "retail", + fieldId: "retail", + type: "number", + multipleValues: false, + label: "Retail", + renderer: { + name: "number-input" + } + }, + { + id: "sequenceNmb", + fieldId: "sequenceNmb", + type: "number", + multipleValues: false, + label: "Invoice", + renderer: { + name: "number-input" + } + }, + { + id: "categorySequenceNmb", + fieldId: "categorySequenceNmb", + type: "number", + multipleValues: false, + label: "CategorySequenceNmb", + renderer: { + name: "number-input" + } + } + ] + } + } + ] + } + }, + { + id: "vehicleRankingClass", + fieldId: "vehicleRankingClass", + type: "object", + multipleValues: true, + label: "Motortrend Scores (Non-Jato)", + renderer: { + name: "objects-accordion" + }, + settings: { + layout: [ + ["classTitle", "classSlugRedirect", "classPosition"], + ["rankClass", "slugClassTitle", "associatedBody"], + ["vrcSubclass", "subclassTitle", "vrcSubclassPosition"], + ["vrPerformance", "toolTipPerformance"], + ["overallScore", "toolTipOverallScore"], + ["fuelEconomy", "toolTipFuelEconomy"], + ["techInnovation", "toolTipTechInnovation"], + ["vrValue", "toolTipValue"], + ["vrcClassThumbnailUrl", "vrcClassThumbnailRolloverUrl"], + ["vrcIsMakeBodyStyleVehicleShow", "vrcIsRankShow", "vrcIsVehicleShow"], + ["vrcRankWithinSubclass", "vrcRankInSubclassText"], + ["vrcTopRankingTrophyImage"] + ], + fields: [ + { + id: "classTitle", + fieldId: "classTitle", + type: "text", + label: "ClassTitle", + renderer: { + name: "text-input" + }, + helpText: "This is a Required Field." + }, + { + id: "classSlugRedirect", + fieldId: "classSlugRedirect", + type: "text", + label: "ClassSlugRedirect", + renderer: { + name: "text-input" + } + }, + { + id: "associatedBody", + fieldId: "associatedBody", + type: "number", + label: "AssociatedBody", + renderer: { + name: "number-input" + } + }, + { + id: "classPosition", + fieldId: "classPosition", + type: "number", + label: "ClassPosition", + renderer: { + name: "number-input" + } + }, + { + id: "rankClass", + fieldId: "rankClass", + type: "text", + label: "RankClass", + renderer: { + name: "text-input" + } + }, + { + id: "slugClassTitle", + fieldId: "slugClassTitle", + type: "text", + label: "SlugClassTitle", + renderer: { + name: "text-input" + }, + helpText: "This is a Required Field." + }, + { + id: "subclassTitle", + fieldId: "subclassTitle", + type: "text", + label: "SubclassTitle", + renderer: { + name: "text-input" + }, + helpText: "This is a Required Field." + }, + { + id: "vrPerformance", + fieldId: "vrPerformance", + type: "number", + label: "Performance", + renderer: { + name: "number-input" + } + }, + { + id: "toolTipPerformance", + fieldId: "toolTipPerformance", + type: "text", + label: "ToolTipPerformance", + renderer: { + name: "text-input" + } + }, + { + id: "overallScore", + fieldId: "overallScore", + type: "number", + label: "OverallScore", + renderer: { + name: "number-input" + }, + helpText: "This is a Required Field." + }, + { + id: "toolTipOverallScore", + fieldId: "toolTipOverallScore", + type: "text", + label: "ToolTipOverallScore", + renderer: { + name: "text-input" + } + }, + { + id: "fuelEconomy", + fieldId: "fuelEconomy", + type: "number", + label: "fuelEconomy", + renderer: { + name: "number-input" + } + }, + { + id: "toolTipFuelEconomy", + fieldId: "toolTipFuelEconomy", + type: "text", + label: "toolTipFuelEconomy", + renderer: { + name: "text-input" + } + }, + { + id: "techInnovation", + fieldId: "techInnovation", + type: "number", + label: "techInnovation", + renderer: { + name: "number-input" + } + }, + { + id: "toolTipTechInnovation", + fieldId: "toolTipTechInnovation", + type: "text", + label: "toolTipTechInnovation", + renderer: { + name: "text-input" + } + }, + { + id: "vrValue", + fieldId: "vrValue", + type: "number", + label: "Value", + renderer: { + name: "number-input" + } + }, + { + id: "toolTipValue", + fieldId: "toolTipValue", + type: "text", + label: "toolTipValue", + renderer: { + name: "text-input" + } + }, + { + id: "vrcClassThumbnailRolloverUrl", + fieldId: "classThumbnailRolloverUrl", + type: "text", + label: "Class ThumbnailRolloverUrl", + renderer: { + name: "text-input" + } + }, + { + id: "vrcClassThumbnailUrl", + fieldId: "classThumbnailUrl", + type: "text", + label: "Class ThumbnailUrl", + renderer: { + name: "text-input" + } + }, + { + id: "vrcIsMakeBodyStyleVehicleShow", + fieldId: "isMakeBodyStyleVehicleShow", + type: "number", + label: "Is MakeBodyStyle VehicleShow", + renderer: { + name: "number-input" + } + }, + { + id: "vrcIsRankShow", + fieldId: "isRankShow", + type: "number", + label: "Is RankShow", + renderer: { + name: "number-input" + }, + helpText: "This is a Required Field." + }, + { + id: "vrcIsVehicleShow", + fieldId: "isVehicleShow", + type: "number", + label: "Is VehicleShow", + renderer: { + name: "number-input" + }, + helpText: "This is a Required Field." + }, + { + id: "vrcRankInSubclassText", + fieldId: "rankInSubclassText", + type: "text", + label: "RankIn SubclassText", + renderer: { + name: "text-input" + } + }, + { + id: "vrcRankWithinSubclass", + fieldId: "rankWithinSubclass", + type: "number", + label: "RankWithin Subclass", + renderer: { + name: "number-input" + }, + helpText: "This is a Required Field." + }, + { + id: "vrcSubclass", + fieldId: "subclass", + type: "text", + label: "subclass", + renderer: { + name: "text-input" + } + }, + { + id: "vrcSubclassPosition", + fieldId: "subclassPosition", + type: "number", + label: "Subclass Position", + renderer: { + name: "number-input" + } + }, + { + id: "vrcTopRankingTrophyImage", + fieldId: "topRankingTrophyImage", + type: "text", + label: "TopRanking Trophy Image", + renderer: { + name: "text-input" + } + } + ] + } + }, + { + id: "carMatchCustomRankings", + fieldId: "carMatchCustomRankings", + multipleValues: true, + label: "carMatchCustomRankings (Non-Jato)", + renderer: { + name: "objects-accordion" + }, + type: "object", + settings: { + layout: [ + ["carMatchBody", "carMatchSeats", "carMatchLuxury"], + ["carMatchGreen", "carMatchOffroad", "carMatchBudget"], + ["carMatchPriority", "carMatchEstimated", "totalPercentage"], + ["seatingCapacity", "carMatchHorsepower", "winnerDescription"], + ["priceRange", "carMatchMpg", "carMatchUUID"], + ["rankWithinSubclass", "carMatchSubClassTitle"] + ], + fields: [ + { + id: "carMatchBody", + fieldId: "carMatchBody", + type: "text", + multipleValues: false, + label: "Body", + renderer: { + name: "text-input" + } + }, + { + id: "carMatchSeats", + fieldId: "carMatchSeats", + type: "text", + multipleValues: false, + label: "Seats", + renderer: { + name: "text-input" + } + }, + { + id: "carMatchLuxury", + fieldId: "carMatchLuxury", + type: "text", + multipleValues: false, + label: "Luxury", + renderer: { + name: "text-input" + } + }, + { + id: "carMatchGreen", + fieldId: "carMatchGreen", + type: "text", + multipleValues: false, + label: "Green", + renderer: { + name: "text-input" + } + }, + { + id: "carMatchOffroad", + fieldId: "carMatchOffroad", + type: "text", + multipleValues: false, + label: "Offroad", + renderer: { + name: "text-input" + } + }, + { + id: "carMatchBudget", + fieldId: "carMatchBudget", + type: "text", + multipleValues: false, + label: "Budget", + renderer: { + name: "text-input" + } + }, + { + id: "totalPercentage", + fieldId: "totalPercentage", + type: "number", + multipleValues: false, + label: "TotalPercentage", + renderer: { + name: "number-input" + } + }, + { + id: "carMatchPriority", + fieldId: "carMatchPriority", + type: "number", + multipleValues: false, + label: "Priority", + renderer: { + name: "number-input" + } + }, + { + id: "carMatchEstimated", + fieldId: "carMatchEstimated", + type: "number", + multipleValues: false, + label: "Estimated", + renderer: { + name: "number-input" + } + }, + { + id: "priceRange", + fieldId: "priceRange", + type: "text", + multipleValues: false, + label: "PriceRange", + renderer: { + name: "text-input" + } + }, + { + id: "carMatchMpg", + fieldId: "carMatchMpg", + type: "text", + multipleValues: false, + label: "Mpg", + renderer: { + name: "text-input" + } + }, + { + id: "seatingCapacity", + fieldId: "seatingCapacity", + type: "text", + multipleValues: false, + label: "SeatingCapacity", + renderer: { + name: "text-input" + } + }, + { + id: "carMatchHorsepower", + fieldId: "carMatchHorsepower", + type: "text", + multipleValues: false, + label: "horsepower", + renderer: { + name: "text-input" + } + }, + { + id: "winnerDescription", + fieldId: "winnerDescription", + type: "text", + multipleValues: false, + label: "WinnerDescription", + renderer: { + name: "text-input" + } + }, + { + id: "rankWithinSubclass", + fieldId: "rankWithinSubclass", + type: "number", + multipleValues: false, + label: "RankWithinSubclass", + renderer: { + name: "number-input" + } + }, + { + id: "carMatchSubClassTitle", + fieldId: "carMatchSubClassTitle", + type: "text", + multipleValues: false, + label: "SubClassTitle", + renderer: { + name: "text-input" + } + }, + { + id: "carMatchUUID", + fieldId: "carMatchUUID", + type: "number", + label: "UUID (PermaLinkID)", + renderer: { + name: "number-input" + } + } + ] + } + } + ], + layout: [ + ["carsVehicle"], + ["bodyStyle", "carsMakePageShow", "carsPricePageShow"], + ["vehicleNmb", "carsUid", "trimName", "carsDiscontinued"], + ["carsMake", "carsModelName", "carsYear"], + ["slugMake", "slugModelName", "slugTrimName"], + ["baseVehicle", "releaseType", "newUsedBg"], + ["manufacturerCd", "slugBodystyle", "makeFeaturedImage"], + ["makeIcon", "makeDiscontinued", "oemUrl"], + ["carsSubcategory", "slugSubcategory", "mainCategory"], + ["slugMainCategory", "hybridElectricCategory", "slugHybridElectricCategory"], + ["dieselCategory", "slugDieselCategory", "updatedOn"], + ["vehicleStatus", "featuredImage", "priceRangeText"], + ["propertyType", "marketingImage", "priceRangeValue"], + ["ymmPriceRange", "priceRangeSlug", "latestYear"], + ["ymmLowestPriceRange", "ymmMaxPriceRange", "makeThumbnailUrl"], + ["combinedPrice", "carsCombinedEpaMpg", "horsePowerVal"], + ["slugMakeModel", "slugYearMakeModel", "retainedValue", "standardTires"], + ["bodyTypeOrder", "bodyType", "bodyTypeText", "slugBodyType"], + [ + "secondaryBodyTypeOrder", + "secondaryBodyType", + "secondaryBodyTypeText", + "slugSecondaryBodyType" + ], + ["carsEditorialRating"], + ["specifications"], + ["powertrains"], + ["warranty"], + ["pricing"], + ["safetyRatings"], + ["ownershipCosts"], + ["cpoComparison"], + ["carsRebates"], + ["historicalMotortrendScores"], + ["recalls"], + ["cpoProgram"], + ["realmpg"], + ["hubs"], + ["featuresIntellicar"], + ["seoText"], + ["images"], + ["vehicleRankingClass"], + ["carMatchCustomRankings"] + ], + titleFieldId: "carsVehicle" + }; +}; diff --git a/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/types.ts b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/types.ts new file mode 100644 index 00000000000..37a24aa42d2 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/MockDataManager/types.ts @@ -0,0 +1,12 @@ +import { ITaskResponseDoneResultOutput } from "@webiny/tasks"; + +export interface IMockDataManagerInput { + modelId: string; + amount: number; + seconds?: number; + amountOfTasks?: number; + amountOfRecords?: number; + overwrite?: boolean; +} + +export type IMockDataManagerOutput = ITaskResponseDoneResultOutput; diff --git a/packages/api-headless-cms-es-tasks/src/tasks/createMockDataCreatorTask.ts b/packages/api-headless-cms-es-tasks/src/tasks/createMockDataCreatorTask.ts new file mode 100644 index 00000000000..9af62b64c2b --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/createMockDataCreatorTask.ts @@ -0,0 +1,30 @@ +import { createTaskDefinition } from "@webiny/tasks"; +import { Context } from "~/types"; +import { IMockDataCreatorInput, IMockDataCreatorOutput } from "~/tasks/MockDataCreator/types"; + +export const MOCK_DATA_CREATOR_TASK_ID = "mockDataCreator"; + +export const createMockDataCreatorTask = () => { + return createTaskDefinition({ + id: MOCK_DATA_CREATOR_TASK_ID, + title: "Mock Data Creator", + maxIterations: 500, + async run(params) { + const { MockDataCreator } = await import( + /* webpackChunkName: "MockDataCreator" */ "./MockDataCreator/MockDataCreator" + ); + + const carsMock = new MockDataCreator< + Context, + IMockDataCreatorInput, + IMockDataCreatorOutput + >(); + + try { + return await carsMock.execute(params); + } catch (ex) { + return params.response.error(ex); + } + } + }); +}; diff --git a/packages/api-headless-cms-es-tasks/src/tasks/createMockDataManagerTask.ts b/packages/api-headless-cms-es-tasks/src/tasks/createMockDataManagerTask.ts new file mode 100644 index 00000000000..c40e1230f2f --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/tasks/createMockDataManagerTask.ts @@ -0,0 +1,58 @@ +import { createTaskDefinition } from "@webiny/tasks"; +import { Context } from "~/types"; +import { IMockDataManagerInput, IMockDataManagerOutput } from "~/tasks/MockDataManager/types"; +import { CARS_MODEL_ID } from "~/tasks/MockDataManager/constants"; +import { enableIndexing } from "~/utils"; + +export const MOCK_DATA_MANAGER_TASK_ID = "mockDataManager"; + +export const createMockDataManagerTask = () => { + return createTaskDefinition({ + id: MOCK_DATA_MANAGER_TASK_ID, + title: "Mock Data Manager", + maxIterations: 500, + async run(params) { + const { MockDataManager } = await import( + /* webpackChunkName: "MockDataManager" */ "./MockDataManager/MockDataManager" + ); + + const carsMock = new MockDataManager< + Context, + IMockDataManagerInput, + IMockDataManagerOutput + >(); + + try { + return await carsMock.execute({ + ...params, + input: { + ...params.input, + modelId: CARS_MODEL_ID + } + }); + } catch (ex) { + return params.response.error(ex); + } + }, + async onError({ context }) { + await enableIndexing({ + client: context.elasticsearch, + model: { + modelId: CARS_MODEL_ID, + tenant: "root", + locale: "en-US" + } + }); + }, + async onAbort({ context }) { + await enableIndexing({ + client: context.elasticsearch, + model: { + modelId: CARS_MODEL_ID, + tenant: "root", + locale: "en-US" + } + }); + } + }); +}; diff --git a/packages/api-headless-cms-es-tasks/src/types.ts b/packages/api-headless-cms-es-tasks/src/types.ts new file mode 100644 index 00000000000..b4a2496a5cf --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/types.ts @@ -0,0 +1,7 @@ +import { ElasticsearchContext } from "@webiny/api-elasticsearch/types"; +import { CmsContext } from "@webiny/api-headless-cms/types"; +import { Context as TasksContext } from "@webiny/tasks/types"; + +export * from "./tasks/MockDataManager/types"; + +export interface Context extends CmsContext, ElasticsearchContext, TasksContext {} diff --git a/packages/api-headless-cms-es-tasks/src/utils/createIndex.ts b/packages/api-headless-cms-es-tasks/src/utils/createIndex.ts new file mode 100644 index 00000000000..a62144b10d5 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/utils/createIndex.ts @@ -0,0 +1,35 @@ +import { Client, createIndex as baseCreateIndex } from "@webiny/api-elasticsearch"; +import { CmsModel } from "@webiny/api-headless-cms/types"; +import { configurations } from "@webiny/api-headless-cms-ddb-es/configurations"; +import { CmsEntryElasticsearchIndexPlugin } from "@webiny/api-headless-cms-ddb-es/plugins"; +import { PluginsContainer } from "@webiny/plugins"; + +export interface ICreateIndexParams { + client: Client; + model: Pick; + plugins: PluginsContainer; +} + +export const createIndex = async (params: ICreateIndexParams): Promise => { + const { client, model, plugins } = params; + + const { index } = configurations.es({ + model + }); + + const result = await client.indices.exists({ + index + }); + if (result.body) { + return; + } + + await baseCreateIndex({ + index, + client, + locale: model.locale, + tenant: model.tenant, + plugins, + type: CmsEntryElasticsearchIndexPlugin.type + }); +}; diff --git a/packages/api-headless-cms-es-tasks/src/utils/disableIndexing.ts b/packages/api-headless-cms-es-tasks/src/utils/disableIndexing.ts new file mode 100644 index 00000000000..2dd54d762ed --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/utils/disableIndexing.ts @@ -0,0 +1,31 @@ +import { Client } from "@webiny/api-elasticsearch"; +import { configurations } from "@webiny/api-headless-cms-ddb-es/configurations"; +import { CmsModel } from "@webiny/api-headless-cms/types"; + +export interface IDisableIndexingParams { + client: Client; + model: Pick; +} + +export const disableIndexing = async (params: IDisableIndexingParams) => { + const { client, model } = params; + + const { index } = configurations.es({ + model + }); + + try { + await client.indices.putSettings({ + index, + body: { + index: { + number_of_replicas: 0, + refresh_interval: "-1" + } + } + }); + } catch (ex) { + console.error(ex); + throw ex; + } +}; diff --git a/packages/api-headless-cms-es-tasks/src/utils/enableIndexing.ts b/packages/api-headless-cms-es-tasks/src/utils/enableIndexing.ts new file mode 100644 index 00000000000..0f7fc18f40f --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/utils/enableIndexing.ts @@ -0,0 +1,29 @@ +import { Client } from "@webiny/api-elasticsearch"; +import { CmsModel } from "@webiny/api-headless-cms/types"; +import { configurations } from "@webiny/api-headless-cms-ddb-es/configurations"; + +interface IEnableIndexingParams { + client: Client; + model: Pick; +} + +export const enableIndexing = async (params: IEnableIndexingParams) => { + const { client, model } = params; + const { index } = configurations.es({ + model + }); + try { + await client.indices.putSettings({ + index, + body: { + index: { + number_of_replicas: 1, + refresh_interval: "1s" + } + } + }); + } catch (ex) { + console.error(ex); + throw ex; + } +}; diff --git a/packages/api-headless-cms-es-tasks/src/utils/index.ts b/packages/api-headless-cms-es-tasks/src/utils/index.ts new file mode 100644 index 00000000000..fe1ed9e91ea --- /dev/null +++ b/packages/api-headless-cms-es-tasks/src/utils/index.ts @@ -0,0 +1,3 @@ +export * from "./createIndex"; +export * from "./disableIndexing"; +export * from "./enableIndexing"; diff --git a/packages/api-headless-cms-es-tasks/tsconfig.build.json b/packages/api-headless-cms-es-tasks/tsconfig.build.json new file mode 100644 index 00000000000..0d40af37eb7 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/tsconfig.build.json @@ -0,0 +1,27 @@ +{ + "extends": "../../tsconfig.build.json", + "include": ["src"], + "references": [ + { "path": "../api-elasticsearch/tsconfig.build.json" }, + { "path": "../api-headless-cms/tsconfig.build.json" }, + { "path": "../api-headless-cms-ddb-es/tsconfig.build.json" }, + { "path": "../handler/tsconfig.build.json" }, + { "path": "../handler-aws/tsconfig.build.json" }, + { "path": "../tasks/tsconfig.build.json" }, + { "path": "../utils/tsconfig.build.json" }, + { "path": "../api/tsconfig.build.json" }, + { "path": "../api-i18n/tsconfig.build.json" }, + { "path": "../api-security/tsconfig.build.json" }, + { "path": "../api-tenancy/tsconfig.build.json" }, + { "path": "../api-wcp/tsconfig.build.json" }, + { "path": "../handler-graphql/tsconfig.build.json" }, + { "path": "../plugins/tsconfig.build.json" } + ], + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist", + "declarationDir": "./dist", + "paths": { "~/*": ["./src/*"], "~tests/*": ["./__tests__/*"] }, + "baseUrl": "." + } +} diff --git a/packages/api-headless-cms-es-tasks/tsconfig.json b/packages/api-headless-cms-es-tasks/tsconfig.json new file mode 100644 index 00000000000..bd40482808c --- /dev/null +++ b/packages/api-headless-cms-es-tasks/tsconfig.json @@ -0,0 +1,58 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src", "__tests__"], + "references": [ + { "path": "../api-elasticsearch" }, + { "path": "../api-headless-cms" }, + { "path": "../api-headless-cms-ddb-es" }, + { "path": "../handler" }, + { "path": "../handler-aws" }, + { "path": "../tasks" }, + { "path": "../utils" }, + { "path": "../api" }, + { "path": "../api-i18n" }, + { "path": "../api-security" }, + { "path": "../api-tenancy" }, + { "path": "../api-wcp" }, + { "path": "../handler-graphql" }, + { "path": "../plugins" } + ], + "compilerOptions": { + "rootDirs": ["./src", "./__tests__"], + "outDir": "./dist", + "declarationDir": "./dist", + "paths": { + "~/*": ["./src/*"], + "~tests/*": ["./__tests__/*"], + "@webiny/api-elasticsearch/*": ["../api-elasticsearch/src/*"], + "@webiny/api-elasticsearch": ["../api-elasticsearch/src"], + "@webiny/api-headless-cms/*": ["../api-headless-cms/src/*"], + "@webiny/api-headless-cms": ["../api-headless-cms/src"], + "@webiny/api-headless-cms-ddb-es/*": ["../api-headless-cms-ddb-es/src/*"], + "@webiny/api-headless-cms-ddb-es": ["../api-headless-cms-ddb-es/src"], + "@webiny/handler/*": ["../handler/src/*"], + "@webiny/handler": ["../handler/src"], + "@webiny/handler-aws/*": ["../handler-aws/src/*"], + "@webiny/handler-aws": ["../handler-aws/src"], + "@webiny/tasks/*": ["../tasks/src/*"], + "@webiny/tasks": ["../tasks/src"], + "@webiny/utils/*": ["../utils/src/*"], + "@webiny/utils": ["../utils/src"], + "@webiny/api/*": ["../api/src/*"], + "@webiny/api": ["../api/src"], + "@webiny/api-i18n/*": ["../api-i18n/src/*"], + "@webiny/api-i18n": ["../api-i18n/src"], + "@webiny/api-security/*": ["../api-security/src/*"], + "@webiny/api-security": ["../api-security/src"], + "@webiny/api-tenancy/*": ["../api-tenancy/src/*"], + "@webiny/api-tenancy": ["../api-tenancy/src"], + "@webiny/api-wcp/*": ["../api-wcp/src/*"], + "@webiny/api-wcp": ["../api-wcp/src"], + "@webiny/handler-graphql/*": ["../handler-graphql/src/*"], + "@webiny/handler-graphql": ["../handler-graphql/src"], + "@webiny/plugins/*": ["../plugins/src/*"], + "@webiny/plugins": ["../plugins/src"] + }, + "baseUrl": "." + } +} diff --git a/packages/api-headless-cms-es-tasks/webiny.config.js b/packages/api-headless-cms-es-tasks/webiny.config.js new file mode 100644 index 00000000000..6dff86766c9 --- /dev/null +++ b/packages/api-headless-cms-es-tasks/webiny.config.js @@ -0,0 +1,8 @@ +const { createWatchPackage, createBuildPackage } = require("@webiny/project-utils"); + +module.exports = { + commands: { + build: createBuildPackage({ cwd: __dirname }), + watch: createWatchPackage({ cwd: __dirname }) + } +}; diff --git a/packages/api-headless-cms/__tests__/storageOperations/entries.test.ts b/packages/api-headless-cms/__tests__/storageOperations/entries.test.ts index 19869e681d2..bfab26d276f 100644 --- a/packages/api-headless-cms/__tests__/storageOperations/entries.test.ts +++ b/packages/api-headless-cms/__tests__/storageOperations/entries.test.ts @@ -2,7 +2,7 @@ import { createPersonEntries, createPersonModel, deletePersonModel } from "./hel import { useGraphQLHandler } from "../testHelpers/useGraphQLHandler"; import { CmsContext } from "~/types"; -jest.setTimeout(60000); +jest.setTimeout(90000); describe("Entries storage operations", () => { const { storageOperations, plugins } = useGraphQLHandler({ @@ -34,7 +34,7 @@ describe("Entries storage operations", () => { it("getRevisions - should get revisions of all the entries", async () => { const personModel = createPersonModel(); - const amount = 102; + const amount = 45; const results = await createPersonEntries({ amount, storageOperations, @@ -115,7 +115,7 @@ describe("Entries storage operations", () => { it("getByIds - should get all entries by id list", async () => { const personModel = createPersonModel(); - const amount = 202; + const amount = 51; const results = await createPersonEntries({ amount, storageOperations, diff --git a/packages/api-headless-cms/src/types.ts b/packages/api-headless-cms/src/types.ts index ad290d7ecda..28a88320fc7 100644 --- a/packages/api-headless-cms/src/types.ts +++ b/packages/api-headless-cms/src/types.ts @@ -1776,8 +1776,10 @@ export interface CmsModelUpdateDirectParams { export interface CmsModelContext { /** * Get a single content model. + * + * @throws NotFoundError */ - getModel: (modelId: string) => Promise; + getModel: (modelId: string) => Promise; /** * Get all content models. */ diff --git a/packages/create-webiny-project/package.json b/packages/create-webiny-project/package.json index cd5165b16d2..91b1784b6f8 100644 --- a/packages/create-webiny-project/package.json +++ b/packages/create-webiny-project/package.json @@ -23,7 +23,7 @@ "load-json-file": "6.2.0", "node-fetch": "^2.6.1", "os": "0.1.1", - "p-retry": "^4.6.0", + "p-retry": "^4.6.2", "rimraf": "3.0.2", "semver": "^7.3.5", "uuid": "8.3.2", diff --git a/packages/handler-aws/src/index.ts b/packages/handler-aws/src/index.ts index 6e6e4f3f26a..678d117bf37 100644 --- a/packages/handler-aws/src/index.ts +++ b/packages/handler-aws/src/index.ts @@ -5,6 +5,8 @@ import "./sqs/register"; import "./eventBridge/register"; import "./sns/register"; +export * from "./utils"; + /** * API Gateway */ diff --git a/packages/handler-aws/src/utils/index.ts b/packages/handler-aws/src/utils/index.ts new file mode 100644 index 00000000000..74b6b0f97f3 --- /dev/null +++ b/packages/handler-aws/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from "./composedHandler"; +export * from "./timer"; diff --git a/packages/handler-aws/src/utils/timer/CustomTimer.ts b/packages/handler-aws/src/utils/timer/CustomTimer.ts new file mode 100644 index 00000000000..55f59105817 --- /dev/null +++ b/packages/handler-aws/src/utils/timer/CustomTimer.ts @@ -0,0 +1,14 @@ +const MAX_RUNNING_MINUTES = 14; +const MAX_RUNNING_MILLISECONDS = MAX_RUNNING_MINUTES * 60 * 1000; + +export class CustomTimer { + private readonly startTime: number; + + public constructor() { + this.startTime = Date.now(); + } + + public getRemainingMilliseconds(): number { + return this.startTime + MAX_RUNNING_MILLISECONDS - Date.now(); // 14 minutes + } +} diff --git a/packages/tasks/src/timer/Timer.ts b/packages/handler-aws/src/utils/timer/Timer.ts similarity index 63% rename from packages/tasks/src/timer/Timer.ts rename to packages/handler-aws/src/utils/timer/Timer.ts index 8603cd0c968..f77543cf3f3 100644 --- a/packages/tasks/src/timer/Timer.ts +++ b/packages/handler-aws/src/utils/timer/Timer.ts @@ -13,4 +13,12 @@ export class Timer implements ITimer { public getRemainingMilliseconds(): number { return this.cb(); } + + public getRemainingSeconds(): number { + const result = this.cb(); + if (result > 0) { + return Math.floor(result / 1000); + } + return 0; + } } diff --git a/packages/tasks/src/timer/abstractions/ITimer.ts b/packages/handler-aws/src/utils/timer/abstractions/ITimer.ts similarity index 58% rename from packages/tasks/src/timer/abstractions/ITimer.ts rename to packages/handler-aws/src/utils/timer/abstractions/ITimer.ts index 6bc13211380..5fbe93039f5 100644 --- a/packages/tasks/src/timer/abstractions/ITimer.ts +++ b/packages/handler-aws/src/utils/timer/abstractions/ITimer.ts @@ -3,4 +3,8 @@ export interface ITimer { * Return value must be in milliseconds. */ getRemainingMilliseconds(): number; + /** + * Return value must be in seconds. + */ + getRemainingSeconds(): number; } diff --git a/packages/tasks/src/timer/factory.ts b/packages/handler-aws/src/utils/timer/factory.ts similarity index 91% rename from packages/tasks/src/timer/factory.ts rename to packages/handler-aws/src/utils/timer/factory.ts index b6de1c94a43..c2034a1634d 100644 --- a/packages/tasks/src/timer/factory.ts +++ b/packages/handler-aws/src/utils/timer/factory.ts @@ -1,4 +1,4 @@ -import { ITimer } from "~/timer/abstractions/ITimer"; +import { ITimer } from "./abstractions/ITimer"; import { CustomTimer } from "./CustomTimer"; import { Context as LambdaContext } from "aws-lambda/handler"; import { Timer } from "./Timer"; diff --git a/packages/tasks/src/timer/index.ts b/packages/handler-aws/src/utils/timer/index.ts similarity index 100% rename from packages/tasks/src/timer/index.ts rename to packages/handler-aws/src/utils/timer/index.ts diff --git a/packages/migrations/package.json b/packages/migrations/package.json index 04e4e45a808..8805655d905 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -25,6 +25,7 @@ "directory": "dist" }, "devDependencies": { + "@types/execa": "^2.0.0", "@webiny/api-headless-cms": "0.0.0", "@webiny/api-headless-cms-ddb-es": "0.0.0", "@webiny/cli": "0.0.0", diff --git a/packages/migrations/src/migrations/5.39.0/001/utils/getNonNullableFieldsWithMissingValues.ts b/packages/migrations/src/migrations/5.39.0/001/utils/getNonNullableFieldsWithMissingValues.ts new file mode 100644 index 00000000000..9265ef492a5 --- /dev/null +++ b/packages/migrations/src/migrations/5.39.0/001/utils/getNonNullableFieldsWithMissingValues.ts @@ -0,0 +1,21 @@ +import { CmsEntry } from "~/migrations/5.39.0/001/types"; +import { + EntryMetaFieldName, + isNonNullableEntryMetaField, + pickEntryMetaFields +} from "@webiny/api-headless-cms/constants"; + +export const getNonNullableFieldsWithMissingValues = (entry: CmsEntry) => { + // Only `modifiedX` and `publishedX` fields are nullable. + const nonNullableMetaFields = pickEntryMetaFields(entry, isNonNullableEntryMetaField); + + const missingFields: EntryMetaFieldName[] = []; + for (const fieldName in nonNullableMetaFields) { + const value = nonNullableMetaFields[fieldName as EntryMetaFieldName]; + if (!value) { + missingFields.push(fieldName as EntryMetaFieldName); + } + } + + return missingFields; +}; diff --git a/packages/migrations/src/migrations/5.39.0/001/utils/isMigratedEntry.ts b/packages/migrations/src/migrations/5.39.0/001/utils/isMigratedEntry.ts index 7cdd89245e7..961b8011c53 100644 --- a/packages/migrations/src/migrations/5.39.0/001/utils/isMigratedEntry.ts +++ b/packages/migrations/src/migrations/5.39.0/001/utils/isMigratedEntry.ts @@ -1,5 +1,5 @@ import { CmsEntry } from "../types"; export const isMigratedEntry = (entry: CmsEntry) => { - return "revisionCreatedOn" in entry; + return "revisionCreatedOn" in entry && entry.revisionCreatedOn; }; diff --git a/packages/project-utils/testing/tasks/index.ts b/packages/project-utils/testing/tasks/index.ts index bd2b893ccbf..8b7cf82e661 100644 --- a/packages/project-utils/testing/tasks/index.ts +++ b/packages/project-utils/testing/tasks/index.ts @@ -1 +1,2 @@ export * from "./runner"; +export * from "./mockTaskTriggerTransportPlugin"; diff --git a/packages/project-utils/testing/tasks/mockTaskTriggerTransportPlugin.ts b/packages/project-utils/testing/tasks/mockTaskTriggerTransportPlugin.ts new file mode 100644 index 00000000000..6665bd4e49d --- /dev/null +++ b/packages/project-utils/testing/tasks/mockTaskTriggerTransportPlugin.ts @@ -0,0 +1,24 @@ +import { + ITaskTriggerTransport, + TaskTriggerTransportPlugin +} from "@webiny/tasks/plugins/TaskTriggerTransportPlugin"; + +class MockTaskTriggerTransportPlugin extends TaskTriggerTransportPlugin { + public override name = "tasks.mockTaskTriggerTransport"; + + override createTransport(): ITaskTriggerTransport { + return { + async send() { + return { + Entries: [], + $metadata: {}, + FailedEntryCount: 0 + }; + } + }; + } +} + +export const createMockTaskTriggerTransportPlugin = () => { + return [new MockTaskTriggerTransportPlugin()]; +}; diff --git a/packages/project-utils/testing/tasks/runner.ts b/packages/project-utils/testing/tasks/runner.ts index cee4ea8aede..614f5c480b8 100644 --- a/packages/project-utils/testing/tasks/runner.ts +++ b/packages/project-utils/testing/tasks/runner.ts @@ -6,8 +6,9 @@ import { ITaskResponseDoneResultOutput } from "@webiny/tasks/types"; import { TaskRunner } from "@webiny/tasks/runner"; -import { timerFactory } from "@webiny/tasks/timer"; +import { timerFactory } from "@webiny/handler-aws/utils"; import { TaskEventValidation } from "@webiny/tasks/runner/TaskEventValidation"; +import { createMockTaskTriggerTransportPlugin } from "./mockTaskTriggerTransportPlugin"; export interface CreateRunnerParams< C extends Context = Context, @@ -26,6 +27,7 @@ export const createRunner = < >( params: CreateRunnerParams ) => { + params.context.plugins.register(createMockTaskTriggerTransportPlugin()); const runner = new TaskRunner( params.context, timerFactory({ diff --git a/packages/pulumi-aws/src/apps/core/CoreElasticSearch.ts b/packages/pulumi-aws/src/apps/core/CoreElasticSearch.ts index 576b7c0b749..751419bfd48 100644 --- a/packages/pulumi-aws/src/apps/core/CoreElasticSearch.ts +++ b/packages/pulumi-aws/src/apps/core/CoreElasticSearch.ts @@ -215,8 +215,8 @@ export const ElasticSearch = createAppModule({ role: role.output.arn, runtime: LAMBDA_RUNTIME, handler: "handler.handler", - timeout: 600, - memorySize: 512, + timeout: 900, + memorySize: 1024, environment: { variables: { DEBUG: String(process.env.DEBUG), @@ -245,7 +245,7 @@ export const ElasticSearch = createAppModule({ functionName: lambda.output.arn, startingPosition: "LATEST", maximumRetryAttempts: 3, - batchSize: 200, + batchSize: 50, maximumBatchingWindowInSeconds: 1 } }); @@ -254,7 +254,8 @@ export const ElasticSearch = createAppModule({ elasticsearchDomainArn: domain.output.arn, elasticsearchDomainEndpoint: domain.output.endpoint, elasticsearchDynamodbTableArn: table.output.arn, - elasticsearchDynamodbTableName: table.output.name + elasticsearchDynamodbTableName: table.output.name, + elasticsearchDynamoToElasticLambdaName: lambda.output.name }); return { @@ -286,6 +287,7 @@ function getDynamoDbToElasticLambdaPolicy( Sid: "PermissionForES", Effect: "Allow", Action: [ + "es:ESHttpGet", "es:ESHttpDelete", "es:ESHttpPatch", "es:ESHttpPost", diff --git a/packages/pulumi-aws/src/apps/core/CoreOpenSearch.ts b/packages/pulumi-aws/src/apps/core/CoreOpenSearch.ts index fd84e97b01d..6eb5d402c94 100644 --- a/packages/pulumi-aws/src/apps/core/CoreOpenSearch.ts +++ b/packages/pulumi-aws/src/apps/core/CoreOpenSearch.ts @@ -229,8 +229,8 @@ export const OpenSearch = createAppModule({ role: role.output.arn, runtime: LAMBDA_RUNTIME, handler: "handler.handler", - timeout: 600, - memorySize: 512, + timeout: 900, + memorySize: 1024, environment: { variables: { DEBUG: String(process.env.DEBUG), @@ -259,7 +259,7 @@ export const OpenSearch = createAppModule({ functionName: lambda.output.arn, startingPosition: "LATEST", maximumRetryAttempts: 3, - batchSize: 200, + batchSize: 50, maximumBatchingWindowInSeconds: 1 } }); @@ -300,6 +300,7 @@ function getDynamoDbToElasticLambdaPolicy( Sid: "PermissionForES", Effect: "Allow", Action: [ + "es:ESHttpGet", "es:ESHttpDelete", "es:ESHttpPatch", "es:ESHttpPost", diff --git a/packages/tasks/__tests__/runner/taskRunnerAbort.test.ts b/packages/tasks/__tests__/runner/taskRunnerAbort.test.ts index ff27e72fc4c..de66e4ad863 100644 --- a/packages/tasks/__tests__/runner/taskRunnerAbort.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerAbort.test.ts @@ -3,7 +3,7 @@ import { createMockEvent } from "~tests/mocks"; import { ResponseAbortedResult } from "~/response"; import { createLiveContextFactory } from "~tests/live"; import { taskDefinition } from "~tests/runner/taskDefinition"; -import { timerFactory } from "~/timer"; +import { timerFactory } from "@webiny/handler-aws/utils"; import { TaskEventValidation } from "~/runner/TaskEventValidation"; describe("task runner abort", () => { diff --git a/packages/tasks/__tests__/runner/taskRunnerCreate.test.ts b/packages/tasks/__tests__/runner/taskRunnerCreate.test.ts index 8b9296eb1fe..cb2da41b3d1 100644 --- a/packages/tasks/__tests__/runner/taskRunnerCreate.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerCreate.test.ts @@ -1,7 +1,7 @@ import { TaskRunner } from "~/runner"; import { createLiveContextFactory } from "~tests/live"; import { taskDefinition } from "~tests/runner/taskDefinition"; -import { timerFactory } from "~/timer"; +import { timerFactory } from "@webiny/handler-aws/utils"; import { TaskEventValidation } from "~/runner/TaskEventValidation"; describe("task runner create", () => { diff --git a/packages/tasks/__tests__/runner/taskRunnerErrorFailedState.test.ts b/packages/tasks/__tests__/runner/taskRunnerErrorFailedState.test.ts index d25d53316cb..cc91343a758 100644 --- a/packages/tasks/__tests__/runner/taskRunnerErrorFailedState.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerErrorFailedState.test.ts @@ -4,7 +4,7 @@ import { ResponseErrorResult } from "~/response"; import { TaskDataStatus } from "~/types"; import { createLiveContextFactory } from "~tests/live"; import { taskDefinition } from "~tests/runner/taskDefinition"; -import { timerFactory } from "~/timer"; +import { timerFactory } from "@webiny/handler-aws/utils"; import { TaskEventValidation } from "~/runner/TaskEventValidation"; describe("task runner error in failed state", () => { diff --git a/packages/tasks/__tests__/runner/taskRunnerErrorSuccessState.test.ts b/packages/tasks/__tests__/runner/taskRunnerErrorSuccessState.test.ts index 80cfa60ca4a..9849514144f 100644 --- a/packages/tasks/__tests__/runner/taskRunnerErrorSuccessState.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerErrorSuccessState.test.ts @@ -4,7 +4,7 @@ import { ResponseErrorResult } from "~/response"; import { TaskDataStatus } from "~/types"; import { createLiveContextFactory } from "~tests/live"; import { taskDefinition } from "~tests/runner/taskDefinition"; -import { timerFactory } from "~/timer"; +import { timerFactory } from "@webiny/handler-aws/utils"; import { TaskEventValidation } from "~/runner/TaskEventValidation"; describe("task runner error in success state", () => { diff --git a/packages/tasks/__tests__/runner/taskRunnerSuccess.test.ts b/packages/tasks/__tests__/runner/taskRunnerSuccess.test.ts index 6955d663338..2704d4325d4 100644 --- a/packages/tasks/__tests__/runner/taskRunnerSuccess.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerSuccess.test.ts @@ -5,7 +5,7 @@ import { TaskDataStatus } from "~/types"; import { createLiveContextFactory } from "~tests/live"; import { taskDefinition } from "~tests/runner/taskDefinition"; import { TaskEventValidation } from "~/runner/TaskEventValidation"; -import { timerFactory } from "~/timer"; +import { timerFactory } from "@webiny/handler-aws/utils"; describe("task runner trigger and end successfully", () => { const contextFactory = createLiveContextFactory({ diff --git a/packages/tasks/__tests__/runner/taskRunnerTaskNotFound.test.ts b/packages/tasks/__tests__/runner/taskRunnerTaskNotFound.test.ts index e943b16c746..bcc5da7b309 100644 --- a/packages/tasks/__tests__/runner/taskRunnerTaskNotFound.test.ts +++ b/packages/tasks/__tests__/runner/taskRunnerTaskNotFound.test.ts @@ -3,7 +3,7 @@ import { createMockEvent } from "~tests/mocks"; import { ResponseErrorResult } from "~/response"; import { createLiveContextFactory } from "~tests/live"; import { taskDefinition } from "~tests/runner/taskDefinition"; -import { timerFactory } from "~/timer"; +import { timerFactory } from "@webiny/handler-aws/utils"; import { TaskEventValidation } from "~/runner/TaskEventValidation"; describe("task runner task not found", () => { diff --git a/packages/tasks/src/crud/EventBridgeEventTransport.ts b/packages/tasks/src/crud/transport/EventBridgeEventTransportPlugin.ts similarity index 56% rename from packages/tasks/src/crud/EventBridgeEventTransport.ts rename to packages/tasks/src/crud/transport/EventBridgeEventTransportPlugin.ts index bf9777ac952..76defe367c5 100644 --- a/packages/tasks/src/crud/EventBridgeEventTransport.ts +++ b/packages/tasks/src/crud/transport/EventBridgeEventTransportPlugin.ts @@ -1,31 +1,26 @@ -import WebinyError from "@webiny/error"; import { - EventBridgeClient, - PutEventsCommand, - PutEventsCommandOutput -} from "@webiny/aws-sdk/client-eventbridge"; -import { ITask, ITaskConfig } from "~/types"; -import { ITaskEventInput } from "~/handler/types"; + ITaskTriggerTransport, + ITaskTriggerTransportPluginParams, + PutEventsCommandOutput, + TaskTriggerTransportPlugin +} from "~/plugins"; +import { Context, ITask, ITaskConfig, ITaskEventInput } from "~/types"; +import { EventBridgeClient, PutEventsCommand } from "@webiny/aws-sdk/client-eventbridge"; +import { WebinyError } from "@webiny/error"; -export { PutEventsCommandOutput }; - -export interface IEventBridgeEventTransportParams { - config: ITaskConfig; - getTenant: () => string; - getLocale: () => string; -} - -export class EventBridgeEventTransport { +class EventBridgeEventTransport implements ITaskTriggerTransport { + protected readonly context: Context; + protected readonly config: ITaskConfig; + protected readonly getTenant: () => string; + protected readonly getLocale: () => string; private readonly client: EventBridgeClient; - private readonly eventBusName: string; - private readonly getTenant: () => string; - private readonly getLocale: () => string; - public constructor(params: IEventBridgeEventTransportParams) { + public constructor(params: ITaskTriggerTransportPluginParams) { this.client = new EventBridgeClient({ region: process.env.AWS_REGION }); - this.eventBusName = params.config.eventBusName; + this.context = params.context; + this.config = params.config; this.getTenant = params.getTenant; this.getLocale = params.getLocale; } @@ -50,7 +45,7 @@ export class EventBridgeEventTransport { Entries: [ { Source: "webiny-api-tasks", - EventBusName: this.eventBusName, + EventBusName: this.config.eventBusName, DetailType: "WebinyBackgroundTask", Detail: JSON.stringify(event) } @@ -70,3 +65,10 @@ export class EventBridgeEventTransport { } } } + +export class EventBridgeEventTransportPlugin extends TaskTriggerTransportPlugin { + public override name = "task.eventBridgeEventTransport"; + public createTransport(params: ITaskTriggerTransportPluginParams): ITaskTriggerTransport { + return new EventBridgeEventTransport(params); + } +} diff --git a/packages/tasks/src/crud/trigger.tasks.ts b/packages/tasks/src/crud/trigger.tasks.ts index 77c28be5ff5..45e36ee60db 100644 --- a/packages/tasks/src/crud/trigger.tasks.ts +++ b/packages/tasks/src/crud/trigger.tasks.ts @@ -10,10 +10,12 @@ import { ITaskLogItemType, ITasksContextTriggerObject, ITaskTriggerParams, + PutEventsCommandOutput, TaskDataStatus } from "~/types"; import { NotFoundError } from "@webiny/handler-graphql"; -import { EventBridgeEventTransport, PutEventsCommandOutput } from "./EventBridgeEventTransport"; +import { createTransport } from "~/transport/createTransport"; +import { EventBridgeEventTransportPlugin } from "~/crud/transport/EventBridgeEventTransportPlugin"; const MAX_DELAY_DAYS = 355; const MAX_DELAY_SECONDS = MAX_DELAY_DAYS * 24 * 60 * 60; @@ -43,16 +45,11 @@ export const createTriggerTasksCrud = ( context: Context, config: ITaskConfig ): ITasksContextTriggerObject => { - const getTenant = (): string => { - return context.tenancy.getCurrentTenant().id; - }; - const getLocale = (): string => { - return context.cms.getLocale().code; - }; - const eventBridgeEventTransport = new EventBridgeEventTransport({ - config, - getTenant, - getLocale + context.plugins.register(new EventBridgeEventTransportPlugin()); + + const transport = createTransport({ + context, + config }); return { @@ -85,7 +82,7 @@ export const createTriggerTasksCrud = ( let event: PutEventsCommandOutput | null = null; try { - event = await eventBridgeEventTransport.send(task, delay); + event = await transport.send(task, delay); if (!event) { throw new WebinyError( diff --git a/packages/tasks/src/handler/index.ts b/packages/tasks/src/handler/index.ts index 8cfb97b8c2f..ffb26daade9 100644 --- a/packages/tasks/src/handler/index.ts +++ b/packages/tasks/src/handler/index.ts @@ -8,7 +8,7 @@ import { Context, TaskResponseStatus } from "~/types"; import { ITaskRawEvent } from "~/handler/types"; import { TaskRunner } from "~/runner"; import WebinyError from "@webiny/error"; -import { timerFactory } from "~/timer"; +import { timerFactory } from "@webiny/handler-aws/utils"; import { TaskEventValidation } from "~/runner/TaskEventValidation"; export interface HandlerCallable { diff --git a/packages/tasks/src/plugins/TaskTriggerTransportPlugin.ts b/packages/tasks/src/plugins/TaskTriggerTransportPlugin.ts new file mode 100644 index 00000000000..33ecbbc2923 --- /dev/null +++ b/packages/tasks/src/plugins/TaskTriggerTransportPlugin.ts @@ -0,0 +1,24 @@ +import { Plugin } from "@webiny/plugins"; +import { Context, ITask, ITaskConfig } from "~/types"; +import { PutEventsCommandOutput } from "@webiny/aws-sdk/client-eventbridge"; + +export { PutEventsCommandOutput }; + +export interface ITaskTriggerTransportPluginParams { + context: Context; + config: ITaskConfig; + getTenant(): string; + getLocale(): string; +} + +export interface ITaskTriggerTransport { + send(task: Pick, delay: number): Promise; +} + +export abstract class TaskTriggerTransportPlugin extends Plugin { + public static override readonly type: string = "tasks.taskTriggerTransport"; + + public abstract createTransport( + params: ITaskTriggerTransportPluginParams + ): ITaskTriggerTransport; +} diff --git a/packages/tasks/src/plugins/index.ts b/packages/tasks/src/plugins/index.ts new file mode 100644 index 00000000000..bcd15a83e5a --- /dev/null +++ b/packages/tasks/src/plugins/index.ts @@ -0,0 +1 @@ +export * from "./TaskTriggerTransportPlugin"; diff --git a/packages/tasks/src/runner/TaskControl.ts b/packages/tasks/src/runner/TaskControl.ts index 1590739b972..ef8241c1a64 100644 --- a/packages/tasks/src/runner/TaskControl.ts +++ b/packages/tasks/src/runner/TaskControl.ts @@ -111,6 +111,8 @@ export class TaskControl implements ITaskControl { } try { + this.context.security.setIdentity(task.createdBy); + const result = await manager.run(definition); await this.runEvents(result, definition, task); diff --git a/packages/tasks/src/runner/TaskRunner.ts b/packages/tasks/src/runner/TaskRunner.ts index 12092ef7ebc..00446353e81 100644 --- a/packages/tasks/src/runner/TaskRunner.ts +++ b/packages/tasks/src/runner/TaskRunner.ts @@ -1,11 +1,11 @@ import { ITaskEvent, ITaskRawEvent } from "~/handler/types"; import { ITaskEventValidation, ITaskRunner } from "./abstractions"; import { Context } from "~/types"; -import { Response } from "~/response"; +import { Response, ResponseErrorResult } from "~/response"; import { TaskControl } from "./TaskControl"; import { IResponseResult } from "~/response/abstractions"; import { getErrorProperties } from "~/utils/getErrorProperties"; -import { ITimer } from "~/timer"; +import { ITimer } from "@webiny/handler-aws/utils"; const transformMinutesIntoMilliseconds = (minutes: number) => { return minutes * 60000; @@ -67,8 +67,15 @@ export class TaskRunner implements ITaskRunner { const control = new TaskControl(this, response, this.context); try { - return await control.run(event); + const result = await control.run(event); + if (result instanceof ResponseErrorResult === false) { + return result; + } + console.error(result); + return result; } catch (ex) { + console.error(`Failed to execute task "${event.webinyTaskId}".`); + console.error(ex); return response.error({ error: getErrorProperties(ex) }); diff --git a/packages/tasks/src/timer/CustomTimer.ts b/packages/tasks/src/timer/CustomTimer.ts deleted file mode 100644 index 00d12473475..00000000000 --- a/packages/tasks/src/timer/CustomTimer.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ITimer } from "~/timer/abstractions/ITimer"; - -const MAX_RUNNING_MINUTES = 14; -const MAX_RUNNING_MILLISECONDS = MAX_RUNNING_MINUTES * 60 * 1000; - -export class CustomTimer implements ITimer { - private readonly startTime: number; - - public constructor() { - this.startTime = Date.now(); - } - - public getRemainingMilliseconds(): number { - const result = this.startTime + MAX_RUNNING_MILLISECONDS - Date.now(); // 14 minutes - console.log( - "It looks like the Lambda Context getRemainingTimeInMillis does not exist. Mocked remaining time:", - result - ); - return result; - } -} diff --git a/packages/tasks/src/transport/createTransport.ts b/packages/tasks/src/transport/createTransport.ts new file mode 100644 index 00000000000..f7be33941d3 --- /dev/null +++ b/packages/tasks/src/transport/createTransport.ts @@ -0,0 +1,34 @@ +import { Context, ITaskConfig } from "~/types"; +import { ITaskTriggerTransport, TaskTriggerTransportPlugin } from "~/plugins"; +import { WebinyError } from "@webiny/error"; + +export interface ICreateTransport { + context: Context; + config: ITaskConfig; +} + +export const createTransport = (params: ICreateTransport): ITaskTriggerTransport => { + const plugins = params.context.plugins.byType( + TaskTriggerTransportPlugin.type + ); + const [plugin] = plugins; + if (!plugin) { + throw new WebinyError("Missing TaskTriggerTransportPlugin.", "PLUGIN_ERROR", { + type: TaskTriggerTransportPlugin.type + }); + } + + const getTenant = (): string => { + return params.context.tenancy.getCurrentTenant().id; + }; + const getLocale = (): string => { + return params.context.cms.getLocale().code; + }; + + return plugin.createTransport({ + context: params.context, + config: params.config, + getTenant, + getLocale + }); +}; diff --git a/packages/tasks/src/utils/getObjectProperties.ts b/packages/tasks/src/utils/getObjectProperties.ts index 5e080afcea6..9e5a55900ac 100644 --- a/packages/tasks/src/utils/getObjectProperties.ts +++ b/packages/tasks/src/utils/getObjectProperties.ts @@ -10,6 +10,9 @@ export const getObjectProperties = (input: unknown): T => { return {} as unknown as T; } return Object.getOwnPropertyNames(input).reduce((acc, key) => { + if (key === "stack") { + return acc; + } acc[key as keyof T] = (input as unknown as T)[key as keyof T]; return acc; }, {} as T) as unknown as T; diff --git a/yarn.lock b/yarn.lock index 6ccba9a0e15..3bd1858232c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6644,6 +6644,13 @@ __metadata: languageName: node linkType: hard +"@faker-js/faker@npm:^8.4.1": + version: 8.4.1 + resolution: "@faker-js/faker@npm:8.4.1" + checksum: d802d531f8929562715adc279cfec763c9a4bc596ec67b0ce43fd0ae61b285d2b0eec6f1f4aa852452a63721a842fe7e81926dce7bd92acca94b01e2a1f55f5a + languageName: node + linkType: hard + "@fastify/accept-negotiator@npm:^1.0.0": version: 1.1.0 resolution: "@fastify/accept-negotiator@npm:1.1.0" @@ -6813,46 +6820,27 @@ __metadata: languageName: node linkType: hard -"@grpc/grpc-js@npm:1.9.6": - version: 1.9.6 - resolution: "@grpc/grpc-js@npm:1.9.6" +"@grpc/grpc-js@npm:^1.10.1, @grpc/grpc-js@npm:^1.2.7": + version: 1.10.8 + resolution: "@grpc/grpc-js@npm:1.10.8" dependencies: - "@grpc/proto-loader": ^0.7.8 - "@types/node": ">=12.12.47" - checksum: c02981af11e9749bb8f9a71f5f7e125740da9e6addb13b65d006d41d4d7a80d94b6daa45426c6832a2accfd6f9a925d45a4660a88bd908684446ffaf4fe76c68 + "@grpc/proto-loader": ^0.7.13 + "@js-sdsl/ordered-map": ^4.4.2 + checksum: 498d144016eac26fc069bc57d649bf4776ae6bd1a24e62823a8b07b7d39a4414caa72a799f8287278b79e11ec4ecf989dbac01518c3981d8f947db15916c6727 languageName: node linkType: hard -"@grpc/grpc-js@npm:^1.2.7": - version: 1.9.12 - resolution: "@grpc/grpc-js@npm:1.9.12" - dependencies: - "@grpc/proto-loader": ^0.7.8 - "@types/node": ">=12.12.47" - checksum: 1788bdc7256b003261d5cfd6858fe21c06043742a5f512b9855df66998239d645e6eda1612d17dbffa19a7fcce950cd2ff661e9818ce67ca36198501020da06d - languageName: node - linkType: hard - -"@grpc/grpc-js@npm:~1.3.8": - version: 1.3.8 - resolution: "@grpc/grpc-js@npm:1.3.8" - dependencies: - "@types/node": ">=12.12.47" - checksum: 12df94227d99ce410dd146f31a27dc34b5dbcbbea6190fd9604ace8d902ce5614272054cead9ddf0ed6db4562ea5bdccf593d71905a23ab1125686d2125d4cd5 - languageName: node - linkType: hard - -"@grpc/proto-loader@npm:^0.7.8": - version: 0.7.10 - resolution: "@grpc/proto-loader@npm:0.7.10" +"@grpc/proto-loader@npm:^0.7.13": + version: 0.7.13 + resolution: "@grpc/proto-loader@npm:0.7.13" dependencies: lodash.camelcase: ^4.3.0 long: ^5.0.0 - protobufjs: ^7.2.4 + protobufjs: ^7.2.5 yargs: ^17.7.2 bin: proto-loader-gen-types: build/bin/proto-loader-gen-types.js - checksum: 4987e23b57942c2363b6a6a106e63efae636666cefa348778dfafef2ff72da7343c8587667521cb1d52482827bcd001dd535bdc27065110af56d9c7c176334c9 + checksum: 399c1b8a4627f93dc31660d9636ea6bf58be5675cc7581e3df56a249369e5be02c6cd0d642c5332b0d5673bc8621619bc06fb045aa3e8f57383737b5d35930dc languageName: node linkType: hard @@ -6917,6 +6905,13 @@ __metadata: languageName: node linkType: hard +"@isaacs/string-locale-compare@npm:^1.1.0": + version: 1.1.0 + resolution: "@isaacs/string-locale-compare@npm:1.1.0" + checksum: 7287da5d11497b82c542d3c2abe534808015be4f4883e71c26853277b5456f6bbe4108535db847a29f385ad6dc9318ffb0f55ee79bb5f39993233d7dccf8751d + languageName: node + linkType: hard + "@istanbuljs/load-nyc-config@npm:^1.0.0": version: 1.1.0 resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" @@ -7260,6 +7255,13 @@ __metadata: languageName: node linkType: hard +"@js-sdsl/ordered-map@npm:^4.4.2": + version: 4.4.2 + resolution: "@js-sdsl/ordered-map@npm:4.4.2" + checksum: a927ae4ff8565ecb75355cc6886a4f8fadbf2af1268143c96c0cce3ba01261d241c3f4ba77f21f3f017a00f91dfe9e0673e95f830255945c80a0e96c6d30508a + languageName: node + linkType: hard + "@lerna/add@npm:3.21.0": version: 3.21.0 resolution: "@lerna/add@npm:3.21.0" @@ -9125,6 +9127,64 @@ __metadata: languageName: node linkType: hard +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" + dependencies: + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^10.0.1 + socks-proxy-agent: ^8.0.3 + checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 + languageName: node + linkType: hard + +"@npmcli/arborist@npm:^7.3.1": + version: 7.5.2 + resolution: "@npmcli/arborist@npm:7.5.2" + dependencies: + "@isaacs/string-locale-compare": ^1.1.0 + "@npmcli/fs": ^3.1.1 + "@npmcli/installed-package-contents": ^2.1.0 + "@npmcli/map-workspaces": ^3.0.2 + "@npmcli/metavuln-calculator": ^7.1.1 + "@npmcli/name-from-folder": ^2.0.0 + "@npmcli/node-gyp": ^3.0.0 + "@npmcli/package-json": ^5.1.0 + "@npmcli/query": ^3.1.0 + "@npmcli/redact": ^2.0.0 + "@npmcli/run-script": ^8.1.0 + bin-links: ^4.0.4 + cacache: ^18.0.3 + common-ancestor-path: ^1.0.1 + hosted-git-info: ^7.0.2 + json-parse-even-better-errors: ^3.0.2 + json-stringify-nice: ^1.1.4 + lru-cache: ^10.2.2 + minimatch: ^9.0.4 + nopt: ^7.2.1 + npm-install-checks: ^6.2.0 + npm-package-arg: ^11.0.2 + npm-pick-manifest: ^9.0.1 + npm-registry-fetch: ^17.0.1 + pacote: ^18.0.6 + parse-conflict-json: ^3.0.0 + proc-log: ^4.2.0 + proggy: ^2.0.0 + promise-all-reject-late: ^1.0.0 + promise-call-limit: ^3.0.1 + read-package-json-fast: ^3.0.2 + semver: ^7.3.7 + ssri: ^10.0.6 + treeverse: ^3.0.0 + walk-up-path: ^3.0.1 + bin: + arborist: bin/index.js + checksum: 92686b9e947d90ff984afa447cc12977df0f374daa88b2e9a562a8cd2cec23b70883031533cdd898749ddf45345ded384af79843993ccc1ce2dd290b9f9fe692 + languageName: node + linkType: hard + "@npmcli/fs@npm:^2.1.0": version: 2.1.2 resolution: "@npmcli/fs@npm:2.1.2" @@ -9135,6 +9195,68 @@ __metadata: languageName: node linkType: hard +"@npmcli/fs@npm:^3.1.0, @npmcli/fs@npm:^3.1.1": + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" + dependencies: + semver: ^7.3.5 + checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 + languageName: node + linkType: hard + +"@npmcli/git@npm:^5.0.0": + version: 5.0.7 + resolution: "@npmcli/git@npm:5.0.7" + dependencies: + "@npmcli/promise-spawn": ^7.0.0 + lru-cache: ^10.0.1 + npm-pick-manifest: ^9.0.0 + proc-log: ^4.0.0 + promise-inflight: ^1.0.1 + promise-retry: ^2.0.1 + semver: ^7.3.5 + which: ^4.0.0 + checksum: a83d4e032ca71671615de532b2d62c6bcf6342819a4a25da650ac66f8b5803357e629ad9dacada307891d9428bc5e777cca0b8cbc3ee76b66bbddce3851c30f5 + languageName: node + linkType: hard + +"@npmcli/installed-package-contents@npm:^2.0.1, @npmcli/installed-package-contents@npm:^2.1.0": + version: 2.1.0 + resolution: "@npmcli/installed-package-contents@npm:2.1.0" + dependencies: + npm-bundled: ^3.0.0 + npm-normalize-package-bin: ^3.0.0 + bin: + installed-package-contents: bin/index.js + checksum: d0f307e0c971a4ffaea44d4f38d53b57e19222413f338bab26d4321c4a7b9098318d74719dd1f8747a6de0575ac0ba29aeb388edf6599ac8299506947f53ffb6 + languageName: node + linkType: hard + +"@npmcli/map-workspaces@npm:^3.0.2": + version: 3.0.6 + resolution: "@npmcli/map-workspaces@npm:3.0.6" + dependencies: + "@npmcli/name-from-folder": ^2.0.0 + glob: ^10.2.2 + minimatch: ^9.0.0 + read-package-json-fast: ^3.0.0 + checksum: bdb09ee1d044bb9b2857d9e2d7ca82f40783a8549b5a7e150e25f874ee354cdbc8109ad7c3df42ec412f7057d95baa05920c4d361c868a93a42146b8e4390d3d + languageName: node + linkType: hard + +"@npmcli/metavuln-calculator@npm:^7.1.1": + version: 7.1.1 + resolution: "@npmcli/metavuln-calculator@npm:7.1.1" + dependencies: + cacache: ^18.0.0 + json-parse-even-better-errors: ^3.0.0 + pacote: ^18.0.0 + proc-log: ^4.1.0 + semver: ^7.3.5 + checksum: c6297e40f914100c4effb574c55ef95cbf15d0c28e73e39f29de317b12a3d3d82571f8aca3f7635cc4c8e97bff35942c71c59a79e1a8abc93475744e61abc399 + languageName: node + linkType: hard + "@npmcli/move-file@npm:^2.0.0": version: 2.0.1 resolution: "@npmcli/move-file@npm:2.0.1" @@ -9145,6 +9267,74 @@ __metadata: languageName: node linkType: hard +"@npmcli/name-from-folder@npm:^2.0.0": + version: 2.0.0 + resolution: "@npmcli/name-from-folder@npm:2.0.0" + checksum: fb3ef891aa57315fb6171866847f298577c8bda98a028e93e458048477133e142b4eb45ce9f3b80454f7c257612cb01754ee782d608507698dd712164436f5bd + languageName: node + linkType: hard + +"@npmcli/node-gyp@npm:^3.0.0": + version: 3.0.0 + resolution: "@npmcli/node-gyp@npm:3.0.0" + checksum: fe3802b813eecb4ade7ad77c9396cb56721664275faab027e3bd8a5e15adfbbe39e2ecc19f7885feb3cfa009b96632741cc81caf7850ba74440c6a2eee7b4ffc + languageName: node + linkType: hard + +"@npmcli/package-json@npm:^5.0.0, @npmcli/package-json@npm:^5.1.0": + version: 5.1.0 + resolution: "@npmcli/package-json@npm:5.1.0" + dependencies: + "@npmcli/git": ^5.0.0 + glob: ^10.2.2 + hosted-git-info: ^7.0.0 + json-parse-even-better-errors: ^3.0.0 + normalize-package-data: ^6.0.0 + proc-log: ^4.0.0 + semver: ^7.5.3 + checksum: 1482c737aebf318133cff7ea671662eb4438ea82920205d00ff1f1c47ca311e1b48bb157d64e2e24eb76cfc9a0137e8b77b98b50f7a2a23c7db249c7b50dcf88 + languageName: node + linkType: hard + +"@npmcli/promise-spawn@npm:^7.0.0": + version: 7.0.2 + resolution: "@npmcli/promise-spawn@npm:7.0.2" + dependencies: + which: ^4.0.0 + checksum: 728256506ecbafb53064036e28c2815b9a9e9190ba7a48eec77b011a9f8a899515a6d96760dbde960bc1d3e5b828fd0b0b7fe3b512efaf049d299bacbd732fda + languageName: node + linkType: hard + +"@npmcli/query@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/query@npm:3.1.0" + dependencies: + postcss-selector-parser: ^6.0.10 + checksum: 33c018bfcc6d64593e7969847d0442beab4e8a42b6c9f932237c9fd135c95ab55de5c4b5d5d66302dd9fc3c748bc4ead780d3595e5d586fedf9859ed6b5f2744 + languageName: node + linkType: hard + +"@npmcli/redact@npm:^2.0.0": + version: 2.0.0 + resolution: "@npmcli/redact@npm:2.0.0" + checksum: 7ed760ab0f30c7199d1176b35619e226f6810d3606f75870551486493f4ba388f64dcf2fbcfb0ab2059ea8ed36e6733ebb9c92f883116c45b2e3fd80da7d7106 + languageName: node + linkType: hard + +"@npmcli/run-script@npm:^8.0.0, @npmcli/run-script@npm:^8.1.0": + version: 8.1.0 + resolution: "@npmcli/run-script@npm:8.1.0" + dependencies: + "@npmcli/node-gyp": ^3.0.0 + "@npmcli/package-json": ^5.0.0 + "@npmcli/promise-spawn": ^7.0.0 + node-gyp: ^10.0.0 + proc-log: ^4.0.0 + which: ^4.0.0 + checksum: 21adfb308b9064041d6d2f7f0d53924be0e1466d558de1c9802fab9eb84850bd8e04fdd5695924f331e1a36565461500d912e187909f91c03188cc763a106986 + languageName: node + linkType: hard + "@octokit/app@npm:^12.0.4": version: 12.0.7 resolution: "@octokit/app@npm:12.0.7" @@ -10184,43 +10374,13 @@ __metadata: languageName: node linkType: hard -"@pulumi/pulumi@npm:^3.0.0": - version: 3.54.0 - resolution: "@pulumi/pulumi@npm:3.54.0" - dependencies: - "@grpc/grpc-js": ~1.3.8 - "@logdna/tail-file": ^2.0.6 - "@opentelemetry/api": ^1.2.0 - "@opentelemetry/exporter-zipkin": ^1.6.0 - "@opentelemetry/instrumentation-grpc": ^0.32.0 - "@opentelemetry/resources": ^1.6.0 - "@opentelemetry/sdk-trace-base": ^1.6.0 - "@opentelemetry/sdk-trace-node": ^1.6.0 - "@opentelemetry/semantic-conventions": ^1.6.0 - "@pulumi/query": ^0.3.0 - execa: ^5.1.0 - google-protobuf: ^3.5.0 - ini: ^2.0.0 - js-yaml: ^3.14.0 - minimist: ^1.2.6 - normalize-package-data: ^2.4.0 - read-package-tree: ^5.3.1 - require-from-string: ^2.0.1 - semver: ^6.1.0 - source-map-support: ^0.5.6 - ts-node: ^7.0.1 - typescript: ~3.8.3 - upath: ^1.1.0 - checksum: 0ee833cf35923794a4c342ddcf1ea37c531466438cfa5dceb20573063d2bb6c124a9078f0375444795c5e4dc518048f6e311b5c3a302cd42edd2e31f1d1f1470 - languageName: node - linkType: hard - -"@pulumi/pulumi@npm:^3.99.0": - version: 3.99.0 - resolution: "@pulumi/pulumi@npm:3.99.0" +"@pulumi/pulumi@npm:^3.0.0, @pulumi/pulumi@npm:^3.99.0": + version: 3.118.0 + resolution: "@pulumi/pulumi@npm:3.118.0" dependencies: - "@grpc/grpc-js": 1.9.6 + "@grpc/grpc-js": ^1.10.1 "@logdna/tail-file": ^2.0.6 + "@npmcli/arborist": ^7.3.1 "@opentelemetry/api": ^1.2.0 "@opentelemetry/exporter-zipkin": ^1.6.0 "@opentelemetry/instrumentation": ^0.32.0 @@ -10231,21 +10391,32 @@ __metadata: "@opentelemetry/semantic-conventions": ^1.6.0 "@pulumi/query": ^0.3.0 "@types/google-protobuf": ^3.15.5 + "@types/semver": ^7.5.6 + "@types/tmp": ^0.2.6 execa: ^5.1.0 + fdir: ^6.1.1 google-protobuf: ^3.5.0 + got: ^11.8.6 ini: ^2.0.0 js-yaml: ^3.14.0 minimist: ^1.2.6 - normalize-package-data: ^3.0.0 + normalize-package-data: ^6.0.0 + picomatch: ^3.0.1 pkg-dir: ^7.0.0 - read-package-tree: ^5.3.1 require-from-string: ^2.0.1 semver: ^7.5.2 source-map-support: ^0.5.6 - ts-node: ^7.0.1 - typescript: ~3.8.3 + tmp: ^0.2.1 upath: ^1.1.0 - checksum: b899a4e4f642692302020c3a7016878e806043d8c3a4f00ad198ffba057d60841eefd192545cfa9687f630c5c77e8f5545a618da59bbde9012a66de84beca3f1 + peerDependencies: + ts-node: ">= 7.0.1 < 12" + typescript: ">= 3.8.3 < 6" + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + checksum: 202a39abfacb99ec4ac511a887f1907a50f375fcdced8e0bcfce7a233756d6eed0d1ef085e6ba5b03b2d33820361b46fad2a4fc842158910320085df0c225e9d languageName: node linkType: hard @@ -10839,6 +11010,71 @@ __metadata: languageName: node linkType: hard +"@sec-ant/readable-stream@npm:^0.4.1": + version: 0.4.1 + resolution: "@sec-ant/readable-stream@npm:0.4.1" + checksum: eb56f72a70995f725269f1c1c206d6dbeb090e88413b1302a456c600041175a7a484c2f0172454f7bed65a8ab95ffed7647d8ad03e6c23b1e3bbc9845f78cd17 + languageName: node + linkType: hard + +"@sigstore/bundle@npm:^2.3.2": + version: 2.3.2 + resolution: "@sigstore/bundle@npm:2.3.2" + dependencies: + "@sigstore/protobuf-specs": ^0.3.2 + checksum: 851095ef71473b187df4d8b3374821d53c152646e591557973bd9648a9f08e3e8f686c7523194f513ded9534b4d057aa18697ee11f784ec4e36161907ce6d8ee + languageName: node + linkType: hard + +"@sigstore/core@npm:^1.0.0, @sigstore/core@npm:^1.1.0": + version: 1.1.0 + resolution: "@sigstore/core@npm:1.1.0" + checksum: bb870cf11cfb260d9e83f40cc29e6bbaf6ef5211d42eacbb48517ff87b1f647ff687eff557b0b30f9880fac2517d14704ec6036ae4a0d99ef3265b3d40cef29c + languageName: node + linkType: hard + +"@sigstore/protobuf-specs@npm:^0.3.2": + version: 0.3.2 + resolution: "@sigstore/protobuf-specs@npm:0.3.2" + checksum: 677b67eb4c3128432169fa168a5daae343a0242ffada3811bfde844644ac2eae0127cbf39349ed59e1a4edd14064416285251abb6acb260b6e3e9b6b40705c13 + languageName: node + linkType: hard + +"@sigstore/sign@npm:^2.3.2": + version: 2.3.2 + resolution: "@sigstore/sign@npm:2.3.2" + dependencies: + "@sigstore/bundle": ^2.3.2 + "@sigstore/core": ^1.0.0 + "@sigstore/protobuf-specs": ^0.3.2 + make-fetch-happen: ^13.0.1 + proc-log: ^4.2.0 + promise-retry: ^2.0.1 + checksum: b8bfc38716956df0aadbba8a78ed4b3a758747e31e1ed775deab0632243ff94aee51f6c17cf344834cf6e5174449358988ce35e3437e80e49867a7821ad5aa45 + languageName: node + linkType: hard + +"@sigstore/tuf@npm:^2.3.4": + version: 2.3.4 + resolution: "@sigstore/tuf@npm:2.3.4" + dependencies: + "@sigstore/protobuf-specs": ^0.3.2 + tuf-js: ^2.2.1 + checksum: 62f0b17e116d42d224c7d9f40a4037c7c20f456e026059ce6ebfc155e6d6445396549acd01a6f799943857e900f1bb2b0523d00a9353b8f3f99862f1eba59f6d + languageName: node + linkType: hard + +"@sigstore/verify@npm:^1.2.1": + version: 1.2.1 + resolution: "@sigstore/verify@npm:1.2.1" + dependencies: + "@sigstore/bundle": ^2.3.2 + "@sigstore/core": ^1.1.0 + "@sigstore/protobuf-specs": ^0.3.2 + checksum: bcd08c152d6166e9c6a019c8cb50afe1b284c01753e219e126665d21b5923cbdba3700daa3cee5197a07af551ecca8b209a6c557fbc0e5f6a4ee6f9c531047fe + languageName: node + linkType: hard + "@sinclair/typebox@npm:^0.25.16": version: 0.25.24 resolution: "@sinclair/typebox@npm:0.25.24" @@ -10860,6 +11096,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/merge-streams@npm:^4.0.0": + version: 4.0.0 + resolution: "@sindresorhus/merge-streams@npm:4.0.0" + checksum: 5759d31dfd822999bbe3ddcf72d4b15dc3d99ea51dd5b3210888f3348234eaff0f44bc999bef6b3c328daeb34e862a63b2c4abe5590acec541f93bc6fa016c9d + languageName: node + linkType: hard + "@sinonjs/commons@npm:^1.6.0, @sinonjs/commons@npm:^1.7.0, @sinonjs/commons@npm:^1.8.1": version: 1.8.6 resolution: "@sinonjs/commons@npm:1.8.6" @@ -12871,6 +13114,15 @@ __metadata: languageName: node linkType: hard +"@szmarczak/http-timer@npm:^4.0.5": + version: 4.0.6 + resolution: "@szmarczak/http-timer@npm:4.0.6" + dependencies: + defer-to-connect: ^2.0.0 + checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 + languageName: node + linkType: hard + "@tanstack/react-table@npm:^8.5.22": version: 8.7.9 resolution: "@tanstack/react-table@npm:8.7.9" @@ -13027,6 +13279,23 @@ __metadata: languageName: node linkType: hard +"@tufjs/canonical-json@npm:2.0.0": + version: 2.0.0 + resolution: "@tufjs/canonical-json@npm:2.0.0" + checksum: cc719a1d0d0ae1aa1ba551a82c87dcbefac088e433c03a3d8a1d547ea721350e47dab4ab5b0fca40d5c7ab1f4882e72edc39c9eae15bf47c45c43bcb6ee39f4f + languageName: node + linkType: hard + +"@tufjs/models@npm:2.0.1": + version: 2.0.1 + resolution: "@tufjs/models@npm:2.0.1" + dependencies: + "@tufjs/canonical-json": 2.0.0 + minimatch: ^9.0.4 + checksum: 7a7370ac8dc3c18b66dddca3269d9b9282d891f1c289beb2060649fd50ef74eaa6494bd6d6b3edfe11f0f1efa14ec19c5ec819c7cf1871476c9e002115ffb9a7 + languageName: node + linkType: hard + "@types/accept-language-parser@npm:^1.5.3": version: 1.5.3 resolution: "@types/accept-language-parser@npm:1.5.3" @@ -13126,6 +13395,18 @@ __metadata: languageName: node linkType: hard +"@types/cacheable-request@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/cacheable-request@npm:6.0.3" + dependencies: + "@types/http-cache-semantics": "*" + "@types/keyv": ^3.1.4 + "@types/node": "*" + "@types/responselike": ^1.0.0 + checksum: d9b26403fe65ce6b0cb3720b7030104c352bcb37e4fac2a7089a25a97de59c355fa08940658751f2f347a8512aa9d18fdb66ab3ade835975b2f454f2d5befbd9 + languageName: node + linkType: hard + "@types/center-align@npm:^1.0.0": version: 1.0.0 resolution: "@types/center-align@npm:1.0.0" @@ -13190,6 +13471,15 @@ __metadata: languageName: node linkType: hard +"@types/execa@npm:^2.0.0": + version: 2.0.0 + resolution: "@types/execa@npm:2.0.0" + dependencies: + execa: "*" + checksum: 7c01bd5b0dfd87055548a9cd5290620b11853d385b0adfbf12674edd3322016d6198fde4c80bd0047f2b93424de4e4e299a93bcbe9ec227379d4bc4e906ebdd0 + languageName: node + linkType: hard + "@types/extract-zip@npm:^1.6.2": version: 1.6.2 resolution: "@types/extract-zip@npm:1.6.2" @@ -13312,6 +13602,13 @@ __metadata: languageName: node linkType: hard +"@types/http-cache-semantics@npm:*": + version: 4.0.4 + resolution: "@types/http-cache-semantics@npm:4.0.4" + checksum: 7f4dd832e618bc1e271be49717d7b4066d77c2d4eed5b81198eb987e532bb3e1c7e02f45d77918185bad936f884b700c10cebe06305f50400f382ab75055f9e8 + languageName: node + linkType: hard + "@types/http-proxy@npm:^1.17.8": version: 1.17.9 resolution: "@types/http-proxy@npm:1.17.9" @@ -13473,7 +13770,7 @@ __metadata: languageName: node linkType: hard -"@types/keyv@npm:^3.1.1": +"@types/keyv@npm:^3.1.1, @types/keyv@npm:^3.1.4": version: 3.1.4 resolution: "@types/keyv@npm:3.1.4" dependencies: @@ -13571,7 +13868,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>= 8, @types/node@npm:>=12.12.47, @types/node@npm:>=6": +"@types/node@npm:*, @types/node@npm:>= 8, @types/node@npm:>=6": version: 18.13.0 resolution: "@types/node@npm:18.13.0" checksum: 4ea10f8802848b01672bce938f678b6774ca2cee0c9774f12275ab064ae07818419c3e2e41d6257ce7ba846d1ea26c63214aa1dfa4166fa3746291752b8c6416 @@ -13920,6 +14217,13 @@ __metadata: languageName: node linkType: hard +"@types/semver@npm:^7.5.6": + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 + languageName: node + linkType: hard + "@types/sharp@npm:^0.32.0": version: 0.32.0 resolution: "@types/sharp@npm:0.32.0" @@ -13980,6 +14284,13 @@ __metadata: languageName: node linkType: hard +"@types/tmp@npm:^0.2.6": + version: 0.2.6 + resolution: "@types/tmp@npm:0.2.6" + checksum: 0b24bb6040cc289440a609e10ec99a704978c890a5828ff151576489090b2257ce2e2570b0f320ace9c8099c3642ea6221fbdf6d8f2e22b7cd1f4fbf6e989e3e + languageName: node + linkType: hard + "@types/tough-cookie@npm:*": version: 4.0.2 resolution: "@types/tough-cookie@npm:4.0.2" @@ -14949,6 +15260,7 @@ __metadata: "@babel/cli": ^7.22.6 "@babel/core": ^7.22.8 "@webiny/api-elasticsearch-tasks": 0.0.0 + "@webiny/api-headless-cms-es-tasks": 0.0.0 "@webiny/cli": 0.0.0 "@webiny/plugins": 0.0.0 "@webiny/project-utils": 0.0.0 @@ -14966,6 +15278,7 @@ __metadata: "@babel/cli": ^7.22.6 "@babel/core": ^7.22.8 "@webiny/api-elasticsearch-tasks": 0.0.0 + "@webiny/api-headless-cms-es-tasks": 0.0.0 "@webiny/cli": 0.0.0 "@webiny/plugins": 0.0.0 "@webiny/project-utils": 0.0.0 @@ -15356,6 +15669,35 @@ __metadata: languageName: unknown linkType: soft +"@webiny/api-headless-cms-es-tasks@0.0.0, @webiny/api-headless-cms-es-tasks@workspace:packages/api-headless-cms-es-tasks": + version: 0.0.0-use.local + resolution: "@webiny/api-headless-cms-es-tasks@workspace:packages/api-headless-cms-es-tasks" + dependencies: + "@babel/cli": ^7.22.6 + "@babel/core": ^7.22.8 + "@babel/preset-env": ^7.22.7 + "@faker-js/faker": ^8.4.1 + "@webiny/api": 0.0.0 + "@webiny/api-elasticsearch": 0.0.0 + "@webiny/api-headless-cms": 0.0.0 + "@webiny/api-headless-cms-ddb-es": 0.0.0 + "@webiny/api-i18n": 0.0.0 + "@webiny/api-security": 0.0.0 + "@webiny/api-tenancy": 0.0.0 + "@webiny/api-wcp": 0.0.0 + "@webiny/cli": 0.0.0 + "@webiny/handler": 0.0.0 + "@webiny/handler-aws": 0.0.0 + "@webiny/handler-graphql": 0.0.0 + "@webiny/plugins": 0.0.0 + "@webiny/project-utils": 0.0.0 + "@webiny/tasks": 0.0.0 + "@webiny/utils": 0.0.0 + ttypescript: ^1.5.13 + typescript: ^4.7.4 + languageName: unknown + linkType: soft + "@webiny/api-headless-cms@0.0.0, @webiny/api-headless-cms@workspace:packages/api-headless-cms": version: 0.0.0-use.local resolution: "@webiny/api-headless-cms@workspace:packages/api-headless-cms" @@ -18413,6 +18755,7 @@ __metadata: resolution: "@webiny/migrations@workspace:packages/migrations" dependencies: "@elastic/elasticsearch": 7.12.0 + "@types/execa": ^2.0.0 "@webiny/api-elasticsearch": 0.0.0 "@webiny/api-headless-cms": 0.0.0 "@webiny/api-headless-cms-ddb-es": 0.0.0 @@ -19174,6 +19517,13 @@ __metadata: languageName: node linkType: hard +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 + languageName: node + linkType: hard + "abort-controller@npm:^3.0.0": version: 3.0.0 resolution: "abort-controller@npm:3.0.0" @@ -20885,7 +21235,25 @@ __metadata: languageName: node linkType: hard -"aws-sdk@npm:^2.0.0, aws-sdk@npm:^2.814.0": +"aws-sdk@npm:^2.0.0": + version: 2.1632.0 + resolution: "aws-sdk@npm:2.1632.0" + dependencies: + buffer: 4.9.2 + events: 1.1.1 + ieee754: 1.1.13 + jmespath: 0.16.0 + querystring: 0.2.0 + sax: 1.2.1 + url: 0.10.3 + util: ^0.12.4 + uuid: 8.0.0 + xml2js: 0.6.2 + checksum: 23a08c09b78443feee2ccbed0e34d393c5fc44290681261563e4589e592f6d2c20999327e959483dbf65737039ebf8a2d7ef83b7ef44a474a299c636140e6803 + languageName: node + linkType: hard + +"aws-sdk@npm:^2.814.0": version: 2.1310.0 resolution: "aws-sdk@npm:2.1310.0" dependencies: @@ -21647,6 +22015,18 @@ __metadata: languageName: node linkType: hard +"bin-links@npm:^4.0.4": + version: 4.0.4 + resolution: "bin-links@npm:4.0.4" + dependencies: + cmd-shim: ^6.0.0 + npm-normalize-package-bin: ^3.0.0 + read-cmd-shim: ^4.0.0 + write-file-atomic: ^5.0.0 + checksum: 9fca1fddaa3c1c9f7efd6fd7a6d991e3d8f6aaa9de5d0b9355469c2c594d8d06c9b2e0519bb0304202c14ddbe832d27b6d419d55cea4340e2c26116f9190e5c9 + languageName: node + linkType: hard + "binary-extensions@npm:^1.0.0": version: 1.13.1 resolution: "binary-extensions@npm:1.13.1" @@ -22402,6 +22782,26 @@ __metadata: languageName: node linkType: hard +"cacache@npm:^18.0.0, cacache@npm:^18.0.3": + version: 18.0.3 + resolution: "cacache@npm:18.0.3" + dependencies: + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^10.0.1 + minipass: ^7.0.3 + minipass-collect: ^2.0.1 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^4.0.0 + ssri: ^10.0.0 + tar: ^6.1.11 + unique-filename: ^3.0.0 + checksum: b717fd9b36e9c3279bfde4545c3a8f6d5a539b084ee26a9504d48f83694beb724057d26e090b97540f9cc62bea18b9f6cf671c50e18fb7dac60eda9db691714f + languageName: node + linkType: hard + "cache-base@npm:^1.0.1": version: 1.0.1 resolution: "cache-base@npm:1.0.1" @@ -22419,6 +22819,13 @@ __metadata: languageName: node linkType: hard +"cacheable-lookup@npm:^5.0.3": + version: 5.0.4 + resolution: "cacheable-lookup@npm:5.0.4" + checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d + languageName: node + linkType: hard + "cacheable-request@npm:^6.0.0": version: 6.1.0 resolution: "cacheable-request@npm:6.1.0" @@ -22434,6 +22841,21 @@ __metadata: languageName: node linkType: hard +"cacheable-request@npm:^7.0.2": + version: 7.0.4 + resolution: "cacheable-request@npm:7.0.4" + dependencies: + clone-response: ^1.0.2 + get-stream: ^5.1.0 + http-cache-semantics: ^4.0.0 + keyv: ^4.0.0 + lowercase-keys: ^2.0.0 + normalize-url: ^6.0.1 + responselike: ^2.0.0 + checksum: 0de9df773fd4e7dd9bd118959878f8f2163867e2e1ab3575ffbecbe6e75e80513dd0c68ba30005e5e5a7b377cc6162bbc00ab1db019bb4e9cb3c2f3f7a6f1ee4 + languageName: node + linkType: hard + "cachedir@npm:^1.1.0": version: 1.3.0 resolution: "cachedir@npm:1.3.0" @@ -23176,6 +23598,13 @@ __metadata: languageName: node linkType: hard +"cmd-shim@npm:^6.0.0": + version: 6.0.3 + resolution: "cmd-shim@npm:6.0.3" + checksum: bd79ac1505fea77cba0caf271c16210ebfbe50f348a1907f4700740876ab2157e00882b9baa685a9fcf9bc92e08a87e21bd757f45a6938f00290422f80f7d27a + languageName: node + linkType: hard + "co@npm:^4.6.0": version: 4.6.0 resolution: "co@npm:4.6.0" @@ -23491,6 +23920,13 @@ __metadata: languageName: node linkType: hard +"common-ancestor-path@npm:^1.0.1": + version: 1.0.1 + resolution: "common-ancestor-path@npm:1.0.1" + checksum: 1d2e4186067083d8cc413f00fc2908225f04ae4e19417ded67faa6494fb313c4fcd5b28a52326d1a62b466e2b3a4325e92c31133c5fee628cdf8856b3a57c3d7 + languageName: node + linkType: hard + "common-path-prefix@npm:^3.0.0": version: 3.0.0 resolution: "common-path-prefix@npm:3.0.0" @@ -24210,7 +24646,7 @@ __metadata: load-json-file: 6.2.0 node-fetch: ^2.6.1 os: 0.1.1 - p-retry: ^4.6.0 + p-retry: ^4.6.2 rimraf: 3.0.2 semver: ^7.3.5 uuid: 8.3.2 @@ -25359,6 +25795,13 @@ __metadata: languageName: node linkType: hard +"defer-to-connect@npm:^2.0.0": + version: 2.0.1 + resolution: "defer-to-connect@npm:2.0.1" + checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b + languageName: node + linkType: hard + "deferred-leveldown@npm:~5.3.0": version: 5.3.0 resolution: "deferred-leveldown@npm:5.3.0" @@ -27499,6 +27942,26 @@ __metadata: languageName: node linkType: hard +"execa@npm:*": + version: 9.1.0 + resolution: "execa@npm:9.1.0" + dependencies: + "@sindresorhus/merge-streams": ^4.0.0 + cross-spawn: ^7.0.3 + figures: ^6.1.0 + get-stream: ^9.0.0 + human-signals: ^7.0.0 + is-plain-obj: ^4.1.0 + is-stream: ^4.0.1 + npm-run-path: ^5.2.0 + pretty-ms: ^9.0.0 + signal-exit: ^4.1.0 + strip-final-newline: ^4.0.0 + yoctocolors: ^2.0.0 + checksum: 3807e5e4a00e117ee5bc85b1860e21ee763de48b0436a14f170342702b5fbb287f432e6418a10072f9b32bd59dfa367fd038431ba9e025c0697a971e8aaa80fc + languageName: node + linkType: hard + "execa@npm:4.1.0": version: 4.1.0 resolution: "execa@npm:4.1.0" @@ -27687,6 +28150,13 @@ __metadata: languageName: node linkType: hard +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + "express@npm:4.17.1": version: 4.17.1 resolution: "express@npm:4.17.1" @@ -28194,6 +28664,18 @@ __metadata: languageName: node linkType: hard +"fdir@npm:^6.1.1": + version: 6.1.1 + resolution: "fdir@npm:6.1.1" + peerDependencies: + picomatch: 3.x + peerDependenciesMeta: + picomatch: + optional: true + checksum: 2db7e261c95246ea572eaaf1c86bb32c620c3579638a4ae12f427662c4dfbb28891b36a2102c3dd691a4ff98f6ae982a9d26b3af042268238ef7fb77360d8116 + languageName: node + linkType: hard + "fecha@npm:^2.3.3": version: 2.3.3 resolution: "fecha@npm:2.3.3" @@ -28236,6 +28718,15 @@ __metadata: languageName: node linkType: hard +"figures@npm:^6.1.0": + version: 6.1.0 + resolution: "figures@npm:6.1.0" + dependencies: + is-unicode-supported: ^2.0.0 + checksum: 35c81239d4fa40b75c2c7c010833b0bc8861c27187e4c9388fca1d9731103ec9989b70ee3b664ef426ddd9abe02ec5f4fd973424aa8c6fd3ea5d3bf57a2d01b4 + languageName: node + linkType: hard + "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -29012,6 +29503,15 @@ __metadata: languageName: node linkType: hard +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 + languageName: node + linkType: hard + "fs-monkey@npm:^1.0.3": version: 1.0.3 resolution: "fs-monkey@npm:1.0.3" @@ -29333,6 +29833,16 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^9.0.0": + version: 9.0.1 + resolution: "get-stream@npm:9.0.1" + dependencies: + "@sec-ant/readable-stream": ^0.4.1 + is-stream: ^4.0.1 + checksum: 631df71d7bd60a7f373094d3c352e2ce412b82d30b1b0ec562e5a4aced976173a4cc0dabef019050e1aceaffb1f0e086349ab3d14377b0b7280510bd75bd3e1e + languageName: node + linkType: hard + "get-symbol-description@npm:^1.0.0": version: 1.0.0 resolution: "get-symbol-description@npm:1.0.0" @@ -29633,6 +30143,21 @@ __metadata: languageName: node linkType: hard +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.4.1 + resolution: "glob@npm:10.4.1" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^3.1.2 + minimatch: ^9.0.4 + minipass: ^7.1.2 + path-scurry: ^1.11.1 + bin: + glob: dist/esm/bin.mjs + checksum: 5d33c686c80bf6877f4284adf99a8c3cbb2a6eccbc92342943fe5d4b42c01d78c1881f2223d950c92a938d0f857e12e37b86a8e5483ab2141822e053b67d0dde + languageName: node + linkType: hard + "glob@npm:^5.0.15": version: 5.0.15 resolution: "glob@npm:5.0.15" @@ -29858,6 +30383,25 @@ __metadata: languageName: node linkType: hard +"got@npm:^11.8.6": + version: 11.8.6 + resolution: "got@npm:11.8.6" + dependencies: + "@sindresorhus/is": ^4.0.0 + "@szmarczak/http-timer": ^4.0.5 + "@types/cacheable-request": ^6.0.1 + "@types/responselike": ^1.0.0 + cacheable-lookup: ^5.0.3 + cacheable-request: ^7.0.2 + decompress-response: ^6.0.0 + http2-wrapper: ^1.0.0-beta.5.2 + lowercase-keys: ^2.0.0 + p-cancelable: ^2.0.0 + responselike: ^2.0.0 + checksum: bbc783578a8d5030c8164ef7f57ce41b5ad7db2ed13371e1944bef157eeca5a7475530e07c0aaa71610d7085474d0d96222c9f4268d41db333a17e39b463f45d + languageName: node + linkType: hard + "got@npm:^6.3.0": version: 6.7.1 resolution: "got@npm:6.7.1" @@ -30344,6 +30888,15 @@ __metadata: languageName: node linkType: hard +"hosted-git-info@npm:^7.0.0, hosted-git-info@npm:^7.0.2": + version: 7.0.2 + resolution: "hosted-git-info@npm:7.0.2" + dependencies: + lru-cache: ^10.0.1 + checksum: 467cf908a56556417b18e86ae3b8dee03c2360ef1d51e61c4028fe87f6f309b6ff038589c94b5666af207da9d972d5107698906aabeb78aca134641962a5c6f8 + languageName: node + linkType: hard + "hpack.js@npm:^2.1.6": version: 2.1.6 resolution: "hpack.js@npm:2.1.6" @@ -30540,7 +31093,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 @@ -30725,6 +31278,16 @@ __metadata: languageName: node linkType: hard +"http2-wrapper@npm:^1.0.0-beta.5.2": + version: 1.0.3 + resolution: "http2-wrapper@npm:1.0.3" + dependencies: + quick-lru: ^5.1.1 + resolve-alpn: ^1.0.0 + checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e + languageName: node + linkType: hard + "https-browserify@npm:^1.0.0": version: 1.0.0 resolution: "https-browserify@npm:1.0.0" @@ -30752,7 +31315,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.2, https-proxy-agent@npm:^7.0.3": +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2, https-proxy-agent@npm:^7.0.3": version: 7.0.4 resolution: "https-proxy-agent@npm:7.0.4" dependencies: @@ -30776,6 +31339,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^7.0.0": + version: 7.0.0 + resolution: "human-signals@npm:7.0.0" + checksum: 5e05a7dbb6d021371ddb854c58b19aa372cc616b34e8eec0d27098d699be0571e29b2b98869053d898badb9594b7ed5058642660b04fb1e41b7bd1f83e472d16 + languageName: node + linkType: hard + "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -30902,6 +31472,15 @@ __metadata: languageName: node linkType: hard +"ignore-walk@npm:^6.0.4": + version: 6.0.5 + resolution: "ignore-walk@npm:6.0.5" + dependencies: + minimatch: ^9.0.0 + checksum: 06f88a53c412385ca7333276149a7e9461b7fad977c44272d854522b0d456c2aa75d832bd3980a530e2c3881126aa9cc4782b3551ca270fffc0ce7c2b4a2e199 + languageName: node + linkType: hard + "ignore@npm:^3.3.5": version: 3.3.10 resolution: "ignore@npm:3.3.10" @@ -31594,6 +32173,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.8.1": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" + dependencies: + hasown: ^2.0.0 + checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c + languageName: node + linkType: hard + "is-data-descriptor@npm:^0.1.4": version: 0.1.4 resolution: "is-data-descriptor@npm:0.1.4" @@ -31967,6 +32555,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^4.1.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce + languageName: node + linkType: hard + "is-plain-object@npm:5.0.0, is-plain-object@npm:^5.0.0": version: 5.0.0 resolution: "is-plain-object@npm:5.0.0" @@ -32095,6 +32690,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^4.0.1": + version: 4.0.1 + resolution: "is-stream@npm:4.0.1" + checksum: cbea3f1fc271b21ceb228819d0c12a0965a02b57f39423925f99530b4eb86935235f258f06310b67cd02b2d10b49e9a0998f5ececf110ab7d3760bae4055ad23 + languageName: node + linkType: hard + "is-string@npm:^1.0.5, is-string@npm:^1.0.7": version: 1.0.7 resolution: "is-string@npm:1.0.7" @@ -32149,6 +32751,13 @@ __metadata: languageName: node linkType: hard +"is-unicode-supported@npm:^2.0.0": + version: 2.0.0 + resolution: "is-unicode-supported@npm:2.0.0" + checksum: 000b80639dedaf59a385f1c0a57f97a4d1435e0723716f24cc19ad94253a7a0a9f838bdc9ac49b10a29ac93b01f52ae9b2ed358a8876caf1eb74d73b4ede92b2 + languageName: node + linkType: hard + "is-utf8@npm:^0.2.0": version: 0.2.1 resolution: "is-utf8@npm:0.2.1" @@ -32240,6 +32849,13 @@ __metadata: languageName: node linkType: hard +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e + languageName: node + linkType: hard + "isnumeric@npm:^0.3.3": version: 0.3.3 resolution: "isnumeric@npm:0.3.3" @@ -32399,6 +33015,19 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^3.1.2": + version: 3.1.2 + resolution: "jackspeak@npm:3.1.2" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 134276d5f785c518930701a0dcba1f3b0e9ce3e5b1c3e300898e2ae0bbd9b5195088b77252bf2110768de072c426e9e39f47e13912b0b002da4a3f4ff6e16eac + languageName: node + linkType: hard + "jake@npm:^10.8.5": version: 10.8.5 resolution: "jake@npm:10.8.5" @@ -33301,6 +33930,13 @@ __metadata: languageName: node linkType: hard +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + "json-parse-better-errors@npm:^1.0.0, json-parse-better-errors@npm:^1.0.1, json-parse-better-errors@npm:^1.0.2": version: 1.0.2 resolution: "json-parse-better-errors@npm:1.0.2" @@ -33315,6 +33951,13 @@ __metadata: languageName: node linkType: hard +"json-parse-even-better-errors@npm:^3.0.0, json-parse-even-better-errors@npm:^3.0.2": + version: 3.0.2 + resolution: "json-parse-even-better-errors@npm:3.0.2" + checksum: 6f04ea6c9ccb783630a59297959247e921cc90b917b8351197ca7fd058fccc7079268fd9362be21ba876fc26aa5039369dd0a2280aae49aae425784794a94927 + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -33343,6 +33986,13 @@ __metadata: languageName: node linkType: hard +"json-stringify-nice@npm:^1.1.4": + version: 1.1.4 + resolution: "json-stringify-nice@npm:1.1.4" + checksum: 6ddf781148b46857ab04e97f47be05f14c4304b86eb5478369edbeacd070c21c697269964b982fc977e8989d4c59091103b1d9dc291aba40096d6cbb9a392b72 + languageName: node + linkType: hard + "json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" @@ -33557,6 +34207,20 @@ __metadata: languageName: node linkType: hard +"just-diff-apply@npm:^5.2.0": + version: 5.5.0 + resolution: "just-diff-apply@npm:5.5.0" + checksum: ed6bbd59781542ccb786bd843038e4591e8390aa788075beb69d358051f68fbeb122bda050b7f42515d51fb64b907d5c7bea694a0543b87b24ce406cfb5f5bfa + languageName: node + linkType: hard + +"just-diff@npm:^6.0.0": + version: 6.0.2 + resolution: "just-diff@npm:6.0.2" + checksum: 1a0c7524f640cb88ab013862733e710f840927834208fd3b85cbc5da2ced97acc75e7dcfe493268ac6a6514c51dd8624d2fd9d057050efba3c02b81a6dcb7ff9 + languageName: node + linkType: hard + "just-extend@npm:^4.0.2": version: 4.2.1 resolution: "just-extend@npm:4.2.1" @@ -33630,6 +34294,15 @@ __metadata: languageName: node linkType: hard +"keyv@npm:^4.0.0": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 + languageName: node + linkType: hard + "kind-of@npm:^2.0.1": version: 2.0.1 resolution: "kind-of@npm:2.0.1" @@ -34659,6 +35332,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.2.2": + version: 10.2.2 + resolution: "lru-cache@npm:10.2.2" + checksum: 98e8fc93691c546f719a76103ef2bee5a3ac823955c755a47641ec41f8c7fafa1baeaba466937cc1cbfa9cfd47e03536d10e2db3158a64ad91ff3a58a32c893e + languageName: node + linkType: hard + "lru-cache@npm:^4.0.1": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" @@ -34815,6 +35495,26 @@ __metadata: languageName: node linkType: hard +"make-fetch-happen@npm:^13.0.0, make-fetch-happen@npm:^13.0.1": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" + dependencies: + "@npmcli/agent": ^2.0.0 + cacache: ^18.0.0 + http-cache-semantics: ^4.1.1 + is-lambda: ^1.0.1 + minipass: ^7.0.2 + minipass-fetch: ^3.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^0.6.3 + proc-log: ^4.2.0 + promise-retry: ^2.0.1 + ssri: ^10.0.0 + checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd + languageName: node + linkType: hard + "make-fetch-happen@npm:^5.0.0": version: 5.0.2 resolution: "make-fetch-happen@npm:5.0.2" @@ -35504,6 +36204,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.0, minimatch@npm:^9.0.4": + version: 9.0.4 + resolution: "minimatch@npm:9.0.4" + dependencies: + brace-expansion: ^2.0.1 + checksum: cf717f597ec3eed7dabc33153482a2e8d49f4fd3c26e58fd9c71a94c5029a0838728841b93f46bf1263b65a8010e2ee800d0dc9b004ab8ba8b6d1ec07cc115b5 + languageName: node + linkType: hard + "minimatch@npm:^9.0.1": version: 9.0.3 resolution: "minimatch@npm:9.0.3" @@ -35573,6 +36282,15 @@ __metadata: languageName: node linkType: hard +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: ^7.0.3 + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 + languageName: node + linkType: hard + "minipass-fetch@npm:^2.0.3": version: 2.1.2 resolution: "minipass-fetch@npm:2.1.2" @@ -35588,6 +36306,21 @@ __metadata: languageName: node linkType: hard +"minipass-fetch@npm:^3.0.0": + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" + dependencies: + encoding: ^0.1.13 + minipass: ^7.0.3 + minipass-sized: ^1.0.3 + minizlib: ^2.1.2 + dependenciesMeta: + encoding: + optional: true + checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83 + languageName: node + linkType: hard + "minipass-flush@npm:^1.0.5": version: 1.0.5 resolution: "minipass-flush@npm:1.0.5" @@ -35597,6 +36330,16 @@ __metadata: languageName: node linkType: hard +"minipass-json-stream@npm:^1.0.1": + version: 1.0.1 + resolution: "minipass-json-stream@npm:1.0.1" + dependencies: + jsonparse: ^1.3.1 + minipass: ^3.0.0 + checksum: 791b696a27d1074c4c08dab1bf5a9f3201145c2933e428f45d880467bce12c60de4703203d2928de4b162d0ae77b0bb4b55f96cb846645800aa0eb4919b3e796 + languageName: node + linkType: hard + "minipass-pipeline@npm:^1.2.2, minipass-pipeline@npm:^1.2.4": version: 1.2.4 resolution: "minipass-pipeline@npm:1.2.4" @@ -35648,6 +36391,13 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 + languageName: node + linkType: hard + "minizlib@npm:^1.3.3": version: 1.3.3 resolution: "minizlib@npm:1.3.3" @@ -36289,6 +37039,26 @@ __metadata: languageName: node linkType: hard +"node-gyp@npm:^10.0.0": + version: 10.1.0 + resolution: "node-gyp@npm:10.1.0" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + glob: ^10.3.10 + graceful-fs: ^4.2.6 + make-fetch-happen: ^13.0.0 + nopt: ^7.0.0 + proc-log: ^3.0.0 + semver: ^7.3.5 + tar: ^6.1.2 + which: ^4.0.0 + bin: + node-gyp: bin/node-gyp.js + checksum: 72e2ab4b23fc32007a763da94018f58069fc0694bf36115d49a2b195c8831e12cf5dd1e7a3718fa85c06969aedf8fc126722d3b672ec1cb27e06ed33caee3c60 + languageName: node + linkType: hard + "node-gyp@npm:^5.0.2": version: 5.1.1 resolution: "node-gyp@npm:5.1.1" @@ -36433,6 +37203,17 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^7.0.0, nopt@npm:^7.2.1": + version: 7.2.1 + resolution: "nopt@npm:7.2.1" + dependencies: + abbrev: ^2.0.0 + bin: + nopt: bin/nopt.js + checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9 + languageName: node + linkType: hard + "nopt@npm:~1.0.10": version: 1.0.10 resolution: "nopt@npm:1.0.10" @@ -36486,6 +37267,18 @@ __metadata: languageName: node linkType: hard +"normalize-package-data@npm:^6.0.0": + version: 6.0.1 + resolution: "normalize-package-data@npm:6.0.1" + dependencies: + hosted-git-info: ^7.0.0 + is-core-module: ^2.8.1 + semver: ^7.3.5 + validate-npm-package-license: ^3.0.4 + checksum: 4f6bca00b5092b824e1d4a28fb47052b41afaaebabfd0700e47f130cac619d60668aa6ff34dfa9bccc1b06c7adcef44c34a565576b63b578e1e35b3fc67c22ca + languageName: node + linkType: hard + "normalize-path@npm:^2.0.1, normalize-path@npm:^2.1.1": version: 2.1.1 resolution: "normalize-path@npm:2.1.1" @@ -36544,6 +37337,15 @@ __metadata: languageName: node linkType: hard +"npm-bundled@npm:^3.0.0": + version: 3.0.1 + resolution: "npm-bundled@npm:3.0.1" + dependencies: + npm-normalize-package-bin: ^3.0.0 + checksum: 1f4f7307d0ff2fbd31638689490f1fd673a4540cd1d027c7c5d15e484c71d63c4b27979944b6f8738035260cf5a5477ebaae75b08818420508e7cf317d71416e + languageName: node + linkType: hard + "npm-conf@npm:^1.1.0": version: 1.1.3 resolution: "npm-conf@npm:1.1.3" @@ -36554,6 +37356,15 @@ __metadata: languageName: node linkType: hard +"npm-install-checks@npm:^6.0.0, npm-install-checks@npm:^6.2.0": + version: 6.3.0 + resolution: "npm-install-checks@npm:6.3.0" + dependencies: + semver: ^7.1.1 + checksum: 6c20dadb878a0d2f1f777405217b6b63af1299d0b43e556af9363ee6eefaa98a17dfb7b612a473a473e96faf7e789c58b221e0d8ffdc1d34903c4f71618df3b4 + languageName: node + linkType: hard + "npm-lifecycle@npm:^3.1.2": version: 3.1.5 resolution: "npm-lifecycle@npm:3.1.5" @@ -36577,6 +37388,25 @@ __metadata: languageName: node linkType: hard +"npm-normalize-package-bin@npm:^3.0.0": + version: 3.0.1 + resolution: "npm-normalize-package-bin@npm:3.0.1" + checksum: de416d720ab22137a36292ff8a333af499ea0933ef2320a8c6f56a73b0f0448227fec4db5c890d702e26d21d04f271415eab6580b5546456861cc0c19498a4bf + languageName: node + linkType: hard + +"npm-package-arg@npm:^11.0.0, npm-package-arg@npm:^11.0.2": + version: 11.0.2 + resolution: "npm-package-arg@npm:11.0.2" + dependencies: + hosted-git-info: ^7.0.0 + proc-log: ^4.0.0 + semver: ^7.3.5 + validate-npm-package-name: ^5.0.0 + checksum: cb78da54d42373fc87fcecfc68e74b10be02fea940becddf9fdcc8941334a5d57b5e867da2647e8b74880e1dc2b212d0fcc963fafd41cbccca8da3a1afef5b12 + languageName: node + linkType: hard + "npm-package-arg@npm:^4.0.0 || ^5.0.0 || ^6.0.0, npm-package-arg@npm:^6.0.0, npm-package-arg@npm:^6.1.0": version: 6.1.1 resolution: "npm-package-arg@npm:6.1.1" @@ -36600,6 +37430,15 @@ __metadata: languageName: node linkType: hard +"npm-packlist@npm:^8.0.0": + version: 8.0.2 + resolution: "npm-packlist@npm:8.0.2" + dependencies: + ignore-walk: ^6.0.4 + checksum: c75ae66b285503409e07878274d0580c1915e8db3a52539e7588a00d8c7c27b5c3c8459906d26142ffd772f0e8f291e9aa4ea076bb44a4ab0ba7e0f25b46423b + languageName: node + linkType: hard + "npm-path@npm:^2.0.2": version: 2.0.4 resolution: "npm-path@npm:2.0.4" @@ -36622,6 +37461,34 @@ __metadata: languageName: node linkType: hard +"npm-pick-manifest@npm:^9.0.0, npm-pick-manifest@npm:^9.0.1": + version: 9.0.1 + resolution: "npm-pick-manifest@npm:9.0.1" + dependencies: + npm-install-checks: ^6.0.0 + npm-normalize-package-bin: ^3.0.0 + npm-package-arg: ^11.0.0 + semver: ^7.3.5 + checksum: acd53d99cb72b39dd2e6aefe32c08a0ba969622911865ff86555dba0cd6e67ca43ae72fd1962084e4344d88596f4faf75128b70347beb29613720445d4063c87 + languageName: node + linkType: hard + +"npm-registry-fetch@npm:^17.0.0, npm-registry-fetch@npm:^17.0.1": + version: 17.0.1 + resolution: "npm-registry-fetch@npm:17.0.1" + dependencies: + "@npmcli/redact": ^2.0.0 + make-fetch-happen: ^13.0.0 + minipass: ^7.0.2 + minipass-fetch: ^3.0.0 + minipass-json-stream: ^1.0.1 + minizlib: ^2.1.2 + npm-package-arg: ^11.0.0 + proc-log: ^4.0.0 + checksum: 4a53e96969991f62fa6b5b0a47a6a0288282003ab41e6e752bc0c8ba34a284f216ae290952a032bf143fd6827faef0f204cec32f33e2d0cb348db850dd95d09d + languageName: node + linkType: hard + "npm-run-path@npm:^2.0.0": version: 2.0.2 resolution: "npm-run-path@npm:2.0.2" @@ -36640,6 +37507,15 @@ __metadata: languageName: node linkType: hard +"npm-run-path@npm:^5.2.0": + version: 5.3.0 + resolution: "npm-run-path@npm:5.3.0" + dependencies: + path-key: ^4.0.0 + checksum: ae8e7a89da9594fb9c308f6555c73f618152340dcaae423e5fb3620026fefbec463618a8b761920382d666fa7a2d8d240b6fe320e8a6cdd54dc3687e2b659d25 + languageName: node + linkType: hard + "npm-which@npm:^3.0.1": version: 3.0.1 resolution: "npm-which@npm:3.0.1" @@ -37452,7 +38328,7 @@ __metadata: languageName: node linkType: hard -"p-retry@npm:^4.5.0, p-retry@npm:^4.6.0, p-retry@npm:^4.6.2": +"p-retry@npm:^4.5.0, p-retry@npm:^4.6.2": version: 4.6.2 resolution: "p-retry@npm:4.6.2" dependencies: @@ -37555,6 +38431,33 @@ __metadata: languageName: node linkType: hard +"pacote@npm:^18.0.0, pacote@npm:^18.0.6": + version: 18.0.6 + resolution: "pacote@npm:18.0.6" + dependencies: + "@npmcli/git": ^5.0.0 + "@npmcli/installed-package-contents": ^2.0.1 + "@npmcli/package-json": ^5.1.0 + "@npmcli/promise-spawn": ^7.0.0 + "@npmcli/run-script": ^8.0.0 + cacache: ^18.0.0 + fs-minipass: ^3.0.0 + minipass: ^7.0.2 + npm-package-arg: ^11.0.0 + npm-packlist: ^8.0.0 + npm-pick-manifest: ^9.0.0 + npm-registry-fetch: ^17.0.0 + proc-log: ^4.0.0 + promise-retry: ^2.0.1 + sigstore: ^2.2.0 + ssri: ^10.0.0 + tar: ^6.1.11 + bin: + pacote: bin/index.js + checksum: a28a7aa0f4e1375d3f11917e5982e576611aa9057999e7b3a7fd18706e43d6ae4ab34b1002dc0a9821df95c3136dec6d2b6b72cfc7b02afcc1273cec006dea39 + languageName: node + linkType: hard + "pad-right@npm:^0.2.2": version: 0.2.2 resolution: "pad-right@npm:0.2.2" @@ -37628,6 +38531,17 @@ __metadata: languageName: node linkType: hard +"parse-conflict-json@npm:^3.0.0": + version: 3.0.1 + resolution: "parse-conflict-json@npm:3.0.1" + dependencies: + json-parse-even-better-errors: ^3.0.0 + just-diff: ^6.0.0 + just-diff-apply: ^5.2.0 + checksum: d8d2656bc02d4df36846366baec36b419da2fe944e31298719a4d28d28f772aa7cad2a69d01f6f329918e7c298ac481d1e6a9138d62d5662d5620a74f794af8f + languageName: node + linkType: hard + "parse-entities@npm:^1.1.2": version: 1.2.2 resolution: "parse-entities@npm:1.2.2" @@ -37692,6 +38606,13 @@ __metadata: languageName: node linkType: hard +"parse-ms@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-ms@npm:4.0.0" + checksum: 673c801d9f957ff79962d71ed5a24850163f4181a90dd30c4e3666b3a804f53b77f1f0556792e8b2adbb5d58757907d1aa51d7d7dc75997c2a56d72937cbc8b7 + languageName: node + linkType: hard + "parse-passwd@npm:^1.0.0": version: 1.0.0 resolution: "parse-passwd@npm:1.0.0" @@ -37859,6 +38780,13 @@ __metadata: languageName: node linkType: hard +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 + languageName: node + linkType: hard + "path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -37876,6 +38804,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: ^10.2.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" @@ -37978,6 +38916,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^3.0.1": + version: 3.0.1 + resolution: "picomatch@npm:3.0.1" + checksum: b7fe18174bcc05bbf0ea09cc85623ae395676b3e6bc25636d4c20db79a948586237e429905453bf1ba385bc7a7aa5b56f1b351680e650d2b5c305ceb98dfc914 + languageName: node + linkType: hard + "picture-tuber@npm:^1.0.1": version: 1.0.2 resolution: "picture-tuber@npm:1.0.2" @@ -39448,6 +40393,15 @@ __metadata: languageName: node linkType: hard +"pretty-ms@npm:^9.0.0": + version: 9.0.0 + resolution: "pretty-ms@npm:9.0.0" + dependencies: + parse-ms: ^4.0.0 + checksum: 072b17547e09cb232e8e4c7be0281e256b6d8acd18dfb2fdd715d50330d1689fdaa877f53cf90c62ed419ef842f0f5fb94a2cd8ed1aa6d7608ad48834219435d + languageName: node + linkType: hard + "pretty-time@npm:^1.1.0": version: 1.1.0 resolution: "pretty-time@npm:1.1.0" @@ -39481,6 +40435,20 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02 + languageName: node + linkType: hard + +"proc-log@npm:^4.0.0, proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -39502,6 +40470,13 @@ __metadata: languageName: node linkType: hard +"proggy@npm:^2.0.0": + version: 2.0.0 + resolution: "proggy@npm:2.0.0" + checksum: 398f38c5e53d8f3dd8e1f67140dd1044dfde0a8e43edb2df55f7f38b958912841c78a970e61f2ee7222be4f3f1ee0da134e21d0eb537805cb1b10516555c7ac1 + languageName: node + linkType: hard + "progress@npm:2.0.3": version: 2.0.3 resolution: "progress@npm:2.0.3" @@ -39509,6 +40484,20 @@ __metadata: languageName: node linkType: hard +"promise-all-reject-late@npm:^1.0.0": + version: 1.0.1 + resolution: "promise-all-reject-late@npm:1.0.1" + checksum: d7d61ac412352e2c8c3463caa5b1c3ca0f0cc3db15a09f180a3da1446e33d544c4261fc716f772b95e4c27d559cfd2388540f44104feb356584f9c73cfb9ffcb + languageName: node + linkType: hard + +"promise-call-limit@npm:^3.0.1": + version: 3.0.1 + resolution: "promise-call-limit@npm:3.0.1" + checksum: f1b3c4d3a9c5482ce27ec5f40311e1389adb9bb10c16166e61c96d29ab22c701691d5225bf6745a162858f45dfb46cc82275fd09e7aa57846fc446c7855c2f06 + languageName: node + linkType: hard + "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -39656,9 +40645,9 @@ __metadata: languageName: node linkType: hard -"protobufjs@npm:^7.2.4": - version: 7.2.5 - resolution: "protobufjs@npm:7.2.5" +"protobufjs@npm:^7.2.5": + version: 7.3.0 + resolution: "protobufjs@npm:7.3.0" dependencies: "@protobufjs/aspromise": ^1.1.2 "@protobufjs/base64": ^1.1.2 @@ -39672,7 +40661,7 @@ __metadata: "@protobufjs/utf8": ^1.1.0 "@types/node": ">=13.7.0" long: ^5.0.0 - checksum: 3770a072114061faebbb17cfd135bc4e187b66bc6f40cd8bac624368b0270871ec0cfb43a02b9fb4f029c8335808a840f1afba3c2e7ede7063b98ae6b98a703f + checksum: bc7008ec736b0ab68677ced957b7ccbfc96ccd31f10d8a09d41408d8bf432a6132387acca71e657c652d98aaf7bd2a373f355a377762cff1ed04f0def8477c69 languageName: node linkType: hard @@ -40027,6 +41016,13 @@ __metadata: languageName: node linkType: hard +"quick-lru@npm:^5.1.1": + version: 5.1.1 + resolution: "quick-lru@npm:5.1.1" + checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed + languageName: node + linkType: hard + "raf@npm:^3.1.0, raf@npm:^3.2.0, raf@npm:^3.4.0": version: 3.4.1 resolution: "raf@npm:3.4.1" @@ -41143,6 +42139,13 @@ __metadata: languageName: node linkType: hard +"read-cmd-shim@npm:^4.0.0": + version: 4.0.0 + resolution: "read-cmd-shim@npm:4.0.0" + checksum: 2fb5a8a38984088476f559b17c6a73324a5db4e77e210ae0aab6270480fd85c355fc990d1c79102e25e555a8201606ed12844d6e3cd9f35d6a1518791184e05b + languageName: node + linkType: hard + "read-json-sync@npm:2.0.1": version: 2.0.1 resolution: "read-json-sync@npm:2.0.1" @@ -41150,6 +42153,16 @@ __metadata: languageName: node linkType: hard +"read-package-json-fast@npm:^3.0.0, read-package-json-fast@npm:^3.0.2": + version: 3.0.2 + resolution: "read-package-json-fast@npm:3.0.2" + dependencies: + json-parse-even-better-errors: ^3.0.0 + npm-normalize-package-bin: ^3.0.0 + checksum: 8d406869f045f1d76e2a99865a8fd1c1af9c1dc06200b94d2b07eef87ed734b22703a8d72e1cd36ea36cc48e22020bdd187f88243c7dd0563f72114d38c17072 + languageName: node + linkType: hard + "read-package-json@npm:1 || 2, read-package-json@npm:^2.0.0, read-package-json@npm:^2.0.13": version: 2.1.2 resolution: "read-package-json@npm:2.1.2" @@ -41885,6 +42898,13 @@ __metadata: languageName: node linkType: hard +"resolve-alpn@npm:^1.0.0": + version: 1.2.1 + resolution: "resolve-alpn@npm:1.2.1" + checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 + languageName: node + linkType: hard + "resolve-cwd@npm:^2.0.0": version: 2.0.0 resolution: "resolve-cwd@npm:2.0.0" @@ -42057,6 +43077,15 @@ __metadata: languageName: node linkType: hard +"responselike@npm:^2.0.0": + version: 2.0.1 + resolution: "responselike@npm:2.0.1" + dependencies: + lowercase-keys: ^2.0.0 + checksum: b122535466e9c97b55e69c7f18e2be0ce3823c5d47ee8de0d9c0b114aa55741c6db8bfbfce3766a94d1272e61bfb1ebf0a15e9310ac5629fbb7446a861b4fd3a + languageName: node + linkType: hard + "restore-cursor@npm:^1.0.1": version: 1.0.1 resolution: "restore-cursor@npm:1.0.1" @@ -43101,13 +44130,27 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^4.0.1": +"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 languageName: node linkType: hard +"sigstore@npm:^2.2.0": + version: 2.3.1 + resolution: "sigstore@npm:2.3.1" + dependencies: + "@sigstore/bundle": ^2.3.2 + "@sigstore/core": ^1.0.0 + "@sigstore/protobuf-specs": ^0.3.2 + "@sigstore/sign": ^2.3.2 + "@sigstore/tuf": ^2.3.4 + "@sigstore/verify": ^1.2.1 + checksum: 9e8c5e60dbe56591770fb26a0d0e987f1859d47d519532578540380d6464499bcd1f1765291d6a360d3ffe9aba171fc8b0c3e559931b0ea262140aff7e892296 + languageName: node + linkType: hard + "simple-concat@npm:^1.0.0": version: 1.0.1 resolution: "simple-concat@npm:1.0.1" @@ -43347,7 +44390,7 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^8.0.2": +"socks-proxy-agent@npm:^8.0.2, socks-proxy-agent@npm:^8.0.3": version: 8.0.3 resolution: "socks-proxy-agent@npm:8.0.3" dependencies: @@ -43769,6 +44812,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^10.0.0, ssri@npm:^10.0.6": + version: 10.0.6 + resolution: "ssri@npm:10.0.6" + dependencies: + minipass: ^7.0.3 + checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 + languageName: node + linkType: hard + "ssri@npm:^6.0.0, ssri@npm:^6.0.1": version: 6.0.2 resolution: "ssri@npm:6.0.2" @@ -44254,6 +45306,13 @@ __metadata: languageName: node linkType: hard +"strip-final-newline@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-final-newline@npm:4.0.0" + checksum: b5fe48f695d74863153a3b3155220e6e9bf51f4447832998c8edec38e6559b3af87a9fe5ac0df95570a78a26f5fa91701358842eab3c15480e27980b154a145f + languageName: node + linkType: hard + "strip-indent@npm:^1.0.1": version: 1.0.1 resolution: "strip-indent@npm:1.0.1" @@ -45084,6 +46143,13 @@ __metadata: languageName: node linkType: hard +"tmp@npm:^0.2.1": + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 73b5c96b6e52da7e104d9d44afb5d106bb1e16d9fa7d00dbeb9e6522e61b571fbdb165c756c62164be9a3bbe192b9b268c236d370a2a0955c7689cd2ae377b95 + languageName: node + linkType: hard + "tmp@npm:~0.2.1": version: 0.2.1 resolution: "tmp@npm:0.2.1" @@ -45314,6 +46380,13 @@ __metadata: languageName: node linkType: hard +"treeverse@npm:^3.0.0": + version: 3.0.0 + resolution: "treeverse@npm:3.0.0" + checksum: 73168d9887fa57b0719218f176c5a3cfbaaf310922879acb4adf76665bc17dcdb6ed3e4163f0c27eee17e346886186a1515ea6f87e96cdc10df1dce13bf622a0 + languageName: node + linkType: hard + "trim-newlines@npm:^1.0.0": version: 1.0.0 resolution: "trim-newlines@npm:1.0.0" @@ -45602,6 +46675,17 @@ __metadata: languageName: node linkType: hard +"tuf-js@npm:^2.2.1": + version: 2.2.1 + resolution: "tuf-js@npm:2.2.1" + dependencies: + "@tufjs/models": 2.0.1 + debug: ^4.3.4 + make-fetch-happen: ^13.0.1 + checksum: 23a8f84a33f4569296c7d1d6919ea87273923a3d0c6cc837a84fb200041a54bb1b50623f79cc77307325d945dfe10e372ac1cad105956e34d3df2d4984027bd8 + languageName: node + linkType: hard + "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -45945,6 +47029,15 @@ __metadata: languageName: node linkType: hard +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + languageName: node + linkType: hard + "unique-slug@npm:^2.0.0": version: 2.0.2 resolution: "unique-slug@npm:2.0.2" @@ -45963,6 +47056,15 @@ __metadata: languageName: node linkType: hard +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 + languageName: node + linkType: hard + "universal-cookie@npm:^4.0.4": version: 4.0.4 resolution: "universal-cookie@npm:4.0.4" @@ -46426,7 +47528,7 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.1, validate-npm-package-license@npm:^3.0.3": +"validate-npm-package-license@npm:^3.0.1, validate-npm-package-license@npm:^3.0.3, validate-npm-package-license@npm:^3.0.4": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" dependencies: @@ -46445,6 +47547,13 @@ __metadata: languageName: node linkType: hard +"validate-npm-package-name@npm:^5.0.0": + version: 5.0.1 + resolution: "validate-npm-package-name@npm:5.0.1" + checksum: 0d583a1af23aeffea7748742cf22b6802458736fb8b60323ba5949763824d46f796474b0e1b9206beb716f9d75269e19dbd7795d6b038b29d561be95dd827381 + languageName: node + linkType: hard + "value-or-promise@npm:1.0.6": version: 1.0.6 resolution: "value-or-promise@npm:1.0.6" @@ -46584,6 +47693,13 @@ __metadata: languageName: node linkType: hard +"walk-up-path@npm:^3.0.1": + version: 3.0.1 + resolution: "walk-up-path@npm:3.0.1" + checksum: 9ffca02fe30fb65f6db531260582988c5e766f4c739cf86a6109380a7f791236b5d0b92b1dce37a6f73e22dca6bc9d93bf3700413e16251b2bd6bbd1ca2be316 + languageName: node + linkType: hard + "walker@npm:^1.0.8": version: 1.0.8 resolution: "walker@npm:1.0.8" @@ -47186,6 +48302,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: ^3.1.1 + bin: + node-which: bin/which.js + checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + languageName: node + linkType: hard + "wicg-inert@npm:^3.0.3": version: 3.1.2 resolution: "wicg-inert@npm:3.1.2" @@ -47342,6 +48469,16 @@ __metadata: languageName: node linkType: hard +"write-file-atomic@npm:^5.0.0": + version: 5.0.1 + resolution: "write-file-atomic@npm:5.0.1" + dependencies: + imurmurhash: ^0.1.4 + signal-exit: ^4.0.1 + checksum: 8dbb0e2512c2f72ccc20ccedab9986c7d02d04039ed6e8780c987dc4940b793339c50172a1008eed7747001bfacc0ca47562668a069a7506c46c77d7ba3926a9 + languageName: node + linkType: hard + "write-json-file@npm:4.3.0, write-json-file@npm:^4.2.0, write-json-file@npm:^4.3.0": version: 4.3.0 resolution: "write-json-file@npm:4.3.0" @@ -47537,6 +48674,16 @@ __metadata: languageName: node linkType: hard +"xml2js@npm:0.6.2": + version: 0.6.2 + resolution: "xml2js@npm:0.6.2" + dependencies: + sax: ">=0.6.0" + xmlbuilder: ~11.0.0 + checksum: 458a83806193008edff44562c0bdb982801d61ee7867ae58fd35fab781e69e17f40dfeb8fc05391a4648c9c54012066d3955fe5d993ffbe4dc63399023f32ac2 + languageName: node + linkType: hard + "xml2js@npm:^0.4.5": version: 0.4.23 resolution: "xml2js@npm:0.4.23" @@ -47711,6 +48858,13 @@ __metadata: languageName: node linkType: hard +"yoctocolors@npm:^2.0.0": + version: 2.0.2 + resolution: "yoctocolors@npm:2.0.2" + checksum: cac20504b5fc954ff117e3a3fbde09db8ac0807bba59e68c5c08f3a43173ef46ccb1853b15b37bd96d0d8187bc444627f160fee7e5aede0b421382cf379d2438 + languageName: node + linkType: hard + "zen-observable-ts@npm:0.8.19": version: 0.8.19 resolution: "zen-observable-ts@npm:0.8.19" From 38eee1c2641d07c0eba18afe27a88ae132758b03 Mon Sep 17 00:00:00 2001 From: Adrian Smijulj Date: Fri, 7 Jun 2024 13:48:58 +0200 Subject: [PATCH 15/26] fix: expect the possibility of `settings`object being null (#4157) --- .../settingsGroups/DefaultPages.tsx | 20 ++++++++++++++++--- .../WebsiteSettings/usePbWebsiteSettings.ts | 14 +++---------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/app-page-builder/src/modules/WebsiteSettings/settingsGroups/DefaultPages.tsx b/packages/app-page-builder/src/modules/WebsiteSettings/settingsGroups/DefaultPages.tsx index 12c5fb137de..29e5cc6919d 100644 --- a/packages/app-page-builder/src/modules/WebsiteSettings/settingsGroups/DefaultPages.tsx +++ b/packages/app-page-builder/src/modules/WebsiteSettings/settingsGroups/DefaultPages.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useCallback } from "react"; import { Bind } from "@webiny/form"; import { ButtonIcon, ButtonPrimary } from "@webiny/ui/Button"; import { AddPbWebsiteSettings } from "../AddPbWebsiteSettings"; @@ -10,6 +10,13 @@ const { Group, Element } = AddPbWebsiteSettings; const Homepage = () => { const { settings, editPage } = usePbWebsiteSettings(); + const homePage = settings.pages?.home; + + const editButtonClickHandler = useCallback(() => { + if (homePage) { + editPage(homePage); + } + }, [homePage]); return ( @@ -17,7 +24,7 @@ const Homepage = () => { label={"Homepage"} description={`To set a different page, start typing its title and select it from the dropdown menu. Note that the page must be published in order to appear.`} trailingIcon={ - editPage(settings.pages.home)}> + } /> Edit @@ -29,6 +36,13 @@ const Homepage = () => { const NotFoundPage = () => { const { settings, editPage } = usePbWebsiteSettings(); + const notFoundPage = settings.pages?.notFound; + + const editButtonClickHandler = useCallback(() => { + if (notFoundPage) { + editPage(notFoundPage); + } + }, [notFoundPage]); return ( @@ -36,7 +50,7 @@ const NotFoundPage = () => { label={"Not found (404) page"} description={`To set a different page, start typing its title and select it from the dropdown menu. Note that the page must be published in order to appear.`} trailingIcon={ - editPage(settings.pages.notFound)}> + } /> Edit diff --git a/packages/app-page-builder/src/modules/WebsiteSettings/usePbWebsiteSettings.ts b/packages/app-page-builder/src/modules/WebsiteSettings/usePbWebsiteSettings.ts index 057f54e4ee8..722c79707be 100644 --- a/packages/app-page-builder/src/modules/WebsiteSettings/usePbWebsiteSettings.ts +++ b/packages/app-page-builder/src/modules/WebsiteSettings/usePbWebsiteSettings.ts @@ -27,17 +27,9 @@ export function usePbWebsiteSettings() { const [error, setError] = useState(null); const { data, loading: queryInProgress } = useQuery(GET_SETTINGS); - const settings = get( - data, - "pageBuilder.getSettings.data", - {} - ) as unknown as GetSettingsResponseData; - - const defaultSettings = get( - data, - "pageBuilder.getDefaultSettings.data", - {} - ) as unknown as GetSettingsResponseData; + const settings: Partial = data?.pageBuilder.getSettings.data || {}; + const defaultSettings: Partial = + data?.pageBuilder.getDefaultSettings.data || {}; const [update, { loading: mutationInProgress }] = useMutation< UpdateSettingsMutationResponse, From 6d1cb1c7aa4b841b96eb002da3a00f70e5b5eb18 Mon Sep 17 00:00:00 2001 From: Adrian Smijulj Date: Fri, 7 Jun 2024 14:15:06 +0200 Subject: [PATCH 16/26] fix: improve 5.39.6 meta fields data migration performance (#4154) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bruno Zorić --- packages/migrations/package.json | 7 +- .../5.39.6/001/ddb-es/MetaFieldsMigration.ts | 236 +++++++++ .../5.39.6/001/ddb-es/SegmentProcessor.ts | 70 +++ .../src/migrations/5.39.6/001/ddb-es/bin.ts | 78 +++ ...teMetaFieldsDataMigrationDeploymentHook.ts | 102 ++++ .../src/migrations/5.39.6/001/ddb-es/utils.ts | 64 +++ .../migrations/5.39.6/001/ddb-es/worker.ts | 447 ++++++++++++++++++ .../src/utils/elasticsearch/esListIndexes.ts | 25 + .../src/utils/elasticsearch/index.ts | 2 +- yarn.lock | 5 + 10 files changed, 1034 insertions(+), 2 deletions(-) create mode 100644 packages/migrations/src/migrations/5.39.6/001/ddb-es/MetaFieldsMigration.ts create mode 100644 packages/migrations/src/migrations/5.39.6/001/ddb-es/SegmentProcessor.ts create mode 100644 packages/migrations/src/migrations/5.39.6/001/ddb-es/bin.ts create mode 100644 packages/migrations/src/migrations/5.39.6/001/ddb-es/createMetaFieldsDataMigrationDeploymentHook.ts create mode 100644 packages/migrations/src/migrations/5.39.6/001/ddb-es/utils.ts create mode 100644 packages/migrations/src/migrations/5.39.6/001/ddb-es/worker.ts create mode 100644 packages/migrations/src/utils/elasticsearch/esListIndexes.ts diff --git a/packages/migrations/package.json b/packages/migrations/package.json index 8805655d905..d9fb975aa62 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -10,15 +10,20 @@ "@elastic/elasticsearch": "7.12.0", "@webiny/api-elasticsearch": "0.0.0", "@webiny/aws-sdk": "0.0.0", + "@webiny/cli-plugin-deploy-pulumi": "0.0.0", "@webiny/data-migration": "0.0.0", "@webiny/db-dynamodb": "0.0.0", "@webiny/error": "0.0.0", "@webiny/ioc": "0.0.0", "@webiny/logger": "0.0.0", "@webiny/utils": "0.0.0", + "execa": "^5.0.0", + "fast-glob": "^3.2.7", "jsonpack": "^1.1.5", "lodash": "^4.17.21", - "pluralize": "^8.0.0" + "pino-pretty": "^9.4.0", + "pluralize": "^8.0.0", + "yargs": "^17.4.0" }, "publishConfig": { "access": "public", diff --git a/packages/migrations/src/migrations/5.39.6/001/ddb-es/MetaFieldsMigration.ts b/packages/migrations/src/migrations/5.39.6/001/ddb-es/MetaFieldsMigration.ts new file mode 100644 index 00000000000..79faf5f4a9a --- /dev/null +++ b/packages/migrations/src/migrations/5.39.6/001/ddb-es/MetaFieldsMigration.ts @@ -0,0 +1,236 @@ +import { Logger } from "@webiny/logger"; +import { SegmentProcessor } from "./SegmentProcessor"; +import { + disableElasticsearchIndexing, + esListIndexes, + fetchOriginalElasticsearchSettings, + restoreOriginalElasticsearchSettings +} from "~/utils"; +import { createElasticsearchClient } from "@webiny/api-elasticsearch"; +import { createWaitUntilHealthy } from "@webiny/api-elasticsearch/utils/waitUntilHealthy"; +import { + DEFAULT_ES_HEALTH_CHECKS_PARAMS, + EsHealthChecksParams, + migrationSkippedDdbRecordExists, + createMigrationSkippedDdbRecord +} from "~/migrations/5.39.6/001/ddb-es/utils"; +import path from "path"; +import os from "os"; +import fs from "fs"; +import glob from "fast-glob"; +import { getDocumentClient } from "@webiny/aws-sdk/client-dynamodb"; + +export interface MetaFieldsMigrationParams { + ddbTable: string; + ddbEsTable: string; + esEndpoint: string; + totalSegments: number; + logger: Logger; + + // Elasticsearch health check options. + esHealthChecks?: Partial; +} + +export class MetaFieldsMigration { + private readonly runId: string; + private readonly ddbTable: string; + private readonly ddbEsTable: string; + private readonly esEndpoint: string; + private readonly totalSegments: number; + private readonly logger: Logger; + + private readonly esHealthChecks: EsHealthChecksParams; + + constructor(params: MetaFieldsMigrationParams) { + this.runId = String(new Date().getTime()); + this.ddbTable = params.ddbTable; + this.ddbEsTable = params.ddbEsTable; + this.esEndpoint = params.esEndpoint; + this.totalSegments = params.totalSegments; + this.logger = params.logger; + this.esHealthChecks = { + ...DEFAULT_ES_HEALTH_CHECKS_PARAMS, + ...params.esHealthChecks + }; + } + + async execute() { + const scanProcessesPromises = []; + + const start = Date.now(); + const getDuration = () => { + return (Date.now() - start) / 1000; + }; + + const documentClient = getDocumentClient(); + + // Was the migration already executed? + const dataMigrationRecordExists = await migrationSkippedDdbRecordExists({ + documentClient, + ddbTable: this.ddbTable + }); + + if (dataMigrationRecordExists) { + this.logger.info("5.39.6-001 migration has already been executed. Exiting..."); + return; + } + + this.logger.info("Starting 5.39.6-001 meta fields data migration..."); + this.logger.info( + { + ddbTable: this.ddbTable, + ddbEsTable: this.ddbEsTable, + esEndpoint: this.esEndpoint, + totalSegments: this.totalSegments, + esHealthChecks: this.esHealthChecks + }, + "Received the following parameters:" + ); + + const elasticsearchClient = createElasticsearchClient({ + endpoint: `https://${this.esEndpoint}` + }); + + this.logger.info("Checking Elasticsearch health status..."); + const waitUntilHealthy = createWaitUntilHealthy(elasticsearchClient, this.esHealthChecks); + this.logger.info("Elasticsearch is healthy."); + + await waitUntilHealthy.wait(); + + const indexes = await esListIndexes({ elasticsearchClient, match: "-headless-cms-" }); + const indexSettings: Record = {}; + for (const indexName of indexes) { + this.logger.info(`Disabling indexing for Elasticsearch index "${indexName}"...`); + indexSettings[indexName] = await fetchOriginalElasticsearchSettings({ + elasticsearchClient, + index: indexName, + logger: this.logger + }); + + await disableElasticsearchIndexing({ + elasticsearchClient, + index: indexName, + logger: this.logger + }); + } + + this.logger.info("Proceeding with the migration..."); + + for (let segmentIndex = 0; segmentIndex < this.totalSegments; segmentIndex++) { + const segmentProcessor = new SegmentProcessor({ + segmentIndex, + runId: this.runId, + totalSegments: this.totalSegments, + ddbTable: this.ddbTable, + ddbEsTable: this.ddbEsTable, + esEndpoint: this.esEndpoint, + esHealthChecks: this.esHealthChecks + }); + + scanProcessesPromises.push(segmentProcessor.execute()); + } + + await Promise.all(scanProcessesPromises); + + this.logger.info("Restoring original Elasticsearch settings..."); + await restoreOriginalElasticsearchSettings({ + elasticsearchClient, + indexSettings, + logger: this.logger + }); + + // Insert a record that the migration was executed. + await createMigrationSkippedDdbRecord({ + documentClient, + ddbTable: this.ddbTable + }); + + const duration = getDuration(); + this.logger.info(`5.39.6-001 migration completed in ${duration}s, here are the results...`); + + // Wait for 1 second. + await new Promise(resolve => setTimeout(resolve, 1000)); + + this.logger.info( + { + totalSegments: this.totalSegments, + esHealthChecks: this.esHealthChecks + }, + "The migration was performed with the following following parameters:" + ); + + // Pickup all log files and print a summary of the migration. + const logFilePaths = await glob( + path.join( + os.tmpdir(), + `webiny-5-39-6-meta-fields-data-migration-log-${this.runId}-*.log` + ) + ); + + const migrationStats = { + iterationsCount: 0, + avgIterationDuration: 0, + recordsScanned: 0, + avgRecordsScannedPerIteration: 0, + recordsScannedPerSecond: 0, + recordsUpdated: 0, + recordsSkipped: 0, + esHealthChecks: { + timeSpentWaiting: 0, + checksCount: 0, + unhealthyReasons: {} as Record + } + }; + + for (const logFilePath of logFilePaths) { + const logFileContent = fs.readFileSync(logFilePath, "utf-8"); + const logFile = JSON.parse(logFileContent); + + migrationStats.iterationsCount += logFile.iterationsCount; + migrationStats.recordsScanned += logFile.recordsScanned; + migrationStats.recordsUpdated += logFile.recordsUpdated; + migrationStats.recordsSkipped += logFile.recordsSkipped; + + migrationStats.esHealthChecks.timeSpentWaiting += + logFile.esHealthChecks.timeSpentWaiting; + migrationStats.esHealthChecks.checksCount += logFile.esHealthChecks.checksCount; + + for (const unhealthyReasonType in logFile.esHealthChecks.unhealthyReasons) { + if (!logFile.esHealthChecks.unhealthyReasons.hasOwnProperty(unhealthyReasonType)) { + continue; + } + + const hasCount = + unhealthyReasonType in migrationStats.esHealthChecks.unhealthyReasons; + if (hasCount) { + migrationStats.esHealthChecks.unhealthyReasons[unhealthyReasonType] += + logFile.esHealthChecks.unhealthyReasons[unhealthyReasonType]; + } else { + migrationStats.esHealthChecks.unhealthyReasons[unhealthyReasonType] = + logFile.esHealthChecks.unhealthyReasons[unhealthyReasonType]; + } + } + } + + migrationStats.avgIterationDuration = duration / migrationStats.iterationsCount; + + migrationStats.avgRecordsScannedPerIteration = + migrationStats.recordsScanned / migrationStats.iterationsCount; + + migrationStats.recordsScannedPerSecond = migrationStats.recordsScanned / duration; + + this.logger.info( + migrationStats, + `Migration summary (based on ${logFilePaths.length} generated logs):` + ); + + const logFilePath = path.join( + os.tmpdir(), + `webiny-5-39-6-meta-fields-data-migration-log-${this.runId}.log` + ); + + // Save segment processing stats to a file. + fs.writeFileSync(logFilePath, JSON.stringify(migrationStats, null, 2)); + this.logger.trace(`Migration summary saved to "${logFilePath}".`); + } +} diff --git a/packages/migrations/src/migrations/5.39.6/001/ddb-es/SegmentProcessor.ts b/packages/migrations/src/migrations/5.39.6/001/ddb-es/SegmentProcessor.ts new file mode 100644 index 00000000000..7199d35cf3b --- /dev/null +++ b/packages/migrations/src/migrations/5.39.6/001/ddb-es/SegmentProcessor.ts @@ -0,0 +1,70 @@ +import execa from "execa"; +import path from "path"; +import { EsHealthChecksParams } from "~/migrations/5.39.6/001/ddb-es/utils"; + +interface SegmentProcessorParams { + runId: string; + ddbTable: string; + ddbEsTable: string; + esEndpoint: string; + segmentIndex: number; + totalSegments: number; + esHealthChecks: EsHealthChecksParams; +} + +export class SegmentProcessor { + private readonly runId: string; + private readonly ddbTable: string; + private readonly ddbEsTable: string; + private readonly esEndpoint: string; + private readonly segmentIndex: number; + private readonly totalSegments: number; + private readonly esHealthChecks: EsHealthChecksParams; + + constructor(params: SegmentProcessorParams) { + this.runId = params.runId; + this.ddbTable = params.ddbTable; + this.ddbEsTable = params.ddbEsTable; + this.esEndpoint = params.esEndpoint; + this.segmentIndex = params.segmentIndex; + this.totalSegments = params.totalSegments; + this.esHealthChecks = params.esHealthChecks; + } + + execute() { + return execa( + "node", + [ + path.join(__dirname, "worker"), + "--runId", + this.runId, + "--ddbTable", + this.ddbTable, + "--ddbEsTable", + this.ddbEsTable, + "--esEndpoint", + this.esEndpoint, + "--segmentIndex", + String(this.segmentIndex), + "--totalSegments", + String(this.totalSegments), + + // Elasticsearch health check options. + "--esHealthMinClusterHealthStatus", + this.esHealthChecks.minClusterHealthStatus, + "--esHealthMaxProcessorPercent", + String(this.esHealthChecks.maxProcessorPercent), + "--esHealthMaxRamPercent", + String(this.esHealthChecks.maxRamPercent), + "--esHealthMaxWaitingTime", + String(this.esHealthChecks.maxWaitingTime), + "--esHealthWaitingTimeStep", + String(this.esHealthChecks.waitingTimeStep) + ], + { + stdio: "inherit", + env: process.env + } + ); + } +} diff --git a/packages/migrations/src/migrations/5.39.6/001/ddb-es/bin.ts b/packages/migrations/src/migrations/5.39.6/001/ddb-es/bin.ts new file mode 100644 index 00000000000..f70fc2efe4d --- /dev/null +++ b/packages/migrations/src/migrations/5.39.6/001/ddb-es/bin.ts @@ -0,0 +1,78 @@ +#!/usr/bin/env node +import yargs from "yargs/yargs"; +import { hideBin } from "yargs/helpers"; +import { MetaFieldsMigration } from "./MetaFieldsMigration"; +import { createPinoLogger, getLogLevel } from "@webiny/logger"; +import pinoPretty from "pino-pretty"; +import { + DEFAULT_ES_HEALTH_CHECKS_PARAMS, + EsHealthChecksParams +} from "~/migrations/5.39.6/001/ddb-es/utils"; + +const argv = yargs(hideBin(process.argv)) + .options({ + ddbTable: { type: "string", demandOption: true }, + ddbEsTable: { type: "string", demandOption: true }, + esEndpoint: { type: "string", demandOption: true }, + segments: { type: "number", demandOption: true }, + + // Elasticsearch health check options. + esHealthMinClusterHealthStatus: { + type: "string", + demandOption: false, + default: DEFAULT_ES_HEALTH_CHECKS_PARAMS.minClusterHealthStatus, + description: `Minimum cluster health status to wait for before proceeding with the migration.` + }, + esHealthMaxProcessorPercent: { + type: "number", + demandOption: false, + default: DEFAULT_ES_HEALTH_CHECKS_PARAMS.maxProcessorPercent, + description: `Maximum CPU usage percentage to wait for before proceeding with the migration.` + }, + esHealthMaxRamPercent: { + type: "number", + demandOption: false, + default: DEFAULT_ES_HEALTH_CHECKS_PARAMS.maxRamPercent, + description: `Maximum RAM usage percentage to wait for before proceeding with the migration.` + }, + esHealthMaxWaitingTime: { + type: "number", + demandOption: false, + default: DEFAULT_ES_HEALTH_CHECKS_PARAMS.maxWaitingTime, + description: `Maximum time to wait (seconds) for before proceeding with the migration.` + }, + esHealthWaitingTimeStep: { + type: "number", + demandOption: false, + default: DEFAULT_ES_HEALTH_CHECKS_PARAMS.waitingTimeStep, + description: `Time step (seconds) to wait before checking Elasticsearch health status again.` + } + }) + .parseSync(); + +(async () => { + const logger = createPinoLogger( + { + level: getLogLevel(process.env.MIGRATIONS_LOG_LEVEL, "trace") + }, + pinoPretty({ ignore: "pid,hostname" }) + ); + + const migration = new MetaFieldsMigration({ + totalSegments: argv.segments, + ddbTable: argv.ddbTable, + ddbEsTable: argv.ddbEsTable, + esEndpoint: argv.esEndpoint, + esHealthChecks: { + minClusterHealthStatus: + argv.esHealthMinClusterHealthStatus as EsHealthChecksParams["minClusterHealthStatus"], + maxProcessorPercent: argv.esHealthMaxProcessorPercent, + maxRamPercent: argv.esHealthMaxRamPercent, + maxWaitingTime: argv.esHealthMaxWaitingTime, + waitingTimeStep: argv.esHealthWaitingTimeStep + }, + logger + }); + + await migration.execute(); +})(); diff --git a/packages/migrations/src/migrations/5.39.6/001/ddb-es/createMetaFieldsDataMigrationDeploymentHook.ts b/packages/migrations/src/migrations/5.39.6/001/ddb-es/createMetaFieldsDataMigrationDeploymentHook.ts new file mode 100644 index 00000000000..9d6e22fb61d --- /dev/null +++ b/packages/migrations/src/migrations/5.39.6/001/ddb-es/createMetaFieldsDataMigrationDeploymentHook.ts @@ -0,0 +1,102 @@ +import { CliContext } from "@webiny/cli/types"; +import { getStackOutput } from "@webiny/cli-plugin-deploy-pulumi/utils"; +import { createPinoLogger, getLogLevel } from "@webiny/logger"; +import pinoPretty from "pino-pretty"; +import { + MetaFieldsMigrationParams, + MetaFieldsMigration +} from "~/migrations/5.39.6/001/ddb-es/MetaFieldsMigration"; + +interface CoreOutput { + primaryDynamodbTableName: string; + elasticsearchDynamodbTableName: string; + elasticsearchDomainEndpoint: string; +} + +const REQUIRED_AWS_ENV_VARS = [ + "AWS_REGION", + "AWS_ACCESS_KEY_ID", + "AWS_SECRET_ACCESS_KEY", + "AWS_SESSION_TOKEN" +]; + +const ensureAwsEnvVars = () => { + const missingAwsEnvVars = []; + for (const variable of REQUIRED_AWS_ENV_VARS) { + if (!process.env[variable]) { + missingAwsEnvVars.push(variable); + } + } + + if (missingAwsEnvVars.length > 0) { + throw new Error( + `Cannot run 5.39.6 meta fields data migration. Missing required environment variables: ${missingAwsEnvVars.join( + ", " + )}.` + ); + } +}; + +/** + * Creates an after-deployment hook that triggers the meta fields data migration. + * @param params + */ +export const createMetaFieldsDataMigrationDeploymentHook = ( + params: Pick +) => { + return [ + { + type: "hook-before-deploy", + name: "hook-before-deploy-skip-5-39-6-001-migration", + async hook({ projectApplication }: Record) { + // Only run migrations for `api` app + if (projectApplication.id !== "api") { + return; + } + + process.env.WEBINY_MIGRATION_SKIP_5_39_6_001 = "true"; + } + }, + { + type: "hook-after-deploy", + name: "hook-after-deploy-api-run-5-39-6-meta-fields-data-migrations", + async hook( + { inputs, env, projectApplication }: Record, + context: CliContext + ) { + // Only run migrations for `api` app + if (projectApplication.id !== "api") { + return; + } + + // No need to run migrations if we're doing a preview. + if (inputs.preview) { + return; + } + + ensureAwsEnvVars(); + + const coreOutput = getStackOutput({ folder: "apps/core", env }); + + context.info("Executing 5.39.6-001 meta fields data migration..."); + + const logger = createPinoLogger( + { + level: getLogLevel(process.env.MIGRATIONS_LOG_LEVEL, "trace") + }, + pinoPretty({ ignore: "pid,hostname" }) + ); + + const migration = new MetaFieldsMigration({ + ddbTable: coreOutput.primaryDynamodbTableName, + ddbEsTable: coreOutput.elasticsearchDynamodbTableName, + esEndpoint: coreOutput.elasticsearchDomainEndpoint, + ...params, + logger + }); + + await migration.execute(); + } + } + ]; +}; diff --git a/packages/migrations/src/migrations/5.39.6/001/ddb-es/utils.ts b/packages/migrations/src/migrations/5.39.6/001/ddb-es/utils.ts new file mode 100644 index 00000000000..87bb8d59a8a --- /dev/null +++ b/packages/migrations/src/migrations/5.39.6/001/ddb-es/utils.ts @@ -0,0 +1,64 @@ +import { DynamoDBDocument } from "@webiny/aws-sdk/client-dynamodb"; +import { + ElasticsearchCatClusterHealthStatus, + IWaitUntilHealthyParams +} from "@webiny/api-elasticsearch"; + +export type EsHealthChecksParams = Required; + +export const DEFAULT_ES_HEALTH_CHECKS_PARAMS: EsHealthChecksParams = { + minClusterHealthStatus: ElasticsearchCatClusterHealthStatus.Yellow, + maxProcessorPercent: 90, + maxRamPercent: 100, + maxWaitingTime: 90, + waitingTimeStep: 2 +}; + +export const migrationSkippedDdbRecord = { + PK: "MIGRATION#5.39.6-001", + SK: "A", + data: { + description: "Meta fields data migration (skipped via improved meta fields migration)", + finishedOn: "2024-06-01T12:00:00.000Z", + id: "5.39.6-001", + reason: "skipped", + startedOn: "2024-06-01T12:00:00.000Z" + }, + GSI1_PK: "MIGRATIONS", + GSI1_SK: "5.39.6-001", + TYPE: "migration", + _ct: "2024-06-01T12:00:00.000Z", + _et: "Migration", + _md: "2024-06-01T12:00:00.000Z" +}; + +interface MigrationSkippedDdbRecordParams { + documentClient: DynamoDBDocument; + ddbTable: string; +} + +export const migrationSkippedDdbRecordExists = async ({ + documentClient, + ddbTable +}: MigrationSkippedDdbRecordParams) => { + // Was the migration already executed? + const { Item } = await documentClient.get({ + TableName: ddbTable, + Key: { + PK: "MIGRATION#5.39.6-001", + SK: "A" + } + }); + + return !!Item; +}; + +export const createMigrationSkippedDdbRecord = async ({ + documentClient, + ddbTable +}: MigrationSkippedDdbRecordParams) => { + await documentClient.put({ + TableName: ddbTable, + Item: migrationSkippedDdbRecord + }); +}; diff --git a/packages/migrations/src/migrations/5.39.6/001/ddb-es/worker.ts b/packages/migrations/src/migrations/5.39.6/001/ddb-es/worker.ts new file mode 100644 index 00000000000..9418f20702c --- /dev/null +++ b/packages/migrations/src/migrations/5.39.6/001/ddb-es/worker.ts @@ -0,0 +1,447 @@ +import { executeWithRetry } from "@webiny/utils"; +import { createPinoLogger, getLogLevel } from "@webiny/logger"; +import { createTable } from "@webiny/data-migration"; +import { getDocumentClient } from "@webiny/aws-sdk/client-dynamodb"; +import { createElasticsearchClient } from "@webiny/api-elasticsearch"; +import yargs from "yargs/yargs"; +import { hideBin } from "yargs/helpers"; +import { isMigratedEntry } from "~/migrations/5.39.0/001/utils/isMigratedEntry"; +import { hasValidTypeFieldValue } from "~/migrations/5.39.0/001/utils/hasValidTypeFieldValue"; +import { hasAllNonNullableValues } from "~/migrations/5.39.0/001/utils/hasAllNonNullableValues"; +import { getOldestRevisionCreatedOn } from "~/migrations/5.39.0/001/utils/getOldestRevisionCreatedOn"; +import { getFirstLastPublishedOnBy } from "~/migrations/5.39.0/001/utils/getFirstLastPublishedOn"; +import { assignNewMetaFields } from "~/migrations/5.39.0/001/utils/assignNewMetaFields"; +import { fixTypeFieldValue } from "~/migrations/5.39.0/001/utils/fixTypeFieldValue"; +import { getFallbackIdentity } from "~/migrations/5.39.0/001/utils/getFallbackIdentity"; +import { ensureAllNonNullableValues } from "~/migrations/5.39.0/001/utils/ensureAllNonNullableValues"; +import { getDecompressedData } from "~/migrations/5.39.0/001/utils/getDecompressedData"; +import { getCompressedData } from "~/migrations/5.39.0/001/utils/getCompressedData"; +import { CmsEntry } from "~/migrations/5.39.0/001/types"; +import { + createDdbEntryEntity, + createDdbEsEntryEntity +} from "~/migrations/5.39.0/001/entities/createEntryEntity"; +import { + batchReadAll, + BatchReadItem, + batchWriteAll, + BatchWriteItem, + ddbScanWithCallback +} from "~/utils"; +import { createWaitUntilHealthy } from "@webiny/api-elasticsearch/utils/waitUntilHealthy"; +import pinoPretty from "pino-pretty"; +import { EsHealthChecksParams } from "~/migrations/5.39.6/001/ddb-es/utils"; +import path from "path"; +import os from "os"; +import fs from "fs"; +import { getNonNullableFieldsWithMissingValues } from "~/migrations/5.39.0/001/utils/getNonNullableFieldsWithMissingValues"; + +const argv = yargs(hideBin(process.argv)) + .options({ + runId: { type: "string", demandOption: true }, + ddbTable: { type: "string", demandOption: true }, + ddbEsTable: { type: "string", demandOption: true }, + esEndpoint: { type: "string", demandOption: true }, + segmentIndex: { type: "number", demandOption: true }, + totalSegments: { type: "number", demandOption: true }, + + // Elasticsearch health check options. + esHealthMinClusterHealthStatus: { type: "string", demandOption: true }, + esHealthMaxProcessorPercent: { type: "number", demandOption: true }, + esHealthMaxRamPercent: { type: "number", demandOption: true }, + esHealthMaxWaitingTime: { type: "number", demandOption: true }, + esHealthWaitingTimeStep: { type: "number", demandOption: true } + }) + .parseSync(); + +interface LastEvaluatedKeyObject { + PK: string; + SK: string; + GSI1_PK: string; + GSI1_SK: string; +} + +type LastEvaluatedKey = LastEvaluatedKeyObject | true | null; + +interface MigrationStatus { + lastEvaluatedKey: LastEvaluatedKey; + stats: { + iterationsCount: number; + recordsScanned: number; + recordsUpdated: number; + recordsSkipped: number; + esHealthChecks: { + timeSpentWaiting: number; + checksCount: number; + unhealthyReasons: { + [key: string]: number; + }; + }; + }; +} + +interface DynamoDbElasticsearchRecord { + PK: string; + SK: string; + data: string; +} + +const createInitialStatus = (): MigrationStatus => { + return { + lastEvaluatedKey: null, + stats: { + iterationsCount: 0, + recordsScanned: 0, + recordsUpdated: 0, + recordsSkipped: 0, + esHealthChecks: { + timeSpentWaiting: 0, + checksCount: 0, + unhealthyReasons: {} + } + } + }; +}; + +(async () => { + const logger = createPinoLogger( + { + level: getLogLevel(process.env.MIGRATIONS_LOG_LEVEL, "trace"), + msgPrefix: `[segment #${argv.segmentIndex}] ` + }, + pinoPretty({ ignore: "pid,hostname" }) + ); + + const documentClient = getDocumentClient(); + const elasticsearchClient = createElasticsearchClient({ + endpoint: `https://${argv.esEndpoint}` + }); + + const primaryTable = createTable({ + name: argv.ddbTable, + documentClient + }); + const dynamoToEsTable = createTable({ + name: argv.ddbEsTable, + documentClient + }); + + const ddbEntryEntity = createDdbEntryEntity(primaryTable); + const ddbEsEntryEntity = createDdbEsEntryEntity(dynamoToEsTable); + + const status = createInitialStatus(); + + const waitUntilHealthy = createWaitUntilHealthy(elasticsearchClient, { + minClusterHealthStatus: + argv.esHealthMinClusterHealthStatus as EsHealthChecksParams["minClusterHealthStatus"], + maxProcessorPercent: argv.esHealthMaxProcessorPercent, + maxRamPercent: argv.esHealthMaxRamPercent, + maxWaitingTime: argv.esHealthMaxWaitingTime, + waitingTimeStep: argv.esHealthWaitingTimeStep + }); + + await ddbScanWithCallback( + { + entity: ddbEntryEntity, + options: { + segment: argv.segmentIndex, + segments: argv.totalSegments, + filters: [ + { + attr: "_et", + eq: "CmsEntries" + } + ], + startKey: status.lastEvaluatedKey || undefined, + limit: 100 + } + }, + async result => { + status.stats.iterationsCount++; + status.stats.recordsScanned += result.items.length; + + if (status.stats.iterationsCount % 5 === 0) { + // We log every 5th iteration. + logger.trace( + `[iteration #${status.stats.iterationsCount}] Reading ${result.items.length} record(s)...` + ); + } + + const ddbItemsToBatchWrite: BatchWriteItem[] = []; + const ddbEsItemsToBatchWrite: BatchWriteItem[] = []; + const ddbEsItemsToBatchRead: Record = {}; + + const fallbackDateTime = new Date().toISOString(); + + // Update records in primary DynamoDB table. Also do preparations for + // subsequent updates on DDB-ES DynamoDB table, and in Elasticsearch. + for (const item of result.items) { + const isFullyMigrated = + isMigratedEntry(item) && + hasValidTypeFieldValue(item) && + hasAllNonNullableValues(item); + + if (isFullyMigrated) { + status.stats.recordsSkipped++; + continue; + } + + // 1. Check if the data migration was ever performed. If not, let's perform it. + if (!isMigratedEntry(item)) { + // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value. + const createdOn = await getOldestRevisionCreatedOn({ + entry: item, + entryEntity: ddbEntryEntity + }); + + const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({ + entry: item, + entryEntity: ddbEntryEntity + }); + + assignNewMetaFields(item, { + createdOn, + ...firstLastPublishedOnByFields + }); + } + + // 2. We've noticed some of the records had an invalid `TYPE` field value + // in the database. This step addresses this issue. + if (!hasValidTypeFieldValue(item)) { + // Fixes the value of the `TYPE` field, if it's not valid. + fixTypeFieldValue(item); + } + + // 3. Finally, once both of the steps were performed, ensure that all + // new non-nullable meta fields have a value and nothing is missing. + if (!hasAllNonNullableValues(item)) { + logger.trace( + getNonNullableFieldsWithMissingValues(item), + `Detected an entry with missing values for non-nullable meta fields (${item.modelId}/${item.id}).` + ); + + try { + const fallbackIdentity = await getFallbackIdentity({ + entity: ddbEntryEntity, + tenant: item.tenant + }); + + ensureAllNonNullableValues(item, { + dateTime: fallbackDateTime, + identity: fallbackIdentity + }); + + logger.trace( + `Successfully ensured all non-nullable meta fields have values (${item.modelId}/${item.id}). Will be saving into the database soon.` + ); + } catch (e) { + logger.debug( + `Failed to ensure all non-nullable meta fields have values (${item.modelId}/${item.id}): ${e.message}` + ); + } + } + + ddbItemsToBatchWrite.push(ddbEntryEntity.putBatch(item)); + + /** + * Prepare the loading of DynamoDB Elasticsearch part of the records. + */ + + const ddbEsLatestRecordKey = `${item.entryId}:L`; + if (ddbEsItemsToBatchRead[ddbEsLatestRecordKey]) { + continue; + } + + ddbEsItemsToBatchRead[ddbEsLatestRecordKey] = ddbEsEntryEntity.getBatch({ + PK: item.PK, + SK: "L" + }); + + const ddbEsPublishedRecordKey = `${item.entryId}:P`; + if (item.status === "published" || !!item.locked) { + ddbEsItemsToBatchRead[ddbEsPublishedRecordKey] = ddbEsEntryEntity.getBatch({ + PK: item.PK, + SK: "P" + }); + } + } + + if (Object.keys(ddbEsItemsToBatchRead).length > 0) { + /** + * Get all the records from DynamoDB Elasticsearch. + */ + const ddbEsRecords = await batchReadAll({ + table: ddbEsEntryEntity.table, + items: Object.values(ddbEsItemsToBatchRead) + }); + + for (const ddbEsRecord of ddbEsRecords) { + const decompressedData = await getDecompressedData(ddbEsRecord.data); + if (!decompressedData) { + logger.trace( + `[DDB-ES Table] Skipping record "${ddbEsRecord.PK}" as it is not a valid CMS entry...` + ); + continue; + } + + // 1. Check if the data migration was ever performed. If not, let's perform it. + if (!isMigratedEntry(decompressedData)) { + // Get the oldest revision's `createdOn` value. We use that to set the entry-level `createdOn` value. + const createdOn = await getOldestRevisionCreatedOn({ + entry: { ...decompressedData, PK: ddbEsRecord.PK }, + entryEntity: ddbEntryEntity + }); + + const firstLastPublishedOnByFields = await getFirstLastPublishedOnBy({ + entry: { ...decompressedData, PK: ddbEsRecord.PK }, + entryEntity: ddbEntryEntity + }); + + assignNewMetaFields(decompressedData, { + createdOn, + ...firstLastPublishedOnByFields + }); + } + + // 2. Ensure new non-nullable meta fields have a value and nothing is missing. + if (!hasAllNonNullableValues(decompressedData)) { + logger.trace( + getNonNullableFieldsWithMissingValues(decompressedData), + [ + `[DDB-ES Table] Detected an entry with missing values for non-nullable meta fields`, + `(${decompressedData.modelId}/${decompressedData.id}).` + ].join(" ") + ); + + try { + const fallbackIdentity = await getFallbackIdentity({ + entity: ddbEntryEntity, + tenant: decompressedData.tenant + }); + + ensureAllNonNullableValues(decompressedData, { + dateTime: fallbackDateTime, + identity: fallbackIdentity + }); + + logger.trace( + [ + `[DDB-ES Table] Successfully ensured all non-nullable meta fields`, + `have values (${decompressedData.modelId}/${decompressedData.id}).`, + "Will be saving the changes soon." + ].join(" ") + ); + } catch (e) { + logger.error( + [ + "[DDB-ES Table] Failed to ensure all non-nullable meta fields have values", + `(${decompressedData.modelId}/${decompressedData.id}): ${e.message}` + ].join(" ") + ); + } + } + + const compressedData = await getCompressedData(decompressedData); + + ddbEsItemsToBatchWrite.push( + ddbEsEntryEntity.putBatch({ + ...ddbEsRecord, + data: compressedData + }) + ); + } + } + + if (ddbItemsToBatchWrite.length) { + // Store data in primary DynamoDB table. + const execute = () => { + return batchWriteAll({ + table: ddbEntryEntity.table, + items: ddbItemsToBatchWrite + }); + }; + + logger.trace( + `Storing ${ddbItemsToBatchWrite.length} record(s) in primary DynamoDB table...` + ); + await executeWithRetry(execute, { + onFailedAttempt: error => { + logger.warn( + `Batch write attempt #${error.attemptNumber} failed: ${error.message}` + ); + } + }); + + if (ddbEsItemsToBatchWrite.length) { + logger.trace( + `Storing ${ddbEsItemsToBatchWrite.length} record(s) in DDB-ES DynamoDB table...` + ); + const results = await waitUntilHealthy.wait({ + async onUnhealthy(params) { + const shouldWaitReason = params.waitingReason.name; + + logger.warn( + `Cluster is unhealthy (${shouldWaitReason}). Waiting for the cluster to become healthy...`, + params + ); + + if (status.stats.esHealthChecks.unhealthyReasons[shouldWaitReason]) { + status.stats.esHealthChecks.unhealthyReasons[shouldWaitReason]++; + } else { + status.stats.esHealthChecks.unhealthyReasons[shouldWaitReason] = 1; + } + } + }); + + status.stats.esHealthChecks.checksCount++; + status.stats.esHealthChecks.timeSpentWaiting += results.runningTime; + + // Store data in DDB-ES DynamoDB table. + const executeDdbEs = () => { + return batchWriteAll({ + table: ddbEsEntryEntity.table, + items: ddbEsItemsToBatchWrite + }); + }; + + await executeWithRetry(executeDdbEs, { + onFailedAttempt: error => { + logger.warn( + `[DDB-ES Table] Batch write attempt #${error.attemptNumber} failed: ${error.message}` + ); + } + }); + } + + status.stats.recordsUpdated += ddbItemsToBatchWrite.length; + } + + // Update checkpoint after every batch. + let lastEvaluatedKey: LastEvaluatedKey = true; + if (result.lastEvaluatedKey) { + lastEvaluatedKey = result.lastEvaluatedKey as unknown as LastEvaluatedKeyObject; + } + + status.lastEvaluatedKey = lastEvaluatedKey; + + if (lastEvaluatedKey === true) { + return false; + } + + // Continue further scanning. + return true; + } + ); + + // Store status in tmp file. + logger.trace({ status }, "Segment processing completed. Saving status to tmp file..."); + const logFilePath = path.join( + os.tmpdir(), + `webiny-5-39-6-meta-fields-data-migration-log-${argv.runId}-${argv.segmentIndex}.log` + ); + + // Save segment processing stats to a file. + fs.writeFileSync(logFilePath, JSON.stringify(status.stats, null, 2)); + + logger.trace(`Segment processing stats saved in ${logFilePath}.`); +})(); diff --git a/packages/migrations/src/utils/elasticsearch/esListIndexes.ts b/packages/migrations/src/utils/elasticsearch/esListIndexes.ts new file mode 100644 index 00000000000..b5aaaf15e03 --- /dev/null +++ b/packages/migrations/src/utils/elasticsearch/esListIndexes.ts @@ -0,0 +1,25 @@ +import { Client } from "@elastic/elasticsearch"; + +export interface ListIndexesParams { + elasticsearchClient: Client; + match?: string; +} + +type IndicesApiResponse = Array>; + +export const esListIndexes = async (params: ListIndexesParams): Promise => { + const { elasticsearchClient } = params; + + const response = await elasticsearchClient.cat.indices({ + format: "json" + }); + + const listOfIndexes = response.body.map(item => item.index); + + const match = params.match; + if (match) { + return listOfIndexes.filter(index => index.includes(match)); + } + + return listOfIndexes; +}; diff --git a/packages/migrations/src/utils/elasticsearch/index.ts b/packages/migrations/src/utils/elasticsearch/index.ts index e2c58d4628f..64235c94f5f 100644 --- a/packages/migrations/src/utils/elasticsearch/index.ts +++ b/packages/migrations/src/utils/elasticsearch/index.ts @@ -6,7 +6,7 @@ export * from "./esGetIndexSettings"; export * from "./esPutIndexSettings"; export * from "./esQueryAllWithCallback"; export * from "./esQueryAll"; - +export * from "./esListIndexes"; export * from "./disableEsIndexing"; export * from "./fetchOriginalEsSettings"; export * from "./restoreOriginalEsSettings"; diff --git a/yarn.lock b/yarn.lock index 3bd1858232c..eec9ca56019 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18761,6 +18761,7 @@ __metadata: "@webiny/api-headless-cms-ddb-es": 0.0.0 "@webiny/aws-sdk": 0.0.0 "@webiny/cli": 0.0.0 + "@webiny/cli-plugin-deploy-pulumi": 0.0.0 "@webiny/data-migration": 0.0.0 "@webiny/db-dynamodb": 0.0.0 "@webiny/error": 0.0.0 @@ -18771,12 +18772,16 @@ __metadata: "@webiny/project-utils": 0.0.0 "@webiny/utils": 0.0.0 elastic-ts: ^0.8.0 + execa: ^5.0.0 + fast-glob: ^3.2.7 jest-dynalite: ^3.2.0 jsonpack: ^1.1.5 lodash: ^4.17.21 + pino-pretty: ^9.4.0 pluralize: ^8.0.0 ttypescript: ^1.5.13 typescript: 4.7.4 + yargs: ^17.4.0 languageName: unknown linkType: soft From 49e39588e8ccf2acd3351643856692f8011c5136 Mon Sep 17 00:00:00 2001 From: Adrian Smijulj Date: Fri, 7 Jun 2024 15:29:29 +0200 Subject: [PATCH 17/26] fix: deprecate `publishedOn` and `ownedBy` fields and make new meta fields nullable (#4156) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bruno Zorić --- .../contentAPI/snapshots/category.manage.ts | 23 ++++++++++++------- .../contentAPI/snapshots/category.read.ts | 23 ++++++++++++------- .../contentAPI/snapshots/page.manage.ts | 23 ++++++++++++------- .../contentAPI/snapshots/page.read.ts | 23 ++++++++++++------- .../contentAPI/snapshots/product.manage.ts | 23 ++++++++++++------- .../contentAPI/snapshots/product.read.ts | 23 ++++++++++++------- .../contentAPI/snapshots/review.manage.ts | 23 ++++++++++++------- .../contentAPI/snapshots/review.read.ts | 23 ++++++++++++------- .../src/graphql/schema/contentEntries.ts | 5 ++-- .../src/graphql/schema/createManageSDL.ts | 8 ++++--- .../src/graphql/schema/createReadSDL.ts | 12 ++++++---- .../ContentEntry/RevisionListItem.tsx | 3 ++- packages/migrations/package.json | 1 - packages/serverless-cms-aws/webiny.config.js | 5 ++++ 14 files changed, 141 insertions(+), 77 deletions(-) diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/category.manage.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/category.manage.ts index 3c23c7b336c..c3f64894029 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/category.manage.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/category.manage.ts @@ -6,27 +6,34 @@ export default /* GraphQL */ ` id: ID! entryId: String! - createdOn: DateTime! + createdOn: DateTime modifiedOn: DateTime - savedOn: DateTime! + savedOn: DateTime firstPublishedOn: DateTime lastPublishedOn: DateTime - createdBy: CmsIdentity! + createdBy: CmsIdentity modifiedBy: CmsIdentity - savedBy: CmsIdentity! + savedBy: CmsIdentity firstPublishedBy: CmsIdentity lastPublishedBy: CmsIdentity - revisionCreatedOn: DateTime! + revisionCreatedOn: DateTime revisionModifiedOn: DateTime - revisionSavedOn: DateTime! + revisionSavedOn: DateTime revisionFirstPublishedOn: DateTime revisionLastPublishedOn: DateTime - revisionCreatedBy: CmsIdentity! + revisionCreatedBy: CmsIdentity revisionModifiedBy: CmsIdentity - revisionSavedBy: CmsIdentity! + revisionSavedBy: CmsIdentity revisionFirstPublishedBy: CmsIdentity revisionLastPublishedBy: CmsIdentity + publishedOn: DateTime + @deprecated( + reason: "Field was removed with the 5.39.0 release. Use 'firstPublishedOn' or 'lastPublishedOn' field." + ) + ownedBy: CmsIdentity + @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") + meta: CategoryApiNameWhichIsABitDifferentThanModelIdMeta title: String slug: String diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/category.read.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/category.read.ts index f90117705f3..7de8f2863aa 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/category.read.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/category.read.ts @@ -7,27 +7,34 @@ export default /* GraphQL */ ` entryId: String! modelId: String! - createdOn: DateTime! + createdOn: DateTime modifiedOn: DateTime - savedOn: DateTime! + savedOn: DateTime firstPublishedOn: DateTime lastPublishedOn: DateTime - createdBy: CmsIdentity! + createdBy: CmsIdentity modifiedBy: CmsIdentity - savedBy: CmsIdentity! + savedBy: CmsIdentity firstPublishedBy: CmsIdentity lastPublishedBy: CmsIdentity - revisionCreatedOn: DateTime! + revisionCreatedOn: DateTime revisionModifiedOn: DateTime - revisionSavedOn: DateTime! + revisionSavedOn: DateTime revisionFirstPublishedOn: DateTime revisionLastPublishedOn: DateTime - revisionCreatedBy: CmsIdentity! + revisionCreatedBy: CmsIdentity revisionModifiedBy: CmsIdentity - revisionSavedBy: CmsIdentity! + revisionSavedBy: CmsIdentity revisionFirstPublishedBy: CmsIdentity revisionLastPublishedBy: CmsIdentity + publishedOn: DateTime + @deprecated( + reason: "Field was removed with the 5.39.0 release. Use 'firstPublishedOn' or 'lastPublishedOn' field." + ) + ownedBy: CmsIdentity + @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") + title: String slug: String } diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.manage.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.manage.ts index 5e32beeeeaa..6b5e46dd221 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.manage.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.manage.ts @@ -6,27 +6,34 @@ export default /* GraphQL */ ` id: ID! entryId: String! - createdOn: DateTime! + createdOn: DateTime modifiedOn: DateTime - savedOn: DateTime! + savedOn: DateTime firstPublishedOn: DateTime lastPublishedOn: DateTime - createdBy: CmsIdentity! + createdBy: CmsIdentity modifiedBy: CmsIdentity - savedBy: CmsIdentity! + savedBy: CmsIdentity firstPublishedBy: CmsIdentity lastPublishedBy: CmsIdentity - revisionCreatedOn: DateTime! + revisionCreatedOn: DateTime revisionModifiedOn: DateTime - revisionSavedOn: DateTime! + revisionSavedOn: DateTime revisionFirstPublishedOn: DateTime revisionLastPublishedOn: DateTime - revisionCreatedBy: CmsIdentity! + revisionCreatedBy: CmsIdentity revisionModifiedBy: CmsIdentity - revisionSavedBy: CmsIdentity! + revisionSavedBy: CmsIdentity revisionFirstPublishedBy: CmsIdentity revisionLastPublishedBy: CmsIdentity + publishedOn: DateTime + @deprecated( + reason: "Field was removed with the 5.39.0 release. Use 'firstPublishedOn' or 'lastPublishedOn' field." + ) + ownedBy: CmsIdentity + @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") + meta: PageModelApiNameMeta content: [PageModelApiName_Content!] header: PageModelApiName_Header diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.read.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.read.ts index 076f8eb527f..e7126235413 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.read.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.read.ts @@ -7,27 +7,34 @@ export default /* GraphQL */ ` entryId: String! modelId: String! - createdOn: DateTime! + createdOn: DateTime modifiedOn: DateTime - savedOn: DateTime! + savedOn: DateTime firstPublishedOn: DateTime lastPublishedOn: DateTime - createdBy: CmsIdentity! + createdBy: CmsIdentity modifiedBy: CmsIdentity - savedBy: CmsIdentity! + savedBy: CmsIdentity firstPublishedBy: CmsIdentity lastPublishedBy: CmsIdentity - revisionCreatedOn: DateTime! + revisionCreatedOn: DateTime revisionModifiedOn: DateTime - revisionSavedOn: DateTime! + revisionSavedOn: DateTime revisionFirstPublishedOn: DateTime revisionLastPublishedOn: DateTime - revisionCreatedBy: CmsIdentity! + revisionCreatedBy: CmsIdentity revisionModifiedBy: CmsIdentity - revisionSavedBy: CmsIdentity! + revisionSavedBy: CmsIdentity revisionFirstPublishedBy: CmsIdentity revisionLastPublishedBy: CmsIdentity + publishedOn: DateTime + @deprecated( + reason: "Field was removed with the 5.39.0 release. Use 'firstPublishedOn' or 'lastPublishedOn' field." + ) + ownedBy: CmsIdentity + @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") + content: [PageModelApiName_Content!] header: PageModelApiName_Header objective: PageModelApiName_Objective diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.manage.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.manage.ts index 1723f40791f..5573282aff8 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.manage.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.manage.ts @@ -6,27 +6,34 @@ export default /* GraphQL */ ` id: ID! entryId: String! - createdOn: DateTime! + createdOn: DateTime modifiedOn: DateTime - savedOn: DateTime! + savedOn: DateTime firstPublishedOn: DateTime lastPublishedOn: DateTime - createdBy: CmsIdentity! + createdBy: CmsIdentity modifiedBy: CmsIdentity - savedBy: CmsIdentity! + savedBy: CmsIdentity firstPublishedBy: CmsIdentity lastPublishedBy: CmsIdentity - revisionCreatedOn: DateTime! + revisionCreatedOn: DateTime revisionModifiedOn: DateTime - revisionSavedOn: DateTime! + revisionSavedOn: DateTime revisionFirstPublishedOn: DateTime revisionLastPublishedOn: DateTime - revisionCreatedBy: CmsIdentity! + revisionCreatedBy: CmsIdentity revisionModifiedBy: CmsIdentity - revisionSavedBy: CmsIdentity! + revisionSavedBy: CmsIdentity revisionFirstPublishedBy: CmsIdentity revisionLastPublishedBy: CmsIdentity + publishedOn: DateTime + @deprecated( + reason: "Field was removed with the 5.39.0 release. Use 'firstPublishedOn' or 'lastPublishedOn' field." + ) + ownedBy: CmsIdentity + @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") + meta: ProductApiSingularMeta title: String category: RefField diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.read.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.read.ts index 1d5de91a282..2d0c7afcb75 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.read.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.read.ts @@ -7,27 +7,34 @@ export default /* GraphQL */ ` entryId: String! modelId: String! - createdOn: DateTime! + createdOn: DateTime modifiedOn: DateTime - savedOn: DateTime! + savedOn: DateTime firstPublishedOn: DateTime lastPublishedOn: DateTime - createdBy: CmsIdentity! + createdBy: CmsIdentity modifiedBy: CmsIdentity - savedBy: CmsIdentity! + savedBy: CmsIdentity firstPublishedBy: CmsIdentity lastPublishedBy: CmsIdentity - revisionCreatedOn: DateTime! + revisionCreatedOn: DateTime revisionModifiedOn: DateTime - revisionSavedOn: DateTime! + revisionSavedOn: DateTime revisionFirstPublishedOn: DateTime revisionLastPublishedOn: DateTime - revisionCreatedBy: CmsIdentity! + revisionCreatedBy: CmsIdentity revisionModifiedBy: CmsIdentity - revisionSavedBy: CmsIdentity! + revisionSavedBy: CmsIdentity revisionFirstPublishedBy: CmsIdentity revisionLastPublishedBy: CmsIdentity + publishedOn: DateTime + @deprecated( + reason: "Field was removed with the 5.39.0 release. Use 'firstPublishedOn' or 'lastPublishedOn' field." + ) + ownedBy: CmsIdentity + @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") + title: String category(populate: Boolean = true): CategoryApiNameWhichIsABitDifferentThanModelId price: Number diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.manage.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.manage.ts index a608d0bdff7..4f2ebc9ad92 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.manage.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.manage.ts @@ -6,27 +6,34 @@ export default /* GraphQL */ ` id: ID! entryId: String! - createdOn: DateTime! + createdOn: DateTime modifiedOn: DateTime - savedOn: DateTime! + savedOn: DateTime firstPublishedOn: DateTime lastPublishedOn: DateTime - createdBy: CmsIdentity! + createdBy: CmsIdentity modifiedBy: CmsIdentity - savedBy: CmsIdentity! + savedBy: CmsIdentity firstPublishedBy: CmsIdentity lastPublishedBy: CmsIdentity - revisionCreatedOn: DateTime! + revisionCreatedOn: DateTime revisionModifiedOn: DateTime - revisionSavedOn: DateTime! + revisionSavedOn: DateTime revisionFirstPublishedOn: DateTime revisionLastPublishedOn: DateTime - revisionCreatedBy: CmsIdentity! + revisionCreatedBy: CmsIdentity revisionModifiedBy: CmsIdentity - revisionSavedBy: CmsIdentity! + revisionSavedBy: CmsIdentity revisionFirstPublishedBy: CmsIdentity revisionLastPublishedBy: CmsIdentity + publishedOn: DateTime + @deprecated( + reason: "Field was removed with the 5.39.0 release. Use 'firstPublishedOn' or 'lastPublishedOn' field." + ) + ownedBy: CmsIdentity + @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") + meta: ReviewApiModelMeta text: String product: RefField diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.read.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.read.ts index d194fb3c122..96dea2264f1 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.read.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.read.ts @@ -7,27 +7,34 @@ export default /* GraphQL */ ` entryId: String! modelId: String! - createdOn: DateTime! + createdOn: DateTime modifiedOn: DateTime - savedOn: DateTime! + savedOn: DateTime firstPublishedOn: DateTime lastPublishedOn: DateTime - createdBy: CmsIdentity! + createdBy: CmsIdentity modifiedBy: CmsIdentity - savedBy: CmsIdentity! + savedBy: CmsIdentity firstPublishedBy: CmsIdentity lastPublishedBy: CmsIdentity - revisionCreatedOn: DateTime! + revisionCreatedOn: DateTime revisionModifiedOn: DateTime - revisionSavedOn: DateTime! + revisionSavedOn: DateTime revisionFirstPublishedOn: DateTime revisionLastPublishedOn: DateTime - revisionCreatedBy: CmsIdentity! + revisionCreatedBy: CmsIdentity revisionModifiedBy: CmsIdentity - revisionSavedBy: CmsIdentity! + revisionSavedBy: CmsIdentity revisionFirstPublishedBy: CmsIdentity revisionLastPublishedBy: CmsIdentity + publishedOn: DateTime + @deprecated( + reason: "Field was removed with the 5.39.0 release. Use 'firstPublishedOn' or 'lastPublishedOn' field." + ) + ownedBy: CmsIdentity + @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") + text: String product(populate: Boolean = true): ProductApiSingular rating: Number diff --git a/packages/api-headless-cms/src/graphql/schema/contentEntries.ts b/packages/api-headless-cms/src/graphql/schema/contentEntries.ts index 4e82f68c218..0c8afa159fa 100644 --- a/packages/api-headless-cms/src/graphql/schema/contentEntries.ts +++ b/packages/api-headless-cms/src/graphql/schema/contentEntries.ts @@ -8,7 +8,7 @@ import { getEntryDescription } from "~/utils/getEntryDescription"; import { getEntryImage } from "~/utils/getEntryImage"; import { entryFieldFromStorageTransform } from "~/utils/entryStorage"; import { Resolvers } from "@webiny/handler-graphql/types"; -import { ENTRY_META_FIELDS, isNullableEntryMetaField, isDateTimeEntryMetaField } from "~/constants"; +import { ENTRY_META_FIELDS, isDateTimeEntryMetaField } from "~/constants"; interface EntriesByModel { [key: string]: string[]; @@ -321,10 +321,9 @@ export const createContentEntriesSchema = ({ } const onByMetaFields = ENTRY_META_FIELDS.map(field => { - const isNullable = isNullableEntryMetaField(field) ? "" : "!"; const fieldType = isDateTimeEntryMetaField(field) ? "DateTime" : "CmsIdentity"; - return `${field}: ${fieldType}${isNullable}`; + return `${field}: ${fieldType}`; }).join("\n"); const plugin = new CmsGraphQLSchemaPlugin({ diff --git a/packages/api-headless-cms/src/graphql/schema/createManageSDL.ts b/packages/api-headless-cms/src/graphql/schema/createManageSDL.ts index 21e1ffd0265..2a15c226a65 100644 --- a/packages/api-headless-cms/src/graphql/schema/createManageSDL.ts +++ b/packages/api-headless-cms/src/graphql/schema/createManageSDL.ts @@ -5,7 +5,7 @@ import { renderGetFilterFields } from "~/utils/renderGetFilterFields"; import { renderInputFields } from "~/utils/renderInputFields"; import { renderFields } from "~/utils/renderFields"; import { CmsGraphQLSchemaSorterPlugin } from "~/plugins"; -import { ENTRY_META_FIELDS, isDateTimeEntryMetaField, isNullableEntryMetaField } from "~/constants"; +import { ENTRY_META_FIELDS, isDateTimeEntryMetaField } from "~/constants"; interface CreateManageSDLParams { models: CmsModel[]; @@ -70,10 +70,9 @@ export const createManageSDL: CreateManageSDL = ({ }).join("\n"); const onByMetaGqlFields = ENTRY_META_FIELDS.map(field => { - const isNullable = isNullableEntryMetaField(field) ? "" : "!"; const fieldType = isDateTimeEntryMetaField(field) ? "DateTime" : "CmsIdentity"; - return `${field}: ${fieldType}${isNullable}`; + return `${field}: ${fieldType}`; }).join("\n"); // Had to remove /* GraphQL */ because prettier would not format the code correctly. @@ -85,6 +84,9 @@ export const createManageSDL: CreateManageSDL = ({ ${onByMetaGqlFields} + publishedOn: DateTime @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'firstPublishedOn' or 'lastPublishedOn' field.") + ownedBy: CmsIdentity @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") + meta: ${singularName}Meta ${fields.map(f => f.fields).join("\n")} # Advanced Content Organization - make required in 5.38.0 diff --git a/packages/api-headless-cms/src/graphql/schema/createReadSDL.ts b/packages/api-headless-cms/src/graphql/schema/createReadSDL.ts index 8fac945cdcf..58daebfda8f 100644 --- a/packages/api-headless-cms/src/graphql/schema/createReadSDL.ts +++ b/packages/api-headless-cms/src/graphql/schema/createReadSDL.ts @@ -4,7 +4,7 @@ import { renderSortEnum } from "~/utils/renderSortEnum"; import { renderFields } from "~/utils/renderFields"; import { renderGetFilterFields } from "~/utils/renderGetFilterFields"; import { CmsGraphQLSchemaSorterPlugin } from "~/plugins"; -import { ENTRY_META_FIELDS, isDateTimeEntryMetaField, isNullableEntryMetaField } from "~/constants"; +import { ENTRY_META_FIELDS, isDateTimeEntryMetaField } from "~/constants"; interface CreateReadSDLParams { models: CmsModel[]; @@ -57,11 +57,10 @@ export const createReadSDL: CreateReadSDL = ({ const { singularApiName: singularName, pluralApiName: pluralName } = model; - const onByMetaFields = ENTRY_META_FIELDS.map(field => { - const isNullable = isNullableEntryMetaField(field) ? "" : "!"; + const onByMetaGqlFields = ENTRY_META_FIELDS.map(field => { const fieldType = isDateTimeEntryMetaField(field) ? "DateTime" : "CmsIdentity"; - return `${field}: ${fieldType}${isNullable}`; + return `${field}: ${fieldType}`; }).join("\n"); return ` @@ -71,7 +70,10 @@ export const createReadSDL: CreateReadSDL = ({ entryId: String! ${hasModelIdField ? "" : "modelId: String!"} - ${onByMetaFields} + ${onByMetaGqlFields} + + publishedOn: DateTime @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'firstPublishedOn' or 'lastPublishedOn' field.") + ownedBy: CmsIdentity @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") ${fieldsRender.map(f => f.fields).join("\n")} } diff --git a/packages/app-headless-cms/src/admin/views/contentEntries/ContentEntry/RevisionListItem.tsx b/packages/app-headless-cms/src/admin/views/contentEntries/ContentEntry/RevisionListItem.tsx index dff359cda42..9e448d4c45c 100644 --- a/packages/app-headless-cms/src/admin/views/contentEntries/ContentEntry/RevisionListItem.tsx +++ b/packages/app-headless-cms/src/admin/views/contentEntries/ContentEntry/RevisionListItem.tsx @@ -102,7 +102,8 @@ const RevisionListItem = ({ revision }: RevisionListItemProps) => { {revision.meta.title || t`N/A`} {t`Last modified by {author} on {time} (#{version})`({ - author: revision.revisionCreatedBy.displayName, + // Added this because revisionCreatedBy can be returned as null from GraphQL. + author: revision.revisionCreatedBy?.displayName, time: , version: revision.meta.version })} diff --git a/packages/migrations/package.json b/packages/migrations/package.json index d9fb975aa62..5ff5ff2df1a 100644 --- a/packages/migrations/package.json +++ b/packages/migrations/package.json @@ -1,7 +1,6 @@ { "name": "@webiny/migrations", "version": "0.0.0", - "private": true, "scripts": { "build": "yarn webiny run build", "watch": "yarn webiny run watch" diff --git a/packages/serverless-cms-aws/webiny.config.js b/packages/serverless-cms-aws/webiny.config.js index 4bf68f857df..54680f28c53 100644 --- a/packages/serverless-cms-aws/webiny.config.js +++ b/packages/serverless-cms-aws/webiny.config.js @@ -4,6 +4,11 @@ const { Listr } = require("listr2"); const { createWatchPackage, createBuildPackage } = require("@webiny/project-utils"); async function buildHandlers(options) { + if (process.env.WEBINY_SERVERLESS_CMS_AWS_SKIP_PREPUBLISH_ONLY === "true") { + console.log("Skipping building of handlers..."); + return; + } + // Bundle all handlers. These are then used directly in real Webiny projects. const handlerPaths = glob.sync(`${__dirname}/handlers/**/webiny.config.js`); From 1359b71a00dbe6d0212272f84cfe64174318e960 Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Sat, 8 Jun 2024 20:54:42 +0200 Subject: [PATCH 18/26] fix(api-security-auth0): expose tenant access control --- .../api-security-auth0/src/createAuth0.ts | 14 +++++--- .../src/createGroupAuthorizer.ts | 32 +++++++++++++------ packages/api-security-auth0/src/types.ts | 8 +++++ 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/packages/api-security-auth0/src/createAuth0.ts b/packages/api-security-auth0/src/createAuth0.ts index b02bb16580e..7a1cff7e0e4 100644 --- a/packages/api-security-auth0/src/createAuth0.ts +++ b/packages/api-security-auth0/src/createAuth0.ts @@ -3,12 +3,17 @@ import { createGroupAuthorizer, GroupAuthorizerConfig } from "~/createGroupAutho import { createIdentityType } from "~/createIdentityType"; import { createAdminUsersHooks } from "./createAdminUsersHooks"; import { extendTenancy } from "./extendTenancy"; +import { Context } from "~/types"; -export interface CreateAuth0Config extends AuthenticatorConfig, GroupAuthorizerConfig { +export interface CreateAuth0Config + extends AuthenticatorConfig, + GroupAuthorizerConfig { graphQLIdentityType?: string; } -export const createAuth0 = (config: CreateAuth0Config) => { +export const createAuth0 = ( + config: CreateAuth0Config +) => { const identityType = config.identityType || "admin"; const graphQLIdentityType = config.graphQLIdentityType || "Auth0Identity"; @@ -17,10 +22,11 @@ export const createAuth0 = (config: CreateAuth0Config) => { domain: config.domain, getIdentity: config.getIdentity }), - createGroupAuthorizer({ + createGroupAuthorizer({ identityType, getGroupSlug: config.getGroupSlug, - inheritGroupsFromParentTenant: config.inheritGroupsFromParentTenant + inheritGroupsFromParentTenant: config.inheritGroupsFromParentTenant, + canAccessTenant: config.canAccessTenant }), createIdentityType({ identityType, diff --git a/packages/api-security-auth0/src/createGroupAuthorizer.ts b/packages/api-security-auth0/src/createGroupAuthorizer.ts index 0e5fd39284b..1704b7ab701 100644 --- a/packages/api-security-auth0/src/createGroupAuthorizer.ts +++ b/packages/api-security-auth0/src/createGroupAuthorizer.ts @@ -1,14 +1,10 @@ -import { SecurityContext } from "@webiny/api-security/types"; import { ContextPlugin } from "@webiny/handler"; -import { TenancyContext } from "@webiny/api-tenancy/types"; -import { I18NContext } from "@webiny/api-i18n/types"; import { getPermissionsFromSecurityGroupsForLocale } from "@webiny/api-security"; - -type Context = TenancyContext & SecurityContext & I18NContext; +import { Context } from "~/types"; export type GroupSlug = string | undefined; -export interface GroupAuthorizerConfig { +export interface GroupAuthorizerConfig { /** * Specify an `identityType` if you want to only run this authorizer for specific identities. */ @@ -17,16 +13,23 @@ export interface GroupAuthorizerConfig { /** * Get a group slug to load permissions from. */ - getGroupSlug(context: Context): Promise | GroupSlug; + getGroupSlug?: (context: TContext) => Promise | GroupSlug; /** * If a security group is not found, try loading it from a parent tenant (default: true). */ inheritGroupsFromParentTenant?: boolean; + + /** + * Check whether the current identity is authorized to access the current tenant. + */ + canAccessTenant?: (context: TContext) => boolean | Promise; } -export const createGroupAuthorizer = (config: GroupAuthorizerConfig) => { - return new ContextPlugin(context => { +export const createGroupAuthorizer = ( + config: GroupAuthorizerConfig +) => { + return new ContextPlugin(context => { const { security } = context; security.addAuthorizer(async () => { const identity = security.getIdentity(); @@ -46,7 +49,16 @@ export const createGroupAuthorizer = (config: GroupAuthorizerConfig) => { return null; } - const groupSlug = await config.getGroupSlug(context); + if (config.canAccessTenant) { + const canAccessTenant = await config.canAccessTenant(context); + if (!canAccessTenant) { + return []; + } + } + + const groupSlug = config.getGroupSlug + ? await config.getGroupSlug(context) + : identity.group; if (!groupSlug) { return null; diff --git a/packages/api-security-auth0/src/types.ts b/packages/api-security-auth0/src/types.ts index ae9745e8963..ca9144be4f8 100644 --- a/packages/api-security-auth0/src/types.ts +++ b/packages/api-security-auth0/src/types.ts @@ -1,7 +1,15 @@ import "@webiny/api-tenancy/types"; +import { SecurityContext } from "@webiny/api-security/types"; +import { TenancyContext } from "@webiny/api-tenancy/types"; +import { I18NContext } from "@webiny/api-i18n/types"; declare module "@webiny/api-tenancy/types" { interface TenantSettings { appClientId: string; } } + +/** + * @internal + */ +export type Context = TenancyContext & SecurityContext & I18NContext; From c1849b33c04115a12008e1b060f42682435d735b Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Mon, 10 Jun 2024 15:15:12 +0200 Subject: [PATCH 19/26] fix(api-form-builder): check both global and form recaptcha settings --- .../src/plugins/crud/submissions.crud.ts | 3 ++- .../src/plugins/crud/utils/isRecaptchaEnabled.ts | 9 +++++++++ packages/api-form-builder/src/types.ts | 9 ++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 packages/api-form-builder/src/plugins/crud/utils/isRecaptchaEnabled.ts diff --git a/packages/api-form-builder/src/plugins/crud/submissions.crud.ts b/packages/api-form-builder/src/plugins/crud/submissions.crud.ts index 5e858ed1490..9afa8e644b0 100644 --- a/packages/api-form-builder/src/plugins/crud/submissions.crud.ts +++ b/packages/api-form-builder/src/plugins/crud/submissions.crud.ts @@ -26,6 +26,7 @@ import { createTopic } from "@webiny/pubsub"; import { sanitizeFormSubmissionData } from "~/plugins/crud/utils/sanitizeFormSubmissionData"; import { mdbid } from "@webiny/utils"; import { FormsPermissions } from "~/plugins/crud/permissions/FormsPermissions"; +import { isRecaptchaEnabled } from "~/plugins/crud/utils/isRecaptchaEnabled"; interface CreateSubmissionsCrudParams { context: FormBuilderContext; @@ -185,7 +186,7 @@ export const createSubmissionsCrud = (params: CreateSubmissionsCrudParams): Subm throwOnNotFound: true }); - if (settings && settings.reCaptcha && settings.reCaptcha.enabled) { + if (settings && isRecaptchaEnabled(settings, form)) { if (!reCaptchaResponseToken) { throw new Error("Missing reCAPTCHA response token - cannot verify."); } diff --git a/packages/api-form-builder/src/plugins/crud/utils/isRecaptchaEnabled.ts b/packages/api-form-builder/src/plugins/crud/utils/isRecaptchaEnabled.ts new file mode 100644 index 00000000000..86303d32bbc --- /dev/null +++ b/packages/api-form-builder/src/plugins/crud/utils/isRecaptchaEnabled.ts @@ -0,0 +1,9 @@ +import { FbForm, Settings } from "~/types"; + +export const isRecaptchaEnabled = (settings: Settings, form: FbForm) => { + if (!settings.reCaptcha.enabled) { + return false; + } + + return form.settings.reCaptcha?.enabled === true; +}; diff --git a/packages/api-form-builder/src/types.ts b/packages/api-form-builder/src/types.ts index 8d69c9ba340..9aaf42c72e7 100644 --- a/packages/api-form-builder/src/types.ts +++ b/packages/api-form-builder/src/types.ts @@ -94,6 +94,13 @@ export interface FbFormField { settings?: Record; } +export interface ReCaptchaSettings { + reCaptcha: { + enabled: boolean | null; + errorMessage: string; + }; +} + export interface FbForm { id: string; tenant: string; @@ -112,7 +119,7 @@ export interface FbForm { fields: FbFormField[]; steps: FbFormStep[]; stats: Omit; - settings: Record; + settings: ReCaptchaSettings | Record; triggers: Record | null; formId: string; webinyVersion: string; From 96f2f699b6c80a870e085329744cdee0b38f1f3f Mon Sep 17 00:00:00 2001 From: Adrian Smijulj Date: Tue, 11 Jun 2024 10:32:04 +0200 Subject: [PATCH 20/26] fix: ensure old meta field values are returned (#4161) --- .../src/definitions/entry.ts | 13 ++ .../src/definitions/entry.ts | 13 ++ ...entEntriesDeprecatedOnByMetaFields.test.ts | 163 ++++++++++++++++++ .../useTestModelHandler/manageGql.ts | 3 + .../useTestModelHandler/readGql.ts | 6 + packages/api-headless-cms/package.json | 1 + .../api-headless-cms/src/graphql/getSchema.ts | 44 +---- .../src/graphql/getSchema/generateCacheId.ts | 14 ++ .../src/graphql/getSchema/generateCacheKey.ts | 31 ++++ .../graphql/schema/createManageResolvers.ts | 2 +- packages/api-headless-cms/src/types.ts | 14 ++ packages/api-headless-cms/tsconfig.build.json | 1 + packages/api-headless-cms/tsconfig.json | 3 + .../project-utils/testing/presets/index.js | 3 + yarn.lock | 1 + 15 files changed, 270 insertions(+), 42 deletions(-) create mode 100644 packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeprecatedOnByMetaFields.test.ts create mode 100644 packages/api-headless-cms/src/graphql/getSchema/generateCacheId.ts create mode 100644 packages/api-headless-cms/src/graphql/getSchema/generateCacheKey.ts diff --git a/packages/api-headless-cms-ddb-es/src/definitions/entry.ts b/packages/api-headless-cms-ddb-es/src/definitions/entry.ts index 150d62fc9e8..1878a0cfd4c 100644 --- a/packages/api-headless-cms-ddb-es/src/definitions/entry.ts +++ b/packages/api-headless-cms-ddb-es/src/definitions/entry.ts @@ -67,6 +67,19 @@ export const createEntryEntity = (params: CreateEntryEntityParams): Entity firstPublishedBy: { type: "map" }, lastPublishedBy: { type: "map" }, + /** + * Deprecated fields. 👇 + */ + ownedBy: { + type: "map" + }, + publishedOn: { + type: "string" + }, + + /** + * The rest. 👇 + */ modelId: { type: "string" }, diff --git a/packages/api-headless-cms-ddb/src/definitions/entry.ts b/packages/api-headless-cms-ddb/src/definitions/entry.ts index 196d681dd1c..e117d8fdda4 100644 --- a/packages/api-headless-cms-ddb/src/definitions/entry.ts +++ b/packages/api-headless-cms-ddb/src/definitions/entry.ts @@ -80,6 +80,19 @@ export const createEntryEntity = (params: Params): Entity => { firstPublishedBy: { type: "map" }, lastPublishedBy: { type: "map" }, + /** + * Deprecated fields. 👇 + */ + ownedBy: { + type: "map" + }, + publishedOn: { + type: "string" + }, + + /** + * The rest. 👇 + */ version: { type: "number" }, diff --git a/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeprecatedOnByMetaFields.test.ts b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeprecatedOnByMetaFields.test.ts new file mode 100644 index 00000000000..a6ce394ece9 --- /dev/null +++ b/packages/api-headless-cms/__tests__/contentAPI/contentEntriesDeprecatedOnByMetaFields.test.ts @@ -0,0 +1,163 @@ +import { SecurityIdentity } from "@webiny/api-security/types"; +import { useTestModelHandler } from "~tests/testHelpers/useTestModelHandler"; +import { getDocumentClient } from "@webiny/project-utils/testing/dynamodb"; +import { PutCommand, QueryCommand, unmarshall } from "@webiny/aws-sdk/client-dynamodb"; +import { CmsGraphQLSchemaPlugin } from "@webiny/api-headless-cms/plugins"; + +const identityA: SecurityIdentity = { id: "a", type: "admin", displayName: "A" }; + +jest.mock("~/graphql/getSchema/generateCacheId", () => { + return { + generateCacheId: () => Date.now() + }; +}); + +describe("Content entries - Entry Meta Fields", () => { + const { manage: manageApiIdentityA, read: readApiIdentityA } = useTestModelHandler({ + identity: identityA + }); + + beforeEach(async () => { + await manageApiIdentityA.setup(); + }); + + test("deprecated 'publishedOn' and 'ownedBy' GraphQL fields should still return values", async () => { + const { data: testEntry } = await manageApiIdentityA.createTestEntry(); + + // Let's directly insert values for deprecated fields. + const client = getDocumentClient(); + + // Not pretty, but this test will be removed anyway, in 5.41.0. + if (process.env.WEBINY_STORAGE_OPS === "ddb") { + const { Items: testEntryDdbRecords } = await client.send( + new QueryCommand({ + TableName: String(process.env.DB_TABLE), + KeyConditionExpression: "PK = :PK AND SK > :SK", + ExpressionAttributeValues: { + ":PK": { S: `T#root#L#en-US#CMS#CME#CME#${testEntry.entryId}` }, + ":SK": { S: " " } + } + }) + ); + + for (const testEntryDdbRecord of testEntryDdbRecords!) { + await client.send( + new PutCommand({ + TableName: process.env.DB_TABLE, + Item: { + ...unmarshall(testEntryDdbRecord), + publishedOn: "2021-01-01T00:00:00.000Z", + ownedBy: identityA + } + }) + ); + } + } else { + const { Items: testEntryDdbRecords } = await client.send( + new QueryCommand({ + TableName: String(process.env.DB_TABLE), + KeyConditionExpression: "PK = :PK AND SK > :SK", + ExpressionAttributeValues: { + ":PK": { S: `T#root#L#en-US#CMS#CME#${testEntry.entryId}` }, + ":SK": { S: " " } + } + }) + ); + + for (const testEntryDdbRecord of testEntryDdbRecords!) { + await client.send( + new PutCommand({ + TableName: process.env.DB_TABLE, + Item: { + ...unmarshall(testEntryDdbRecord), + publishedOn: "2021-01-01T00:00:00.000Z", + ownedBy: identityA + } + }) + ); + } + } + + // Ensure values are visible when data is fetched via GraphQL. + { + const { data: testEntryWithDeprecatedFields } = await manageApiIdentityA.getTestEntry({ + revision: testEntry.id + }); + + expect(testEntryWithDeprecatedFields).toMatchObject({ + publishedOn: "2021-01-01T00:00:00.000Z", + ownedBy: identityA + }); + } + + await manageApiIdentityA.publishTestEntry({ revision: testEntry.id }); + + { + const { data: testEntryWithDeprecatedFields } = await readApiIdentityA.getTestEntry({ + where: { entryId: testEntry.entryId } + }); + + expect(testEntryWithDeprecatedFields).toMatchObject({ + publishedOn: "2021-01-01T00:00:00.000Z", + ownedBy: identityA + }); + } + }); + + test("deprecated 'publishedOn' and 'ownedBy' GraphQL fields should fall back to new fields if no value is present", async () => { + const { data: testEntry } = await manageApiIdentityA.createTestEntry(); + + const { data: publishedTestEntry } = await manageApiIdentityA.publishTestEntry({ + revision: testEntry.id + }); + + expect(publishedTestEntry).toMatchObject({ + publishedOn: null, + ownedBy: null + }); + + // Ensure values are visible when data is fetched via GraphQL. + const customGqlResolvers = new CmsGraphQLSchemaPlugin({ + resolvers: { + TestEntry: { + publishedOn: entry => { + return entry.lastPublishedOn; + }, + ownedBy: entry => { + return entry.createdBy; + } + } + } + }); + + customGqlResolvers.name = "cms-test-entry-meta-fields"; + + const { manage: manageApiWithGqlResolvers, read: readApiWithGqlResolvers } = + useTestModelHandler({ + identity: identityA, + plugins: [customGqlResolvers] + }); + + const { data: testEntryWithDeprecatedFields } = + await manageApiWithGqlResolvers.getTestEntry({ + revision: testEntry.id + }); + + expect(testEntryWithDeprecatedFields).toMatchObject({ + publishedOn: publishedTestEntry.lastPublishedOn, + ownedBy: publishedTestEntry.createdBy + }); + + const { data: readTestEntryWithDeprecatedFields } = + await readApiWithGqlResolvers.getTestEntry({ + where: { + entryId: testEntry.entryId + } + }); + + expect(readTestEntryWithDeprecatedFields).toMatchObject({ + publishedOn: publishedTestEntry.lastPublishedOn, + ownedBy: publishedTestEntry.createdBy + }); + }); +}); diff --git a/packages/api-headless-cms/__tests__/testHelpers/useTestModelHandler/manageGql.ts b/packages/api-headless-cms/__tests__/testHelpers/useTestModelHandler/manageGql.ts index e384e6ac69c..ff229ea6896 100644 --- a/packages/api-headless-cms/__tests__/testHelpers/useTestModelHandler/manageGql.ts +++ b/packages/api-headless-cms/__tests__/testHelpers/useTestModelHandler/manageGql.ts @@ -38,6 +38,9 @@ export const fields = /* GraphQL */ `{ revisionFirstPublishedBy ${identityFields} revisionLastPublishedBy ${identityFields} + publishedOn + ownedBy ${identityFields} + meta { title modelId diff --git a/packages/api-headless-cms/__tests__/testHelpers/useTestModelHandler/readGql.ts b/packages/api-headless-cms/__tests__/testHelpers/useTestModelHandler/readGql.ts index 06d4fe762a7..ceacad73d50 100644 --- a/packages/api-headless-cms/__tests__/testHelpers/useTestModelHandler/readGql.ts +++ b/packages/api-headless-cms/__tests__/testHelpers/useTestModelHandler/readGql.ts @@ -3,6 +3,12 @@ const data = /* GraphQL */ ` id entryId createdOn + publishedOn + ownedBy { + id + displayName + type + } savedOn title slug diff --git a/packages/api-headless-cms/package.json b/packages/api-headless-cms/package.json index cddf33fc297..352658a0998 100644 --- a/packages/api-headless-cms/package.json +++ b/packages/api-headless-cms/package.json @@ -52,6 +52,7 @@ "@babel/core": "^7.22.8", "@babel/preset-env": "^7.22.7", "@webiny/api-wcp": "0.0.0", + "@webiny/aws-sdk": "0.0.0", "@webiny/cli": "0.0.0", "@webiny/project-utils": "0.0.0", "apollo-graphql": "^0.9.5", diff --git a/packages/api-headless-cms/src/graphql/getSchema.ts b/packages/api-headless-cms/src/graphql/getSchema.ts index 970da7af36f..ca4cbb41854 100644 --- a/packages/api-headless-cms/src/graphql/getSchema.ts +++ b/packages/api-headless-cms/src/graphql/getSchema.ts @@ -2,11 +2,12 @@ import codeFrame from "code-frame"; import WebinyError from "@webiny/error"; import { generateSchema } from "./generateSchema"; -import { ApiEndpoint, CmsContext, CmsModel } from "~/types"; +import { ApiEndpoint, CmsContext } from "~/types"; import { Tenant } from "@webiny/api-tenancy/types"; import { I18NLocale } from "@webiny/api-i18n/types"; import { GraphQLSchema } from "graphql"; -import crypto from "crypto"; +import { generateCacheId } from "./getSchema/generateCacheId"; +import { generateCacheKey } from "./getSchema/generateCacheKey"; interface SchemaCache { key: string; @@ -22,45 +23,6 @@ interface GetSchemaParams { const schemaList = new Map(); -/** - * Method generates cache ID based on: - * - tenant - * - endpoint type - * - locale - */ -type GenerateCacheIdParams = Pick; -const generateCacheId = (params: GenerateCacheIdParams): string => { - const { getTenant, type, getLocale } = params; - return [`tenant:${getTenant().id}`, `endpoint:${type}`, `locale:${getLocale().code}`].join("#"); -}; -/** - * Method generates cache key based on last model change time. - * Or sets "unknown" - possible when no models in database. - */ -interface GenerateCacheKeyParams { - models: Pick[]; -} -const generateCacheKey = async (params: GenerateCacheKeyParams): Promise => { - const { models } = params; - - const keys: string[] = []; - for (const model of models) { - const savedOn = model.savedOn; - const value = - // @ts-expect-error - savedOn instanceof Date || savedOn?.toISOString - ? // @ts-expect-error - savedOn.toISOString() - : savedOn || "unknown"; - keys.push(model.modelId, model.singularApiName, model.pluralApiName, value); - } - const key = keys.join("#"); - - const hash = crypto.createHash("sha1"); - hash.update(key); - return hash.digest("hex"); -}; - /** * Gets an existing schema or rewrites existing one or creates a completely new one * depending on the schemaId created from type and locale parameters diff --git a/packages/api-headless-cms/src/graphql/getSchema/generateCacheId.ts b/packages/api-headless-cms/src/graphql/getSchema/generateCacheId.ts new file mode 100644 index 00000000000..42d5d43ee17 --- /dev/null +++ b/packages/api-headless-cms/src/graphql/getSchema/generateCacheId.ts @@ -0,0 +1,14 @@ +import { ApiEndpoint } from "~/types"; +import { Tenant } from "@webiny/api-tenancy/types"; +import { I18NLocale } from "@webiny/api-i18n/types"; + +interface GenerateCacheIdParams { + type: ApiEndpoint; + getTenant: () => Tenant; + getLocale: () => I18NLocale; +} + +export const generateCacheId = (params: GenerateCacheIdParams): string => { + const { getTenant, type, getLocale } = params; + return [`tenant:${getTenant().id}`, `endpoint:${type}`, `locale:${getLocale().code}`].join("#"); +}; diff --git a/packages/api-headless-cms/src/graphql/getSchema/generateCacheKey.ts b/packages/api-headless-cms/src/graphql/getSchema/generateCacheKey.ts new file mode 100644 index 00000000000..ae6d7adb80f --- /dev/null +++ b/packages/api-headless-cms/src/graphql/getSchema/generateCacheKey.ts @@ -0,0 +1,31 @@ +import { CmsModel } from "~/types"; +import crypto from "crypto"; + +interface GenerateCacheKeyParams { + models: Pick[]; +} + +/** + * Method generates cache key based on last model change time. + * Or sets "unknown" - possible when no models in database. + */ +export const generateCacheKey = async (params: GenerateCacheKeyParams): Promise => { + const { models } = params; + + const keys: string[] = []; + for (const model of models) { + const savedOn = model.savedOn; + const value = + // @ts-expect-error + savedOn instanceof Date || savedOn?.toISOString + ? // @ts-expect-error + savedOn.toISOString() + : savedOn || "unknown"; + keys.push(model.modelId, model.singularApiName, model.pluralApiName, value); + } + const key = keys.join("#"); + + const hash = crypto.createHash("sha1"); + hash.update(key); + return hash.digest("hex"); +}; diff --git a/packages/api-headless-cms/src/graphql/schema/createManageResolvers.ts b/packages/api-headless-cms/src/graphql/schema/createManageResolvers.ts index 9136a8a103c..8b86070f0b1 100644 --- a/packages/api-headless-cms/src/graphql/schema/createManageResolvers.ts +++ b/packages/api-headless-cms/src/graphql/schema/createManageResolvers.ts @@ -56,7 +56,7 @@ export const createManageResolvers: CreateManageResolvers = ({ // These are extra fields we want to apply to field resolvers of "gqlType" extraResolvers: { /** - * Advanced Content Entry + * Advanced Content Organization */ wbyAco_location: async (entry: CmsEntry) => { return entry.location || null; diff --git a/packages/api-headless-cms/src/types.ts b/packages/api-headless-cms/src/types.ts index 28a88320fc7..dc75b341990 100644 --- a/packages/api-headless-cms/src/types.ts +++ b/packages/api-headless-cms/src/types.ts @@ -1571,6 +1571,20 @@ export interface CmsEntry { */ lastPublishedBy: CmsIdentity | null; + /** + * Deprecated fields. 👇 + */ + + /** + * @deprecated Will be removed with the 5.41.0 release. Use `createdBy` field instead. + */ + ownedBy?: CmsIdentity | null; + + /** + * @deprecated Will be removed with the 5.41.0 release. Use `firstPublishedOn` or `lastPublishedOn` field instead. + */ + publishedOn?: string | null; + /** * Model ID of the definition for the entry. * @see CmsModel diff --git a/packages/api-headless-cms/tsconfig.build.json b/packages/api-headless-cms/tsconfig.build.json index 3f276a8f25a..8df3aa36f37 100644 --- a/packages/api-headless-cms/tsconfig.build.json +++ b/packages/api-headless-cms/tsconfig.build.json @@ -6,6 +6,7 @@ { "path": "../api-i18n/tsconfig.build.json" }, { "path": "../api-security/tsconfig.build.json" }, { "path": "../api-tenancy/tsconfig.build.json" }, + { "path": "../aws-sdk/tsconfig.build.json" }, { "path": "../error/tsconfig.build.json" }, { "path": "../handler/tsconfig.build.json" }, { "path": "../handler-aws/tsconfig.build.json" }, diff --git a/packages/api-headless-cms/tsconfig.json b/packages/api-headless-cms/tsconfig.json index 657790c79f8..98467300de1 100644 --- a/packages/api-headless-cms/tsconfig.json +++ b/packages/api-headless-cms/tsconfig.json @@ -6,6 +6,7 @@ { "path": "../api-i18n" }, { "path": "../api-security" }, { "path": "../api-tenancy" }, + { "path": "../aws-sdk" }, { "path": "../error" }, { "path": "../handler" }, { "path": "../handler-aws" }, @@ -33,6 +34,8 @@ "@webiny/api-security": ["../api-security/src"], "@webiny/api-tenancy/*": ["../api-tenancy/src/*"], "@webiny/api-tenancy": ["../api-tenancy/src"], + "@webiny/aws-sdk/*": ["../aws-sdk/src/*"], + "@webiny/aws-sdk": ["../aws-sdk/src"], "@webiny/error/*": ["../error/src/*"], "@webiny/error": ["../error/src"], "@webiny/handler/*": ["../handler/src/*"], diff --git a/packages/project-utils/testing/presets/index.js b/packages/project-utils/testing/presets/index.js index 875398387cd..bbf6af8f22f 100644 --- a/packages/project-utils/testing/presets/index.js +++ b/packages/project-utils/testing/presets/index.js @@ -11,6 +11,9 @@ const getAllPackages = targetKeywords => { throw Error(`Missing required --storage parameter!`); } + // Set the storage type as an environment variable. + process.env.WEBINY_STORAGE_OPS = storage; + const storagePriority = storage.split(","); const packages = getYarnWorkspaces(process.cwd()) diff --git a/yarn.lock b/yarn.lock index eec9ca56019..fef1ae8fe5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15712,6 +15712,7 @@ __metadata: "@webiny/api-security": 0.0.0 "@webiny/api-tenancy": 0.0.0 "@webiny/api-wcp": 0.0.0 + "@webiny/aws-sdk": 0.0.0 "@webiny/cli": 0.0.0 "@webiny/error": 0.0.0 "@webiny/handler": 0.0.0 From ce7781a9eaf6378192a20fc0f32939823bcbc595 Mon Sep 17 00:00:00 2001 From: Pavel Denisjuk Date: Tue, 11 Jun 2024 15:43:40 +0200 Subject: [PATCH 21/26] fix(api-security-cognito): apply admin user plugins to "admin" identity only --- packages/api-security-cognito/src/createCognito.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/api-security-cognito/src/createCognito.ts b/packages/api-security-cognito/src/createCognito.ts index 91d23865dab..e943861dbc6 100644 --- a/packages/api-security-cognito/src/createCognito.ts +++ b/packages/api-security-cognito/src/createCognito.ts @@ -49,6 +49,7 @@ export const createCognito = < }); const { getIdentity, getPermissions } = config; + const isAdminIdentity = config.identityType === "admin"; return [ new ContextPlugin(context => { @@ -95,7 +96,6 @@ export const createCognito = < const teams = context.wcp.canUseTeams(); context.plugins.register(adminUsersGqlPlugins({ teams })); }), - installGqlPlugins, - createAdminUsersHooks() + isAdminIdentity ? [installGqlPlugins, createAdminUsersHooks()] : [] ]; }; From 111642994108f6e1dc610f7a8743e75645142968 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 12 Jun 2024 16:44:36 +0200 Subject: [PATCH 22/26] chore: update yarn.lock --- yarn.lock | 1276 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1272 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3d9d2734da9..cef241c66ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2288,6 +2288,33 @@ __metadata: languageName: node linkType: hard +"@babel/cli@npm:^7.22.6": + version: 7.24.7 + resolution: "@babel/cli@npm:7.24.7" + dependencies: + "@jridgewell/trace-mapping": ^0.3.25 + "@nicolo-ribaudo/chokidar-2": 2.1.8-no-fsevents.3 + chokidar: ^3.4.0 + commander: ^6.2.0 + convert-source-map: ^2.0.0 + fs-readdir-recursive: ^1.1.0 + glob: ^7.2.0 + make-dir: ^2.1.0 + slash: ^2.0.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + dependenciesMeta: + "@nicolo-ribaudo/chokidar-2": + optional: true + chokidar: + optional: true + bin: + babel: ./bin/babel.js + babel-external-helpers: ./bin/babel-external-helpers.js + checksum: 40dfde8062de913dc5bb1c65a4d4e88ec2c438f16387c5552b1f8b0524f8af454c3b7bf12364ca0da8509c5edafdabc1527a939587678dc7825659c38d357c1d + languageName: node + linkType: hard + "@babel/cli@npm:^7.23.9": version: 7.24.1 resolution: "@babel/cli@npm:7.24.1" @@ -2362,6 +2389,16 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/code-frame@npm:7.24.7" + dependencies: + "@babel/highlight": ^7.24.7 + picocolors: ^1.0.0 + checksum: 830e62cd38775fdf84d612544251ce773d544a8e63df667728cc9e0126eeef14c6ebda79be0f0bc307e8318316b7f58c27ce86702e0a1f5c321d842eb38ffda4 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.1, @babel/compat-data@npm:^7.20.5": version: 7.20.14 resolution: "@babel/compat-data@npm:7.20.14" @@ -2390,6 +2427,13 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/compat-data@npm:7.24.7" + checksum: 1fc276825dd434fe044877367dfac84171328e75a8483a6976aa28bf833b32367e90ee6df25bdd97c287d1aa8019757adcccac9153de70b1932c0d243a978ae9 + languageName: node + linkType: hard + "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3": version: 7.20.12 resolution: "@babel/core@npm:7.20.12" @@ -2436,6 +2480,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.22.8": + version: 7.24.7 + resolution: "@babel/core@npm:7.24.7" + dependencies: + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.24.7 + "@babel/generator": ^7.24.7 + "@babel/helper-compilation-targets": ^7.24.7 + "@babel/helper-module-transforms": ^7.24.7 + "@babel/helpers": ^7.24.7 + "@babel/parser": ^7.24.7 + "@babel/template": ^7.24.7 + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + convert-source-map: ^2.0.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 017497e2a1b4683a885219eef7d2aee83c1c0cf353506b2e180b73540ec28841d8ef1ea1837fa69f8c561574b24ddd72f04764b27b87afedfe0a07299ccef24d + languageName: node + linkType: hard + "@babel/core@npm:^7.23.9, @babel/core@npm:^7.24.0": version: 7.24.3 resolution: "@babel/core@npm:7.24.3" @@ -2508,6 +2575,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/generator@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + jsesc: ^2.5.1 + checksum: 0ff31a73b15429f1287e4d57b439bba4a266f8c673bb445fe313b82f6d110f586776997eb723a777cd7adad9d340edd162aea4973a90112c5d0cfcaf6686844b + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-annotate-as-pure@npm:7.18.6" @@ -2526,6 +2605,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 6178566099a6a0657db7a7fa601a54fb4731ca0b8614fbdccfd8e523c210c13963649bc8fdfd53ce7dd14d05e3dda2fb22dea5b30113c488b9eb1a906d60212e + languageName: node + linkType: hard + "@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.18.6": version: 7.18.9 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.18.9" @@ -2545,6 +2633,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7" + dependencies: + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 71a6158a9fdebffb82fdc400d5555ba8f2e370cea81a0d578155877bdc4db7d5252b75c43b2fdf3f72b3f68348891f99bd35ae315542daad1b7ace8322b1abcb + languageName: node + linkType: hard + "@babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9, @babel/helper-compilation-targets@npm:^7.20.0, @babel/helper-compilation-targets@npm:^7.20.7": version: 7.20.7 resolution: "@babel/helper-compilation-targets@npm:7.20.7" @@ -2603,6 +2701,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-compilation-targets@npm:7.24.7" + dependencies: + "@babel/compat-data": ^7.24.7 + "@babel/helper-validator-option": ^7.24.7 + browserslist: ^4.22.2 + lru-cache: ^5.1.1 + semver: ^6.3.1 + checksum: dfc88bc35e223ade796c7267901728217c665adc5bc2e158f7b0ae850de14f1b7941bec4fe5950ae46236023cfbdeddd9c747c276acf9b39ca31f8dd97dc6cc6 + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.20.12, @babel/helper-create-class-features-plugin@npm:^7.20.5, @babel/helper-create-class-features-plugin@npm:^7.20.7": version: 7.20.12 resolution: "@babel/helper-create-class-features-plugin@npm:7.20.12" @@ -2640,6 +2751,25 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-create-class-features-plugin@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-function-name": ^7.24.7 + "@babel/helper-member-expression-to-functions": ^7.24.7 + "@babel/helper-optimise-call-expression": ^7.24.7 + "@babel/helper-replace-supers": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 + "@babel/helper-split-export-declaration": ^7.24.7 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 371a181a1717a9b0cebc97727c8ea9ca6afa34029476a684b6030f9d1ad94dcdafd7de175da10b63ae3ba79e4e82404db8ed968ebf264b768f097e5d64faab71 + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.20.5": version: 7.20.5 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.20.5" @@ -2678,6 +2808,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-regexp-features-plugin@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": ^7.24.7 + regexpu-core: ^5.3.1 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 17c59fa222af50f643946eca940ce1d474ff2da1f4afed2312687ab9d708ebbb8c9372754ddbdf44b6e21ead88b8fc144644f3a7b63ccb886de002458cef3974 + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.3.3": version: 0.3.3 resolution: "@babel/helper-define-polyfill-provider@npm:0.3.3" @@ -2730,6 +2873,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-environment-visitor@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-environment-visitor@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 079d86e65701b29ebc10baf6ed548d17c19b808a07aa6885cc141b690a78581b180ee92b580d755361dc3b16adf975b2d2058b8ce6c86675fcaf43cf22f2f7c6 + languageName: node + linkType: hard + "@babel/helper-explode-assignable-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-explode-assignable-expression@npm:7.18.6" @@ -2769,6 +2921,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-function-name@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-function-name@npm:7.24.7" + dependencies: + "@babel/template": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 142ee08922074dfdc0ff358e09ef9f07adf3671ab6eef4fca74dcf7a551f1a43717e7efa358c9e28d7eea84c28d7f177b7a58c70452fc312ae3b1893c5dab2a4 + languageName: node + linkType: hard + "@babel/helper-hoist-variables@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-hoist-variables@npm:7.18.6" @@ -2787,6 +2949,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-hoist-variables@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-hoist-variables@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 6cfdcf2289cd12185dcdbdf2435fa8d3447b797ac75851166de9fc8503e2fd0021db6baf8dfbecad3753e582c08e6a3f805c8d00cbed756060a877d705bd8d8d + languageName: node + linkType: hard + "@babel/helper-member-expression-to-functions@npm:^7.20.7": version: 7.20.7 resolution: "@babel/helper-member-expression-to-functions@npm:7.20.7" @@ -2805,6 +2976,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-member-expression-to-functions@npm:7.24.7" + dependencies: + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 9fecf412f85fa23b7cf55d19eb69de39f8240426a028b141c9df2aed8cfedf20b3ec3318d40312eb7a3dec9eea792828ce0d590e0ff62da3da532482f537192c + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-module-imports@npm:7.18.6" @@ -2850,6 +3031,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-module-imports@npm:7.24.7" + dependencies: + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 8ac15d96d262b8940bc469052a048e06430bba1296369be695fabdf6799f201dd0b00151762b56012a218464e706bc033f27c07f6cec20c6f8f5fd6543c67054 + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.20.11": version: 7.20.11 resolution: "@babel/helper-module-transforms@npm:7.20.11" @@ -2897,6 +3088,21 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-module-transforms@npm:7.24.7" + dependencies: + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-module-imports": ^7.24.7 + "@babel/helper-simple-access": ^7.24.7 + "@babel/helper-split-export-declaration": ^7.24.7 + "@babel/helper-validator-identifier": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: ddff3b41c2667876b4e4e73d961168f48a5ec9560c95c8c2d109e6221f9ca36c6f90c6317eb7a47f2a3c99419c356e529a86b79174cad0d4f7a61960866b88ca + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-optimise-call-expression@npm:7.18.6" @@ -2915,6 +3121,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: 280654eaf90e92bf383d7eed49019573fb35a98c9e992668f701ad099957246721044be2068cf6840cb2299e0ad393705a1981c88c23a1048096a8d59e5f79a3 + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.19.0, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.20.2 resolution: "@babel/helper-plugin-utils@npm:7.20.2" @@ -2936,6 +3151,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-plugin-utils@npm:7.24.7" + checksum: 81f2a15751d892e4a8fce25390f973363a5b27596167861d2d6eab0f61856eb2ba389b031a9f19f669c0bd4dd601185828d3cebafd25431be7a1696f2ce3ef68 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.18.9": version: 7.18.9 resolution: "@babel/helper-remap-async-to-generator@npm:7.18.9" @@ -2963,6 +3185,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-remap-async-to-generator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-remap-async-to-generator@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-wrap-function": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: bab7be178f875350f22a2cb9248f67fe3a8a8128db77a25607096ca7599fd972bc7049fb11ed9e95b45a3f1dd1fac3846a3279f9cbac16f337ecb0e6ca76e1fc + languageName: node + linkType: hard + "@babel/helper-replace-supers@npm:^7.18.6, @babel/helper-replace-supers@npm:^7.20.7": version: 7.20.7 resolution: "@babel/helper-replace-supers@npm:7.20.7" @@ -2990,6 +3225,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-replace-supers@npm:7.24.7" + dependencies: + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-member-expression-to-functions": ^7.24.7 + "@babel/helper-optimise-call-expression": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 2bf0d113355c60d86a04e930812d36f5691f26c82d4ec1739e5ec0a4c982c9113dad3167f7c74f888a96328bd5e696372232406d8200e5979e6e0dc2af5e7c76 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.20.2": version: 7.20.2 resolution: "@babel/helper-simple-access@npm:7.20.2" @@ -3017,6 +3265,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-simple-access@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-simple-access@npm:7.24.7" + dependencies: + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: ddbf55f9dea1900213f2a1a8500fabfd21c5a20f44dcfa957e4b0d8638c730f88751c77f678644f754f1a1dc73f4eb8b766c300deb45a9daad000e4247957819 + languageName: node + linkType: hard + "@babel/helper-skip-transparent-expression-wrappers@npm:^7.20.0": version: 7.20.0 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.20.0" @@ -3035,6 +3293,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" + dependencies: + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 11b28fe534ce2b1a67c4d8e51a7b5711a2a0a0cae802f74614eee54cca58c744d9a62f6f60103c41759e81c537d270bfd665bf368a6bea214c6052f2094f8407 + languageName: node + linkType: hard + "@babel/helper-split-export-declaration@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-split-export-declaration@npm:7.18.6" @@ -3053,6 +3321,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-split-export-declaration@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-split-export-declaration@npm:7.24.7" + dependencies: + "@babel/types": ^7.24.7 + checksum: e3ddc91273e5da67c6953f4aa34154d005a00791dc7afa6f41894e768748540f6ebcac5d16e72541aea0c89bee4b89b4da6a3d65972a0ea8bfd2352eda5b7e22 + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.19.4": version: 7.19.4 resolution: "@babel/helper-string-parser@npm:7.19.4" @@ -3081,6 +3358,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-string-parser@npm:7.24.7" + checksum: 09568193044a578743dd44bf7397940c27ea693f9812d24acb700890636b376847a611cdd0393a928544e79d7ad5b8b916bd8e6e772bc8a10c48a647a96e7b1a + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": version: 7.19.1 resolution: "@babel/helper-validator-identifier@npm:7.19.1" @@ -3102,6 +3386,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-identifier@npm:7.24.7" + checksum: 6799ab117cefc0ecd35cd0b40ead320c621a298ecac88686a14cffceaac89d80cdb3c178f969861bf5fa5e4f766648f9161ea0752ecfe080d8e89e3147270257 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-validator-option@npm:7.18.6" @@ -3130,6 +3421,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-validator-option@npm:7.24.7" + checksum: 9689166bf3f777dd424c026841c8cd651e41b21242dbfd4569a53086179a3e744c8eddd56e9d10b54142270141c91581b53af0d7c00c82d552d2540e2a919f7e + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.18.9": version: 7.20.5 resolution: "@babel/helper-wrap-function@npm:7.20.5" @@ -3153,6 +3451,18 @@ __metadata: languageName: node linkType: hard +"@babel/helper-wrap-function@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helper-wrap-function@npm:7.24.7" + dependencies: + "@babel/helper-function-name": ^7.24.7 + "@babel/template": ^7.24.7 + "@babel/traverse": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 085bf130ed08670336e3976f5841ae44e3e10001131632e22ef234659341978d2fd37e65785f59b6cb1745481347fc3bce84b33a685cacb0a297afbe1d2b03af + languageName: node + linkType: hard + "@babel/helpers@npm:^7.20.7": version: 7.20.13 resolution: "@babel/helpers@npm:7.20.13" @@ -3186,6 +3496,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/helpers@npm:7.24.7" + dependencies: + "@babel/template": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: 934da58098a3670ca7f9f42425b9c44d0ca4f8fad815c0f51d89fc7b64c5e0b4c7d5fec038599de691229ada737edeaf72fad3eba8e16dd5842e8ea447f76b66 + languageName: node + linkType: hard + "@babel/highlight@npm:^7.18.6": version: 7.18.6 resolution: "@babel/highlight@npm:7.18.6" @@ -3231,6 +3551,18 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/highlight@npm:7.24.7" + dependencies: + "@babel/helper-validator-identifier": ^7.24.7 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: 5cd3a89f143671c4ac129960024ba678b669e6fc673ce078030f5175002d1d3d52bc10b22c5b916a6faf644b5028e9a4bd2bb264d053d9b05b6a98690f1d46f1 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.6.4": version: 7.20.15 resolution: "@babel/parser@npm:7.20.15" @@ -3276,6 +3608,27 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/parser@npm:7.24.7" + bin: + parser: ./bin/babel-parser.js + checksum: fc9d2c4c8712f89672edc55c0dc5cf640dcec715b56480f111f85c2bc1d507e251596e4110d65796690a96ac37a4b60432af90b3e97bb47e69d4ef83872dbbd6 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.7" + dependencies: + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 68d315642b53af143aa17a71eb976cf431b51339aee584e29514a462b81c998636dd54219c2713b5f13e1df89eaf130dfab59683f9116825608708c81696b96c + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.18.6" @@ -3298,6 +3651,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 7eb4e7ce5e3d6db4b0fdbdfaaa301c2e58f38a7ee39d5a4259a1fda61a612e83d3e4bc90fc36fb0345baf57e1e1a071e0caffeb80218623ad163f2fdc2e53a54 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.18.9": version: 7.20.7 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.20.7" @@ -3324,6 +3688,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 + "@babel/plugin-transform-optional-chaining": ^7.24.7 + peerDependencies: + "@babel/core": ^7.13.0 + checksum: 07b92878ac58a98ea1fdf6a8b4ec3413ba4fa66924e28b694d63ec5b84463123fbf4d7153b56cf3cedfef4a3482c082fe3243c04f8fb2c041b32b0e29b4a9e21 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.1" @@ -3336,6 +3713,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.7" + dependencies: + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 8324d458db57060590942c7c2e9603880d07718ccb6450ec935105b8bd3c4393c4b8ada88e178c232258d91f33ffdcf2b1043d54e07a86989e50667ee100a32e + languageName: node + linkType: hard + "@babel/plugin-proposal-async-generator-functions@npm:^7.20.1": version: 7.20.7 resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.20.7" @@ -3657,6 +4046,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c4d67be4eb1d4637e361477dbe01f5b392b037d17c1f861cfa0faa120030e137aab90a9237931b8040fd31d1e5d159e11866fa1165f78beef7a3be876a391a17 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-attributes@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.1" @@ -3668,6 +4068,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-attributes@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 590dbb5d1a15264f74670b427b8d18527672c3d6c91d7bae7e65f80fd810edbc83d90e68065088644cbad3f2457ed265a54a9956fb789fcb9a5b521822b3a275 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-meta@npm:^7.10.4, @babel/plugin-syntax-import-meta@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" @@ -3889,6 +4300,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-arrow-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 707c209b5331c7dc79bd326128c6a6640dbd62a78da1653c844db20c4f36bf7b68454f1bc4d2d051b3fde9136fa291f276ec03a071bb00ee653069ff82f91010 + languageName: node + linkType: hard + "@babel/plugin-transform-async-generator-functions@npm:^7.24.3": version: 7.24.3 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.3" @@ -3903,6 +4325,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-generator-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.7" + dependencies: + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-remap-async-to-generator": ^7.24.7 + "@babel/plugin-syntax-async-generators": ^7.8.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 112e3b18f9c496ebc01209fc27f0b41a3669c479c7bc44f7249383172b432ebaae1e523caa7c6ecbd2d0d7adcb7e5769fe2798f8cb01c08cd57232d1bb6d8ad4 + languageName: node + linkType: hard + "@babel/plugin-transform-async-to-generator@npm:^7.18.6": version: 7.20.7 resolution: "@babel/plugin-transform-async-to-generator@npm:7.20.7" @@ -3929,6 +4365,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-to-generator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" + dependencies: + "@babel/helper-module-imports": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-remap-async-to-generator": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 13704fb3b83effc868db2b71bfb2c77b895c56cb891954fc362e95e200afd523313b0e7cf04ce02f45b05e76017c5b5fa8070c92613727a35131bb542c253a36 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.18.6" @@ -3951,6 +4400,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 249cdcbff4e778b177245f9652b014ea4f3cd245d83297f10a7bf6d97790074089aa62bcde8c08eb299c5e68f2faed346b587d3ebac44d625ba9a83a4ee27028 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoping@npm:^7.20.2": version: 7.20.15 resolution: "@babel/plugin-transform-block-scoping@npm:7.20.15" @@ -3973,6 +4433,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-block-scoping@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 039206155533600f079f3a455f85888dd7d4970ff7ffa85ef44760f4f5acb9f19c9d848cc1fec1b9bdbc0dfec9e8a080b90d0ab66ad2bdc7138b5ca4ba96e61c + languageName: node + linkType: hard + "@babel/plugin-transform-class-properties@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-class-properties@npm:7.24.1" @@ -3985,6 +4456,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-class-properties@npm:7.24.7" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1348d7ce74da38ba52ea85b3b4289a6a86913748569ef92ef0cff30702a9eb849e5eaf59f1c6f3517059aa68115fb3067e389735dccacca39add4e2b0c67e291 + languageName: node + linkType: hard + "@babel/plugin-transform-class-static-block@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-class-static-block@npm:7.24.1" @@ -3998,6 +4481,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-static-block@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-class-static-block": ^7.14.5 + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 324049263504f18416f1c3e24033baebfafd05480fdd885c8ebe6f2b415b0fc8e0b98d719360f9e30743cc78ac387fabc0b3c6606d2b54135756ffb92963b382 + languageName: node + linkType: hard + "@babel/plugin-transform-classes@npm:^7.20.2": version: 7.20.7 resolution: "@babel/plugin-transform-classes@npm:7.20.7" @@ -4035,6 +4531,24 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-classes@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-compilation-targets": ^7.24.7 + "@babel/helper-environment-visitor": ^7.24.7 + "@babel/helper-function-name": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-replace-supers": ^7.24.7 + "@babel/helper-split-export-declaration": ^7.24.7 + globals: ^11.1.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f01cb31143730d425681e9816020cbb519c7ddb3b6ca308dfaf2821eda5699a746637fc6bf19811e2fb42cfdf8b00a21b31c754da83771a5c280077925677354 + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.18.9": version: 7.20.7 resolution: "@babel/plugin-transform-computed-properties@npm:7.20.7" @@ -4059,6 +4573,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-computed-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/template": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0cf8c1b1e4ea57dec8d4612460d84fd4cdbf71a7499bb61ee34632cf89018a59eee818ffca88a8d99ee7057c20a4257044d7d463fda6daef9bf1db9fa81563cb + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.20.2": version: 7.20.7 resolution: "@babel/plugin-transform-destructuring@npm:7.20.7" @@ -4081,6 +4607,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-destructuring@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b9637b27faf9d24a8119bc5a1f98a2f47c69e6441bd8fc71163500be316253a72173308a93122bcf27d8d314ace43344c976f7291cf6376767f408350c8149d4 + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.18.6, @babel/plugin-transform-dotall-regex@npm:^7.4.4": version: 7.18.6 resolution: "@babel/plugin-transform-dotall-regex@npm:7.18.6" @@ -4105,6 +4642,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dotall-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 67b10fc6abb1f61f0e765288eb4c6d63d1d0f9fc0660e69f6f2170c56fa16bc74e49857afc644beda112b41771cd90cf52df0940d11e97e52617c77c7dcff171 + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-keys@npm:^7.18.9": version: 7.18.9 resolution: "@babel/plugin-transform-duplicate-keys@npm:7.18.9" @@ -4127,6 +4676,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d1da2ff85ecb56a63f4ccfd9dc9ae69400d85f0dadf44ecddd9e71c6e5c7a9178e74e3a9637555f415a2bb14551e563f09f98534ab54f53d25e8439fdde6ba2d + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.1" @@ -4139,6 +4699,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dynamic-import@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-dynamic-import": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 776509ff62ab40c12be814a342fc56a5cc09b91fb63032b2633414b635875fd7da03734657be0f6db2891fe6e3033b75d5ddb6f2baabd1a02e4443754a785002 + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.18.6" @@ -4163,6 +4735,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-exponentiation-operator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 23c84a23eb56589fdd35a3540f9a1190615be069110a2270865223c03aee3ba4e0fc68fe14850800cf36f0712b26e4964d3026235261f58f0405a29fe8dac9b1 + languageName: node + linkType: hard + "@babel/plugin-transform-export-namespace-from@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.1" @@ -4175,6 +4759,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-export-namespace-from@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-export-namespace-from": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3bd3a10038f10ae0dea1ee42137f3edcf7036b5e9e570a0d1cbd0865f03658990c6c2d84fa2475f87a754e7dc5b46766c16f7ce5c9b32c3040150b6a21233a80 + languageName: node + linkType: hard + "@babel/plugin-transform-for-of@npm:^7.18.8": version: 7.18.8 resolution: "@babel/plugin-transform-for-of@npm:7.18.8" @@ -4198,6 +4794,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-for-of@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a53b42dc93ab4b7d1ebd3c695b52be22b3d592f6a3dbdb3dc2fea2c8e0a7e1508fe919864c455cde552aec44ce7518625fccbb70c7063373ca228d884f4f49ea + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.18.9": version: 7.18.9 resolution: "@babel/plugin-transform-function-name@npm:7.18.9" @@ -4224,6 +4832,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-function-name@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-function-name@npm:7.24.7" + dependencies: + "@babel/helper-compilation-targets": ^7.24.7 + "@babel/helper-function-name": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8eb1a67894a124910b5a67630bed4307757504381f39f0fb5cf82afc7ae8647dbc03b256d13865b73a749b9071b68e9fb8a28cef2369917b4299ebb93fd66146 + languageName: node + linkType: hard + "@babel/plugin-transform-json-strings@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-json-strings@npm:7.24.1" @@ -4236,6 +4857,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-json-strings@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-json-strings@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-json-strings": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 88874d0b7a1ddea66c097fc0abb68801ffae194468aa44b828dde9a0e20ac5d8647943793de86092eabaa2911c96f67a6b373793d4bb9c932ef81b2711c06c2e + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.18.9": version: 7.18.9 resolution: "@babel/plugin-transform-literals@npm:7.18.9" @@ -4258,6 +4891,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3c075cc093a3dd9e294b8b7d6656e65f889e7ca2179ca27978dcd65b4dc4885ebbfb327408d7d8f483c55547deed00ba840956196f3ac8a3c3d2308a330a8c23 + languageName: node + linkType: hard + "@babel/plugin-transform-logical-assignment-operators@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.1" @@ -4270,6 +4914,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3367ce0be243704dc6fce23e86a592c4380f01998ee5dd9f94c54b1ef7b971ac6f8a002901eb51599ac6cbdc0d067af8d1a720224fca1c40fde8bb8aab804aac + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.18.6" @@ -4292,6 +4948,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2720c57aa3bf70576146ba7d6ea03227f4611852122d76d237924f7b008dafc952e6ae61a19e5024f26c665f44384bbd378466f01b6bd1305b3564a3b7fb1a5d + languageName: node + linkType: hard + "@babel/plugin-transform-modules-amd@npm:^7.19.6": version: 7.20.11 resolution: "@babel/plugin-transform-modules-amd@npm:7.20.11" @@ -4316,6 +4983,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-amd@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7" + dependencies: + "@babel/helper-module-transforms": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f1dd0fb2f46c0f8f21076b8c7ccd5b33a85ce6dcb31518ea4c648d9a5bb2474cd4bd87c9b1b752e68591e24b022e334ba0d07631fef2b6b4d8a4b85cf3d581f5 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-commonjs@npm:^7.19.6": version: 7.20.11 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.20.11" @@ -4342,6 +5021,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.7" + dependencies: + "@babel/helper-module-transforms": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-simple-access": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bfda2a0297197ed342e2a02e5f9847a489a3ae40a4a7d7f00f4aeb8544a85e9006e0c5271c8f61f39bc97975ef2717b5594cf9486694377a53433162909d64c1 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-systemjs@npm:^7.19.6": version: 7.20.11 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.20.11" @@ -4370,6 +5062,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-systemjs@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.7" + dependencies: + "@babel/helper-hoist-variables": ^7.24.7 + "@babel/helper-module-transforms": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-validator-identifier": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8af7a9db2929991d82cfdf41fb175dee344274d39b39122f8c35f24b5d682f98368e3d8f5130401298bd21412df21d416a7d8b33b59c334fae3d3c762118b1d8 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-umd@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-modules-umd@npm:7.18.6" @@ -4394,6 +5100,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7" + dependencies: + "@babel/helper-module-transforms": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 9ff1c464892efe042952ba778468bda6131b196a2729615bdcc3f24cdc94014f016a4616ee5643c5845bade6ba698f386833e61056d7201314b13a7fd69fac88 + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.19.1": version: 7.20.5 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.20.5" @@ -4418,6 +5136,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: f1c6c7b5d60a86b6d7e4dd098798e1d393d55e993a0b57a73b53640c7a94985b601a96bdacee063f809a9a700bcea3a2ff18e98fa561554484ac56b761d774bd + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-new-target@npm:7.18.6" @@ -4440,6 +5170,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-new-target@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3cb94cd1076b270f768f91fdcf9dd2f6d487f8dbfff3df7ca8d07b915900b86d02769a35ba1407d16fe49499012c8f055e1741299e2c880798b953d942a8fa1b + languageName: node + linkType: hard + "@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.1" @@ -4452,6 +5193,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4a9221356401d87762afbc37a9e8e764afc2daf09c421117537820f8cfbed6876888372ad3a7bcfae2d45c95f026651f050ab4020b777be31d3ffb00908dbdd3 + languageName: node + linkType: hard + "@babel/plugin-transform-numeric-separator@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.1" @@ -4464,6 +5217,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-numeric-separator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-numeric-separator": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 561b5f1d08b2c3f92ce849f092751558b5e6cfeb7eb55c79e7375c34dd9c3066dce5e630bb439affef6adcf202b6cbcaaa23870070276fa5bb429c8f5b8c7514 + languageName: node + linkType: hard + "@babel/plugin-transform-object-rest-spread@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.1" @@ -4478,6 +5243,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-rest-spread@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7" + dependencies: + "@babel/helper-compilation-targets": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-transform-parameters": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 169d257b9800c13e1feb4c37fb05dae84f702e58b342bb76e19e82e6692b7b5337c9923ee89e3916a97c0dd04a3375bdeca14f5e126f110bbacbeb46d1886ca2 + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-object-super@npm:7.18.6" @@ -4502,6 +5281,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-object-super@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-replace-supers": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f71e607a830ee50a22fa1a2686524d3339440cf9dea63032f6efbd865cfe4e35000e1e3f3492459e5c986f7c0c07dc36938bf3ce61fc9ba5f8ab732d0b64ab37 + languageName: node + linkType: hard + "@babel/plugin-transform-optional-catch-binding@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.1" @@ -4514,6 +5305,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7229f3a5a4facaab40f4fdfc7faabc157dc38a67d66bed7936599f4bc509e0bff636f847ac2aa45294881fce9cf8a0a460b85d2a465b7b977de9739fce9b18f6 + languageName: node + linkType: hard + "@babel/plugin-transform-optional-chaining@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.1" @@ -4527,6 +5330,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-chaining@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 877e7ce9097d475132c7f4d1244de50bb2fd37993dc4580c735f18f8cbc49282f6e77752821bcad5ca9d3528412d2c8a7ee0aa7ca71bb680ff82648e7a5fed25 + languageName: node + linkType: hard + "@babel/plugin-transform-parameters@npm:^7.20.1, @babel/plugin-transform-parameters@npm:^7.20.7": version: 7.20.7 resolution: "@babel/plugin-transform-parameters@npm:7.20.7" @@ -4549,6 +5365,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-parameters@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ab534b03ac2eff94bc79342b8f39a4584666f5305a6c63c1964afda0b1b004e6b861e49d1683548030defe248e3590d3ff6338ee0552cb90c064f7e1479968c3 + languageName: node + linkType: hard + "@babel/plugin-transform-private-methods@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-private-methods@npm:7.24.1" @@ -4561,6 +5388,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-methods@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-private-methods@npm:7.24.7" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c151548e34909be2adcceb224d8fdd70bafa393bc1559a600906f3f647317575bf40db670470934a360e90ee8084ef36dffa34ec25d387d414afd841e74cf3fe + languageName: node + linkType: hard + "@babel/plugin-transform-private-property-in-object@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.1" @@ -4575,6 +5414,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-property-in-object@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" + dependencies: + "@babel/helper-annotate-as-pure": ^7.24.7 + "@babel/helper-create-class-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8cee9473095305cc787bb653fd681719b49363281feabf677db8a552e8e41c94441408055d7e5fd5c7d41b315e634fa70b145ad0c7c54456216049df4ed57350 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-property-literals@npm:7.18.6" @@ -4597,6 +5450,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 9aeefc3aab6c6bf9d1fae1cf3a2d38c7d886fd3c6c81b7c608c477f5758aee2e7abf52f32724310fe861da61af934ee2508b78a5b5f234b9740c9134e1c14437 + languageName: node + linkType: hard + "@babel/plugin-transform-react-constant-elements@npm:^7.18.12": version: 7.21.3 resolution: "@babel/plugin-transform-react-constant-elements@npm:7.21.3" @@ -4745,6 +5609,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-regenerator@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + regenerator-transform: ^0.15.2 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 20c6c3fb6fc9f407829087316653388d311e8c1816b007609bb09aeef254092a7157adace8b3aaa8f34be752503717cb85c88a5fe482180a9b11bcbd676063be + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-reserved-words@npm:7.18.6" @@ -4767,6 +5643,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-reserved-words@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3d5876954d5914d7270819479504f30c4bf5452a65c677f44e2dab2db50b3c9d4b47793c45dfad7abf4f377035dd79e4b3f554ae350df9f422201d370ce9f8dd + languageName: node + linkType: hard + "@babel/plugin-transform-runtime@npm:^7.24.0": version: 7.24.3 resolution: "@babel/plugin-transform-runtime@npm:7.24.3" @@ -4805,6 +5692,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7b524245814607188212b8eb86d8c850e5974203328455a30881b4a92c364b93353fae14bc2af5b614ef16300b75b8c1d3b8f3a08355985b4794a7feb240adc3 + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.19.0": version: 7.20.7 resolution: "@babel/plugin-transform-spread@npm:7.20.7" @@ -4829,6 +5727,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-spread@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4c4254c8b9cceb1a8f975fa9b92257ddb08380a35c0a3721b8f4b9e13a3d82e403af2e0fba577b9f2452dd8f06bc3dea71cc53b1e2c6af595af5db52a13429d6 + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-sticky-regex@npm:7.18.6" @@ -4851,6 +5761,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-sticky-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 118fc7a7ebf7c20411b670c8a030535fdfe4a88bc5643bb625a584dbc4c8a468da46430a20e6bf78914246962b0f18f1b9d6a62561a7762c4f34a038a5a77179 + languageName: node + linkType: hard + "@babel/plugin-transform-template-literals@npm:^7.18.9": version: 7.18.9 resolution: "@babel/plugin-transform-template-literals@npm:7.18.9" @@ -4873,6 +5794,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ad44e5826f5a98c1575832dbdbd033adfe683cdff195e178528ead62507564bf02f479b282976cfd3caebad8b06d5fd7349c1cdb880dec3c56daea4f1f179619 + languageName: node + linkType: hard + "@babel/plugin-transform-typeof-symbol@npm:^7.18.9": version: 7.18.9 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.18.9" @@ -4895,6 +5827,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typeof-symbol@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6bd16b9347614d44187d8f8ee23ebd7be30dabf3632eed5ff0415f35a482e827de220527089eae9cdfb75e85aa72db0e141ebc2247c4b1187c1abcdacdc34895 + languageName: node + linkType: hard + "@babel/plugin-transform-typescript@npm:^7.18.6": version: 7.20.13 resolution: "@babel/plugin-transform-typescript@npm:7.20.13" @@ -4944,6 +5887,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-escapes@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7" + dependencies: + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4af0a193e1ddea6ff82b2b15cc2501b872728050bd625740b813c8062fec917d32d530ff6b41de56c15e7296becdf3336a58db81f5ca8e7c445c1306c52f3e01 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-property-regex@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.1" @@ -4956,6 +5910,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-property-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: aae13350c50973f5802ca7906d022a6a0cc0e3aebac9122d0450bbd51e78252d4c2032ad69385e2759fcbdd3aac5d571bd7e26258907f51f8e1a51b53be626c2 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-transform-unicode-regex@npm:7.18.6" @@ -4980,6 +5946,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1cb4e70678906e431da0a05ac3f8350025fee290304ad7482d9cfaa1ca67b2e898654de537c9268efbdad5b80d3ebadf42b4a88ea84609bd8a4cce7b11b48afd + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-sets-regex@npm:^7.24.1": version: 7.24.1 resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.1" @@ -4992,6 +5970,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.7" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 08a2844914f33dacd2ce1ab021ce8c1cc35dc6568521a746d8bf29c21571ee5be78787b454231c4bb3526cbbe280f1893223c82726cec5df2be5dae0a3b51837 + languageName: node + linkType: hard + "@babel/polyfill@npm:^7.10.1, @babel/polyfill@npm:^7.4.4": version: 7.12.1 resolution: "@babel/polyfill@npm:7.12.1" @@ -5087,6 +6077,97 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.22.7": + version: 7.24.7 + resolution: "@babel/preset-env@npm:7.24.7" + dependencies: + "@babel/compat-data": ^7.24.7 + "@babel/helper-compilation-targets": ^7.24.7 + "@babel/helper-plugin-utils": ^7.24.7 + "@babel/helper-validator-option": ^7.24.7 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.24.7 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.24.7 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.24.7 + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.24.7 + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 + "@babel/plugin-syntax-async-generators": ^7.8.4 + "@babel/plugin-syntax-class-properties": ^7.12.13 + "@babel/plugin-syntax-class-static-block": ^7.14.5 + "@babel/plugin-syntax-dynamic-import": ^7.8.3 + "@babel/plugin-syntax-export-namespace-from": ^7.8.3 + "@babel/plugin-syntax-import-assertions": ^7.24.7 + "@babel/plugin-syntax-import-attributes": ^7.24.7 + "@babel/plugin-syntax-import-meta": ^7.10.4 + "@babel/plugin-syntax-json-strings": ^7.8.3 + "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 + "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + "@babel/plugin-syntax-numeric-separator": ^7.10.4 + "@babel/plugin-syntax-object-rest-spread": ^7.8.3 + "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + "@babel/plugin-syntax-optional-chaining": ^7.8.3 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + "@babel/plugin-syntax-top-level-await": ^7.14.5 + "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 + "@babel/plugin-transform-arrow-functions": ^7.24.7 + "@babel/plugin-transform-async-generator-functions": ^7.24.7 + "@babel/plugin-transform-async-to-generator": ^7.24.7 + "@babel/plugin-transform-block-scoped-functions": ^7.24.7 + "@babel/plugin-transform-block-scoping": ^7.24.7 + "@babel/plugin-transform-class-properties": ^7.24.7 + "@babel/plugin-transform-class-static-block": ^7.24.7 + "@babel/plugin-transform-classes": ^7.24.7 + "@babel/plugin-transform-computed-properties": ^7.24.7 + "@babel/plugin-transform-destructuring": ^7.24.7 + "@babel/plugin-transform-dotall-regex": ^7.24.7 + "@babel/plugin-transform-duplicate-keys": ^7.24.7 + "@babel/plugin-transform-dynamic-import": ^7.24.7 + "@babel/plugin-transform-exponentiation-operator": ^7.24.7 + "@babel/plugin-transform-export-namespace-from": ^7.24.7 + "@babel/plugin-transform-for-of": ^7.24.7 + "@babel/plugin-transform-function-name": ^7.24.7 + "@babel/plugin-transform-json-strings": ^7.24.7 + "@babel/plugin-transform-literals": ^7.24.7 + "@babel/plugin-transform-logical-assignment-operators": ^7.24.7 + "@babel/plugin-transform-member-expression-literals": ^7.24.7 + "@babel/plugin-transform-modules-amd": ^7.24.7 + "@babel/plugin-transform-modules-commonjs": ^7.24.7 + "@babel/plugin-transform-modules-systemjs": ^7.24.7 + "@babel/plugin-transform-modules-umd": ^7.24.7 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.24.7 + "@babel/plugin-transform-new-target": ^7.24.7 + "@babel/plugin-transform-nullish-coalescing-operator": ^7.24.7 + "@babel/plugin-transform-numeric-separator": ^7.24.7 + "@babel/plugin-transform-object-rest-spread": ^7.24.7 + "@babel/plugin-transform-object-super": ^7.24.7 + "@babel/plugin-transform-optional-catch-binding": ^7.24.7 + "@babel/plugin-transform-optional-chaining": ^7.24.7 + "@babel/plugin-transform-parameters": ^7.24.7 + "@babel/plugin-transform-private-methods": ^7.24.7 + "@babel/plugin-transform-private-property-in-object": ^7.24.7 + "@babel/plugin-transform-property-literals": ^7.24.7 + "@babel/plugin-transform-regenerator": ^7.24.7 + "@babel/plugin-transform-reserved-words": ^7.24.7 + "@babel/plugin-transform-shorthand-properties": ^7.24.7 + "@babel/plugin-transform-spread": ^7.24.7 + "@babel/plugin-transform-sticky-regex": ^7.24.7 + "@babel/plugin-transform-template-literals": ^7.24.7 + "@babel/plugin-transform-typeof-symbol": ^7.24.7 + "@babel/plugin-transform-unicode-escapes": ^7.24.7 + "@babel/plugin-transform-unicode-property-regex": ^7.24.7 + "@babel/plugin-transform-unicode-regex": ^7.24.7 + "@babel/plugin-transform-unicode-sets-regex": ^7.24.7 + "@babel/preset-modules": 0.1.6-no-external-plugins + babel-plugin-polyfill-corejs2: ^0.4.10 + babel-plugin-polyfill-corejs3: ^0.10.4 + babel-plugin-polyfill-regenerator: ^0.6.1 + core-js-compat: ^3.31.0 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1a82c883c7404359b19b7436d0aab05f8dd4e89e8b1f7de127cc65d0ff6a9b1c345211d9c038f5b6e8f93d26f091fa9c73812d82851026ab4ec93f5ed0f0d675 + languageName: node + linkType: hard + "@babel/preset-env@npm:^7.24.0": version: 7.24.3 resolution: "@babel/preset-env@npm:7.24.3" @@ -5386,6 +6467,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/template@npm:7.24.7" + dependencies: + "@babel/code-frame": ^7.24.7 + "@babel/parser": ^7.24.7 + "@babel/types": ^7.24.7 + checksum: ea90792fae708ddf1632e54c25fe1a86643d8c0132311f81265d2bdbdd42f9f4fac65457056c1b6ca87f7aa0d6a795b549566774bba064bdcea2034ab3960ee9 + languageName: node + linkType: hard + "@babel/traverse@npm:^7.24.0": version: 7.24.1 resolution: "@babel/traverse@npm:7.24.1" @@ -5459,6 +6551,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.24.7": + version: 7.24.7 + resolution: "@babel/types@npm:7.24.7" + dependencies: + "@babel/helper-string-parser": ^7.24.7 + "@babel/helper-validator-identifier": ^7.24.7 + to-fast-properties: ^2.0.0 + checksum: 3e4437fced97e02982972ce5bebd318c47d42c9be2152c0fd28c6f786cc74086cc0a8fb83b602b846e41df37f22c36254338eada1a47ef9d8a1ec92332ca3ea8 + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -6678,6 +7781,13 @@ __metadata: languageName: node linkType: hard +"@faker-js/faker@npm:^8.4.1": + version: 8.4.1 + resolution: "@faker-js/faker@npm:8.4.1" + checksum: d802d531f8929562715adc279cfec763c9a4bc596ec67b0ce43fd0ae61b285d2b0eec6f1f4aa852452a63721a842fe7e81926dce7bd92acca94b01e2a1f55f5a + languageName: node + linkType: hard + "@fastify/accept-negotiator@npm:^1.0.0": version: 1.1.0 resolution: "@fastify/accept-negotiator@npm:1.1.0" @@ -10470,6 +11580,13 @@ __metadata: languageName: node linkType: hard +"@sec-ant/readable-stream@npm:^0.4.1": + version: 0.4.1 + resolution: "@sec-ant/readable-stream@npm:0.4.1" + checksum: eb56f72a70995f725269f1c1c206d6dbeb090e88413b1302a456c600041175a7a484c2f0172454f7bed65a8ab95ffed7647d8ad03e6c23b1e3bbc9845f78cd17 + languageName: node + linkType: hard + "@sigstore/bundle@npm:^1.1.0": version: 1.1.0 resolution: "@sigstore/bundle@npm:1.1.0" @@ -10584,6 +11701,13 @@ __metadata: languageName: node linkType: hard +"@sindresorhus/merge-streams@npm:^4.0.0": + version: 4.0.0 + resolution: "@sindresorhus/merge-streams@npm:4.0.0" + checksum: 5759d31dfd822999bbe3ddcf72d4b15dc3d99ea51dd5b3210888f3348234eaff0f44bc999bef6b3c328daeb34e862a63b2c4abe5590acec541f93bc6fa016c9d + languageName: node + linkType: hard + "@sinonjs/commons@npm:^1.6.0, @sinonjs/commons@npm:^1.7.0, @sinonjs/commons@npm:^1.8.1": version: 1.8.6 resolution: "@sinonjs/commons@npm:1.8.6" @@ -11836,6 +12960,15 @@ __metadata: languageName: node linkType: hard +"@types/execa@npm:^2.0.0": + version: 2.0.0 + resolution: "@types/execa@npm:2.0.0" + dependencies: + execa: "*" + checksum: 7c01bd5b0dfd87055548a9cd5290620b11853d385b0adfbf12674edd3322016d6198fde4c80bd0047f2b93424de4e4e299a93bcbe9ec227379d4bc4e906ebdd0 + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": version: 4.17.43 resolution: "@types/express-serve-static-core@npm:4.17.43" @@ -13542,6 +14675,7 @@ __metadata: "@babel/cli": ^7.23.9 "@babel/core": ^7.24.0 "@webiny/api-elasticsearch-tasks": 0.0.0 + "@webiny/api-headless-cms-es-tasks": 0.0.0 "@webiny/cli": 0.0.0 "@webiny/plugins": 0.0.0 "@webiny/project-utils": 0.0.0 @@ -13559,6 +14693,7 @@ __metadata: "@babel/cli": ^7.23.9 "@babel/core": ^7.24.0 "@webiny/api-elasticsearch-tasks": 0.0.0 + "@webiny/api-headless-cms-es-tasks": 0.0.0 "@webiny/cli": 0.0.0 "@webiny/plugins": 0.0.0 "@webiny/project-utils": 0.0.0 @@ -13979,6 +15114,35 @@ __metadata: languageName: unknown linkType: soft +"@webiny/api-headless-cms-es-tasks@0.0.0, @webiny/api-headless-cms-es-tasks@workspace:packages/api-headless-cms-es-tasks": + version: 0.0.0-use.local + resolution: "@webiny/api-headless-cms-es-tasks@workspace:packages/api-headless-cms-es-tasks" + dependencies: + "@babel/cli": ^7.22.6 + "@babel/core": ^7.22.8 + "@babel/preset-env": ^7.22.7 + "@faker-js/faker": ^8.4.1 + "@webiny/api": 0.0.0 + "@webiny/api-elasticsearch": 0.0.0 + "@webiny/api-headless-cms": 0.0.0 + "@webiny/api-headless-cms-ddb-es": 0.0.0 + "@webiny/api-i18n": 0.0.0 + "@webiny/api-security": 0.0.0 + "@webiny/api-tenancy": 0.0.0 + "@webiny/api-wcp": 0.0.0 + "@webiny/cli": 0.0.0 + "@webiny/handler": 0.0.0 + "@webiny/handler-aws": 0.0.0 + "@webiny/handler-graphql": 0.0.0 + "@webiny/plugins": 0.0.0 + "@webiny/project-utils": 0.0.0 + "@webiny/tasks": 0.0.0 + "@webiny/utils": 0.0.0 + ttypescript: ^1.5.13 + typescript: ^4.7.4 + languageName: unknown + linkType: soft + "@webiny/api-headless-cms-tasks@0.0.0, @webiny/api-headless-cms-tasks@workspace:packages/api-headless-cms-tasks": version: 0.0.0-use.local resolution: "@webiny/api-headless-cms-tasks@workspace:packages/api-headless-cms-tasks" @@ -14023,6 +15187,7 @@ __metadata: "@webiny/api-security": 0.0.0 "@webiny/api-tenancy": 0.0.0 "@webiny/api-wcp": 0.0.0 + "@webiny/aws-sdk": 0.0.0 "@webiny/cli": 0.0.0 "@webiny/error": 0.0.0 "@webiny/handler": 0.0.0 @@ -17307,11 +18472,13 @@ __metadata: resolution: "@webiny/migrations@workspace:packages/migrations" dependencies: "@elastic/elasticsearch": 7.12.0 + "@types/execa": ^2.0.0 "@webiny/api-elasticsearch": 0.0.0 "@webiny/api-headless-cms": 0.0.0 "@webiny/api-headless-cms-ddb-es": 0.0.0 "@webiny/aws-sdk": 0.0.0 "@webiny/cli": 0.0.0 + "@webiny/cli-plugin-deploy-pulumi": 0.0.0 "@webiny/data-migration": 0.0.0 "@webiny/db-dynamodb": 0.0.0 "@webiny/error": 0.0.0 @@ -17322,12 +18489,16 @@ __metadata: "@webiny/project-utils": 0.0.0 "@webiny/utils": 0.0.0 elastic-ts: ^0.8.0 + execa: ^5.0.0 + fast-glob: ^3.2.7 jest-dynalite: ^3.2.0 jsonpack: ^1.1.5 lodash: ^4.17.21 + pino-pretty: ^9.4.0 pluralize: ^8.0.0 ttypescript: ^1.5.13 typescript: 4.7.4 + yargs: ^17.4.0 languageName: unknown linkType: soft @@ -21201,7 +22372,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^6.2.1": +"commander@npm:^6.2.0, commander@npm:^6.2.1": version: 6.2.1 resolution: "commander@npm:6.2.1" checksum: d7090410c0de6bc5c67d3ca41c41760d6d268f3c799e530aafb73b7437d1826bbf0d2a3edac33f8b57cc9887b4a986dce307fa5557e109be40eadb7c43b21742 @@ -21855,7 +23026,7 @@ __metadata: load-json-file: 6.2.0 node-fetch: ^2.6.13 os: 0.1.1 - p-retry: ^4.6.0 + p-retry: ^4.6.2 rimraf: ^5.0.5 semver: ^7.3.5 uuid: 8.3.2 @@ -24442,6 +25613,26 @@ __metadata: languageName: node linkType: hard +"execa@npm:*": + version: 9.2.0 + resolution: "execa@npm:9.2.0" + dependencies: + "@sindresorhus/merge-streams": ^4.0.0 + cross-spawn: ^7.0.3 + figures: ^6.1.0 + get-stream: ^9.0.0 + human-signals: ^7.0.0 + is-plain-obj: ^4.1.0 + is-stream: ^4.0.1 + npm-run-path: ^5.2.0 + pretty-ms: ^9.0.0 + signal-exit: ^4.1.0 + strip-final-newline: ^4.0.0 + yoctocolors: ^2.0.0 + checksum: 3f4eed0eb65a48089bc7bb5c73bd3ce5edd4e7a17c1364e98be78c5a2b34367eab5a2f248ce1556b361953533faeff927fb692de716cda6f73906667c6917873 + languageName: node + linkType: hard + "execa@npm:4.1.0": version: 4.1.0 resolution: "execa@npm:4.1.0" @@ -25004,6 +26195,15 @@ __metadata: languageName: node linkType: hard +"figures@npm:^6.1.0": + version: 6.1.0 + resolution: "figures@npm:6.1.0" + dependencies: + is-unicode-supported: ^2.0.0 + checksum: 35c81239d4fa40b75c2c7c010833b0bc8861c27187e4c9388fca1d9731103ec9989b70ee3b664ef426ddd9abe02ec5f4fd973424aa8c6fd3ea5d3bf57a2d01b4 + languageName: node + linkType: hard + "file-entry-cache@npm:^6.0.1": version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" @@ -25736,6 +26936,16 @@ __metadata: languageName: node linkType: hard +"get-stream@npm:^9.0.0": + version: 9.0.1 + resolution: "get-stream@npm:9.0.1" + dependencies: + "@sec-ant/readable-stream": ^0.4.1 + is-stream: ^4.0.1 + checksum: 631df71d7bd60a7f373094d3c352e2ce412b82d30b1b0ec562e5a4aced976173a4cc0dabef019050e1aceaffb1f0e086349ab3d14377b0b7280510bd75bd3e1e + languageName: node + linkType: hard + "get-symbol-description@npm:^1.0.0": version: 1.0.0 resolution: "get-symbol-description@npm:1.0.0" @@ -26842,6 +28052,13 @@ __metadata: languageName: node linkType: hard +"human-signals@npm:^7.0.0": + version: 7.0.0 + resolution: "human-signals@npm:7.0.0" + checksum: 5e05a7dbb6d021371ddb854c58b19aa372cc616b34e8eec0d27098d699be0571e29b2b98869053d898badb9594b7ed5058642660b04fb1e41b7bd1f83e472d16 + languageName: node + linkType: hard + "humanize-duration@npm:^3.31.0": version: 3.31.0 resolution: "humanize-duration@npm:3.31.0" @@ -27672,6 +28889,13 @@ __metadata: languageName: node linkType: hard +"is-plain-obj@npm:^4.1.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce + languageName: node + linkType: hard + "is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" @@ -27772,6 +28996,13 @@ __metadata: languageName: node linkType: hard +"is-stream@npm:^4.0.1": + version: 4.0.1 + resolution: "is-stream@npm:4.0.1" + checksum: cbea3f1fc271b21ceb228819d0c12a0965a02b57f39423925f99530b4eb86935235f258f06310b67cd02b2d10b49e9a0998f5ececf110ab7d3760bae4055ad23 + languageName: node + linkType: hard + "is-string@npm:^1.0.5, is-string@npm:^1.0.7": version: 1.0.7 resolution: "is-string@npm:1.0.7" @@ -27826,6 +29057,13 @@ __metadata: languageName: node linkType: hard +"is-unicode-supported@npm:^2.0.0": + version: 2.0.0 + resolution: "is-unicode-supported@npm:2.0.0" + checksum: 000b80639dedaf59a385f1c0a57f97a4d1435e0723716f24cc19ad94253a7a0a9f838bdc9ac49b10a29ac93b01f52ae9b2ed358a8876caf1eb74d73b4ede92b2 + languageName: node + linkType: hard + "is-utf8@npm:^0.2.0": version: 0.2.1 resolution: "is-utf8@npm:0.2.1" @@ -31640,7 +32878,7 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^5.1.0": +"npm-run-path@npm:^5.1.0, npm-run-path@npm:^5.2.0": version: 5.3.0 resolution: "npm-run-path@npm:5.3.0" dependencies: @@ -32319,7 +33557,7 @@ __metadata: languageName: node linkType: hard -"p-retry@npm:^4.5.0, p-retry@npm:^4.6.0, p-retry@npm:^4.6.2": +"p-retry@npm:^4.5.0, p-retry@npm:^4.6.2": version: 4.6.2 resolution: "p-retry@npm:4.6.2" dependencies: @@ -32551,6 +33789,13 @@ __metadata: languageName: node linkType: hard +"parse-ms@npm:^4.0.0": + version: 4.0.0 + resolution: "parse-ms@npm:4.0.0" + checksum: 673c801d9f957ff79962d71ed5a24850163f4181a90dd30c4e3666b3a804f53b77f1f0556792e8b2adbb5d58757907d1aa51d7d7dc75997c2a56d72937cbc8b7 + languageName: node + linkType: hard + "parse-path@npm:^7.0.0": version: 7.0.0 resolution: "parse-path@npm:7.0.0" @@ -34183,6 +35428,15 @@ __metadata: languageName: node linkType: hard +"pretty-ms@npm:^9.0.0": + version: 9.0.0 + resolution: "pretty-ms@npm:9.0.0" + dependencies: + parse-ms: ^4.0.0 + checksum: 072b17547e09cb232e8e4c7be0281e256b6d8acd18dfb2fdd715d50330d1689fdaa877f53cf90c62ed419ef842f0f5fb94a2cd8ed1aa6d7608ad48834219435d + languageName: node + linkType: hard + "pretty-time@npm:^1.1.0": version: 1.1.0 resolution: "pretty-time@npm:1.1.0" @@ -37802,6 +39056,13 @@ __metadata: languageName: node linkType: hard +"strip-final-newline@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-final-newline@npm:4.0.0" + checksum: b5fe48f695d74863153a3b3155220e6e9bf51f4447832998c8edec38e6559b3af87a9fe5ac0df95570a78a26f5fa91701358842eab3c15480e27980b154a145f + languageName: node + linkType: hard + "strip-indent@npm:^2.0.0": version: 2.0.0 resolution: "strip-indent@npm:2.0.0" @@ -40508,6 +41769,13 @@ __metadata: languageName: node linkType: hard +"yoctocolors@npm:^2.0.0": + version: 2.0.2 + resolution: "yoctocolors@npm:2.0.2" + checksum: cac20504b5fc954ff117e3a3fbde09db8ac0807bba59e68c5c08f3a43173ef46ccb1853b15b37bd96d0d8187bc444627f160fee7e5aede0b421382cf379d2438 + languageName: node + linkType: hard + "yup@npm:0.32.11": version: 0.32.11 resolution: "yup@npm:0.32.11" From 94337e12720fdb1b24697425541221b2b9161bed Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 12 Jun 2024 16:54:26 +0200 Subject: [PATCH 23/26] fix: remove duplicate identifier --- packages/error/src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/error/src/index.ts b/packages/error/src/index.ts index 46cc69b76e6..8d5f0dcda60 100644 --- a/packages/error/src/index.ts +++ b/packages/error/src/index.ts @@ -2,5 +2,4 @@ import Error, { ErrorOptions } from "./Error"; export { Error as WebinyError }; export default Error; -export { Error as WebinyError }; export { ErrorOptions }; From 6434b8e6ebba78c6235839cab67f3c84f77131a7 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 12 Jun 2024 16:55:21 +0200 Subject: [PATCH 24/26] chore: run prettier --- .../__tests__/contentAPI/snapshots/page.manage.ts | 2 +- .../__tests__/contentAPI/snapshots/page.read.ts | 2 +- .../__tests__/contentAPI/snapshots/product.read.ts | 2 +- .../__tests__/contentAPI/snapshots/review.manage.ts | 2 +- packages/api-headless-cms/src/types/types.ts | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.manage.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.manage.ts index beff90c3142..13ca67ccf9e 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.manage.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.manage.ts @@ -41,7 +41,7 @@ export default /* GraphQL */ ` ) ownedBy: CmsIdentity @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") - + meta: PageModelApiNameMeta content: [PageModelApiName_Content!] header: PageModelApiName_Header diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.read.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.read.ts index 01a3d51c80a..bc501a5c5a0 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.read.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/page.read.ts @@ -42,7 +42,7 @@ export default /* GraphQL */ ` ) ownedBy: CmsIdentity @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") - + content: [PageModelApiName_Content!] header: PageModelApiName_Header objective: PageModelApiName_Objective diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.read.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.read.ts index a6b6f87443d..e86c2b86720 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.read.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/product.read.ts @@ -42,7 +42,7 @@ export default /* GraphQL */ ` ) ownedBy: CmsIdentity @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") - + title: String category(populate: Boolean = true): CategoryApiNameWhichIsABitDifferentThanModelId price: Number diff --git a/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.manage.ts b/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.manage.ts index 7d80f509a01..f17b20200cd 100644 --- a/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.manage.ts +++ b/packages/api-headless-cms/__tests__/contentAPI/snapshots/review.manage.ts @@ -41,7 +41,7 @@ export default /* GraphQL */ ` ) ownedBy: CmsIdentity @deprecated(reason: "Field was removed with the 5.39.0 release. Use 'createdBy' field.") - + meta: ReviewApiModelMeta text: String product: RefField diff --git a/packages/api-headless-cms/src/types/types.ts b/packages/api-headless-cms/src/types/types.ts index 48de7dfc65e..45b4725654b 100644 --- a/packages/api-headless-cms/src/types/types.ts +++ b/packages/api-headless-cms/src/types/types.ts @@ -184,9 +184,9 @@ export interface CmsModelFieldToGraphQLCreateResolver { (params: CmsModelFieldToGraphQLCreateResolverParams): | GraphQLFieldResolver | { - resolver: GraphQLFieldResolver | null; - typeResolvers: Resolvers; - } + resolver: GraphQLFieldResolver | null; + typeResolvers: Resolvers; + } | false; } From eed6a06ebfb6e8e07c1bb4d9ab09be96c222e844 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 12 Jun 2024 17:04:19 +0200 Subject: [PATCH 25/26] ci: rebuild workflows --- .github/workflows/pullRequests.yml | 14 +++++++++----- .github/workflows/pushDev.yml | 14 +++++++++----- .github/workflows/pushNext.yml | 14 +++++++++----- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/.github/workflows/pullRequests.yml b/.github/workflows/pullRequests.yml index bf0d09d0b5c..f7af5259988 100644 --- a/.github/workflows/pullRequests.yml +++ b/.github/workflows/pullRequests.yml @@ -177,7 +177,7 @@ jobs: - 18 package: >- ${{ - fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-dynamodb-to-elasticsearch","id":"api-dynamodb-to-elasticsearch"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-record-locking","id":"api-record-locking"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/api-websockets","id":"api-websockets"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') + fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-record-locking","id":"api-record-locking"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/api-websockets","id":"api-websockets"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') }} runs-on: ${{ matrix.os }} env: @@ -283,14 +283,16 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-aco_ddb-es_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-dynamodb-to-elasticsearch_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-es,ddb","storage":"ddb-es","id":"api-elasticsearch-tasks_ddb-es_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-es,ddb","storage":"ddb-es","id":"api-file-manager_ddb-es_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder_ddb-es_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder-so-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-aco_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-tasks + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-headless-cms-es-tasks_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-tasks --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-tasks_ddb-es_ddb"},{"cmd":"packages/api-mailer --storage=ddb-es,ddb","storage":"ddb-es","id":"api-mailer_ddb-es_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-page-builder_ddb-es_ddb"},{"cmd":"packages/api-page-builder-aco @@ -352,14 +354,16 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-aco_ddb-os_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-dynamodb-to-elasticsearch_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-os,ddb","storage":"ddb-os","id":"api-elasticsearch-tasks_ddb-os_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-os,ddb","storage":"ddb-os","id":"api-file-manager_ddb-os_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder_ddb-os_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder-so-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-aco_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-tasks + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-headless-cms-es-tasks_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-tasks --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-tasks_ddb-os_ddb"},{"cmd":"packages/api-mailer --storage=ddb-os,ddb","storage":"ddb-os","id":"api-mailer_ddb-os_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-page-builder_ddb-os_ddb"},{"cmd":"packages/api-page-builder-aco diff --git a/.github/workflows/pushDev.yml b/.github/workflows/pushDev.yml index fae212922d5..0bea44b5c2f 100644 --- a/.github/workflows/pushDev.yml +++ b/.github/workflows/pushDev.yml @@ -143,7 +143,7 @@ jobs: - 18 package: >- ${{ - fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-dynamodb-to-elasticsearch","id":"api-dynamodb-to-elasticsearch"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-record-locking","id":"api-record-locking"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/api-websockets","id":"api-websockets"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') + fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-record-locking","id":"api-record-locking"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/api-websockets","id":"api-websockets"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') }} runs-on: ${{ matrix.os }} env: @@ -249,14 +249,16 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-aco_ddb-es_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-dynamodb-to-elasticsearch_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-es,ddb","storage":"ddb-es","id":"api-elasticsearch-tasks_ddb-es_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-es,ddb","storage":"ddb-es","id":"api-file-manager_ddb-es_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder_ddb-es_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder-so-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-aco_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-tasks + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-headless-cms-es-tasks_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-tasks --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-tasks_ddb-es_ddb"},{"cmd":"packages/api-mailer --storage=ddb-es,ddb","storage":"ddb-es","id":"api-mailer_ddb-es_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-page-builder_ddb-es_ddb"},{"cmd":"packages/api-page-builder-aco @@ -317,14 +319,16 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-aco_ddb-os_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-dynamodb-to-elasticsearch_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-os,ddb","storage":"ddb-os","id":"api-elasticsearch-tasks_ddb-os_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-os,ddb","storage":"ddb-os","id":"api-file-manager_ddb-os_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder_ddb-os_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder-so-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-aco_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-tasks + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-headless-cms-es-tasks_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-tasks --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-tasks_ddb-os_ddb"},{"cmd":"packages/api-mailer --storage=ddb-os,ddb","storage":"ddb-os","id":"api-mailer_ddb-os_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-page-builder_ddb-os_ddb"},{"cmd":"packages/api-page-builder-aco diff --git a/.github/workflows/pushNext.yml b/.github/workflows/pushNext.yml index 3c46cd84448..81164fc8ce3 100644 --- a/.github/workflows/pushNext.yml +++ b/.github/workflows/pushNext.yml @@ -143,7 +143,7 @@ jobs: - 18 package: >- ${{ - fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-dynamodb-to-elasticsearch","id":"api-dynamodb-to-elasticsearch"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-record-locking","id":"api-record-locking"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/api-websockets","id":"api-websockets"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') + fromJson('[{"cmd":"packages/api","id":"api"},{"cmd":"packages/api-admin-settings","id":"api-admin-settings"},{"cmd":"packages/api-authentication","id":"api-authentication"},{"cmd":"packages/api-authentication-cognito","id":"api-authentication-cognito"},{"cmd":"packages/api-headless-cms-ddb","id":"api-headless-cms-ddb"},{"cmd":"packages/api-record-locking","id":"api-record-locking"},{"cmd":"packages/api-wcp","id":"api-wcp"},{"cmd":"packages/api-websockets","id":"api-websockets"},{"cmd":"packages/app-aco","id":"app-aco"},{"cmd":"packages/app-admin","id":"app-admin"},{"cmd":"packages/cwp-template-aws","id":"cwp-template-aws"},{"cmd":"packages/data-migration","id":"data-migration"},{"cmd":"packages/db-dynamodb","id":"db-dynamodb"},{"cmd":"packages/form","id":"form"},{"cmd":"packages/handler","id":"handler"},{"cmd":"packages/handler-aws","id":"handler-aws"},{"cmd":"packages/handler-graphql","id":"handler-graphql"},{"cmd":"packages/handler-logs","id":"handler-logs"},{"cmd":"packages/ioc","id":"ioc"},{"cmd":"packages/lexical-converter","id":"lexical-converter"},{"cmd":"packages/plugins","id":"plugins"},{"cmd":"packages/pubsub","id":"pubsub"},{"cmd":"packages/react-composition","id":"react-composition"},{"cmd":"packages/react-properties","id":"react-properties"},{"cmd":"packages/react-rich-text-lexical-renderer","id":"react-rich-text-lexical-renderer"},{"cmd":"packages/utils","id":"utils"},{"cmd":"packages/validation","id":"validation"}]') }} runs-on: ${{ matrix.os }} env: @@ -249,14 +249,16 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-aco_ddb-es_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-audit-logs_ddb-es_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-dynamodb-to-elasticsearch_ddb-es_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-es,ddb","storage":"ddb-es","id":"api-elasticsearch-tasks_ddb-es_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-es,ddb","storage":"ddb-es","id":"api-file-manager_ddb-es_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder_ddb-es_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-es,ddb","storage":"ddb-es","id":"api-form-builder-so-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-aco --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-aco_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-tasks + --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-ddb-es_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-es,ddb","storage":["ddb-es"],"id":"api-headless-cms-es-tasks_ddb-es_ddb"},{"cmd":"packages/api-headless-cms-tasks --storage=ddb-es,ddb","storage":"ddb-es","id":"api-headless-cms-tasks_ddb-es_ddb"},{"cmd":"packages/api-mailer --storage=ddb-es,ddb","storage":"ddb-es","id":"api-mailer_ddb-es_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-es,ddb","storage":"ddb-es","id":"api-page-builder_ddb-es_ddb"},{"cmd":"packages/api-page-builder-aco @@ -317,14 +319,16 @@ jobs: package: >- ${{ fromJson('[{"cmd":"packages/api-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-aco_ddb-os_ddb"},{"cmd":"packages/api-audit-logs - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-audit-logs_ddb-os_ddb"},{"cmd":"packages/api-dynamodb-to-elasticsearch + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-dynamodb-to-elasticsearch_ddb-os_ddb"},{"cmd":"packages/api-elasticsearch","storage":["ddb-es","ddb-os"],"id":"api-elasticsearch"},{"cmd":"packages/api-elasticsearch-tasks --storage=ddb-os,ddb","storage":"ddb-os","id":"api-elasticsearch-tasks_ddb-os_ddb"},{"cmd":"packages/api-file-manager --storage=ddb-os,ddb","storage":"ddb-os","id":"api-file-manager_ddb-os_ddb"},{"cmd":"packages/api-form-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder_ddb-os_ddb"},{"cmd":"packages/api-form-builder-so-ddb-es --storage=ddb-os,ddb","storage":"ddb-os","id":"api-form-builder-so-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-aco --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-aco_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-ddb-es - --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-tasks + --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-ddb-es_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-es-tasks + --storage=ddb-os,ddb","storage":["ddb-os"],"id":"api-headless-cms-es-tasks_ddb-os_ddb"},{"cmd":"packages/api-headless-cms-tasks --storage=ddb-os,ddb","storage":"ddb-os","id":"api-headless-cms-tasks_ddb-os_ddb"},{"cmd":"packages/api-mailer --storage=ddb-os,ddb","storage":"ddb-os","id":"api-mailer_ddb-os_ddb"},{"cmd":"packages/api-page-builder --storage=ddb-os,ddb","storage":"ddb-os","id":"api-page-builder_ddb-os_ddb"},{"cmd":"packages/api-page-builder-aco From 3d1dade9e82d5d906eaf3f46a282af86909c379c Mon Sep 17 00:00:00 2001 From: adrians5j Date: Thu, 13 Jun 2024 06:34:54 +0200 Subject: [PATCH 26/26] test: add new deletedX meta fields into entity definition --- .../__tests__/migrations/5.39.6/001/ddb-es/001.test.ts | 2 +- .../migrations/5.39.0/001/entities/createEntryEntity.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.test.ts b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.test.ts index d23626a1fd2..6b11f0fca06 100644 --- a/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.test.ts +++ b/packages/migrations/__tests__/migrations/5.39.6/001/ddb-es/001.test.ts @@ -49,7 +49,7 @@ const expectModifiedFieldsAreSynced = (entry: Record) => { expect(hasEntryModifiedOn).toBe(hasEntryModifiedBy); }; -describe("5.39.2-001", () => { +describe("5.39.6-001", () => { const primaryTable = getPrimaryDynamoDbTable(); const dynamoToEsTable = getDynamoToEsTable(); const elasticsearchClient = createElasticsearchClient(); diff --git a/packages/migrations/src/migrations/5.39.0/001/entities/createEntryEntity.ts b/packages/migrations/src/migrations/5.39.0/001/entities/createEntryEntity.ts index bda469efc7f..3a81dfbd5f1 100644 --- a/packages/migrations/src/migrations/5.39.0/001/entities/createEntryEntity.ts +++ b/packages/migrations/src/migrations/5.39.0/001/entities/createEntryEntity.ts @@ -47,11 +47,15 @@ const ddbAttributes: Parameters[2] = { revisionCreatedOn: { type: "string" }, revisionSavedOn: { type: "string" }, revisionModifiedOn: { type: "string" }, + revisionDeletedOn: { type: "string" }, + revisionRestoredOn: { type: "string" }, revisionFirstPublishedOn: { type: "string" }, revisionLastPublishedOn: { type: "string" }, revisionCreatedBy: { type: "map" }, revisionSavedBy: { type: "map" }, revisionModifiedBy: { type: "map" }, + revisionDeletedBy: { type: "map" }, + revisionRestoredBy: { type: "map" }, revisionFirstPublishedBy: { type: "map" }, revisionLastPublishedBy: { type: "map" }, @@ -61,11 +65,15 @@ const ddbAttributes: Parameters[2] = { createdOn: { type: "string" }, savedOn: { type: "string" }, modifiedOn: { type: "string" }, + deletedOn: { type: "string" }, + restoredOn: { type: "string" }, firstPublishedOn: { type: "string" }, lastPublishedOn: { type: "string" }, createdBy: { type: "map" }, savedBy: { type: "map" }, modifiedBy: { type: "map" }, + deletedBy: { type: "map" }, + restoredBy: { type: "map" }, firstPublishedBy: { type: "map" }, lastPublishedBy: { type: "map" },