diff --git a/packages/api-admin-users-cognito-so-ddb/LICENSE b/packages/api-admin-users-cognito-so-ddb/LICENSE deleted file mode 100644 index f772d04d4db..00000000000 --- a/packages/api-admin-users-cognito-so-ddb/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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-admin-users-cognito-so-ddb/README.md b/packages/api-admin-users-cognito-so-ddb/README.md deleted file mode 100644 index 82a33659a33..00000000000 --- a/packages/api-admin-users-cognito-so-ddb/README.md +++ /dev/null @@ -1 +0,0 @@ -This package was deprecated with the 5.38.0 release of Webiny. \ No newline at end of file diff --git a/packages/api-admin-users-cognito-so-ddb/index.js b/packages/api-admin-users-cognito-so-ddb/index.js deleted file mode 100644 index 60ef3a9c477..00000000000 --- a/packages/api-admin-users-cognito-so-ddb/index.js +++ /dev/null @@ -1 +0,0 @@ -export const dummyObject = {}; diff --git a/packages/api-admin-users-cognito-so-ddb/package.json b/packages/api-admin-users-cognito-so-ddb/package.json deleted file mode 100644 index 66467b69563..00000000000 --- a/packages/api-admin-users-cognito-so-ddb/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "@webiny/api-admin-users-cognito-so-ddb", - "version": "0.0.0", - "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/webiny/webiny-js.git" - }, - "license": "MIT", - "publishConfig": { - "access": "public", - "directory": "." - }, - "scripts": { - "build": "yarn webiny run build", - "watch": "yarn webiny run watch" - } -} diff --git a/packages/api-admin-users-cognito/LICENSE b/packages/api-admin-users-cognito/LICENSE deleted file mode 100644 index f772d04d4db..00000000000 --- a/packages/api-admin-users-cognito/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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-admin-users-cognito/README.md b/packages/api-admin-users-cognito/README.md deleted file mode 100644 index 82a33659a33..00000000000 --- a/packages/api-admin-users-cognito/README.md +++ /dev/null @@ -1 +0,0 @@ -This package was deprecated with the 5.38.0 release of Webiny. \ No newline at end of file diff --git a/packages/api-admin-users-cognito/index.js b/packages/api-admin-users-cognito/index.js deleted file mode 100644 index 60ef3a9c477..00000000000 --- a/packages/api-admin-users-cognito/index.js +++ /dev/null @@ -1 +0,0 @@ -export const dummyObject = {}; diff --git a/packages/api-admin-users-cognito/package.json b/packages/api-admin-users-cognito/package.json deleted file mode 100644 index d76658cf7ef..00000000000 --- a/packages/api-admin-users-cognito/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "@webiny/api-admin-users-cognito", - "version": "0.0.0", - "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/webiny/webiny-js.git" - }, - "license": "MIT", - "publishConfig": { - "access": "public", - "directory": "." - } -} diff --git a/packages/api-headless-cms/src/context.ts b/packages/api-headless-cms/src/context.ts index a7cee1bce16..c448b4b40f9 100644 --- a/packages/api-headless-cms/src/context.ts +++ b/packages/api-headless-cms/src/context.ts @@ -9,9 +9,6 @@ import { createModelsCrud } from "~/crud/contentModel.crud"; import { createContentEntryCrud } from "~/crud/contentEntry.crud"; import { StorageOperationsCmsModelPlugin } from "~/plugins"; import { createCmsModelFieldConvertersAttachFactory } from "~/utils/converters/valueKeyStorageConverter"; -import { ModelsPermissions } from "~/utils/permissions/ModelsPermissions"; -import { ModelGroupsPermissions } from "./utils/permissions/ModelGroupsPermissions"; -import { EntriesPermissions } from "./utils/permissions/EntriesPermissions"; import { createExportCrud } from "~/export"; import { createImportCrud } from "~/export/crud/importing"; @@ -63,25 +60,6 @@ export const createContextPlugin = ({ storageOperations }: CrudParams) => { await context.benchmark.measure("headlessCms.createContext", async () => { await storageOperations.beforeInit(context); - const modelGroupsPermissions = new ModelGroupsPermissions({ - getIdentity: context.security.getIdentity, - getPermissions: () => context.security.getPermissions("cms.contentModelGroup"), - fullAccessPermissionName: "cms.*" - }); - - const modelsPermissions = new ModelsPermissions({ - getIdentity: context.security.getIdentity, - getPermissions: () => context.security.getPermissions("cms.contentModel"), - fullAccessPermissionName: "cms.*", - modelGroupsPermissions - }); - - const entriesPermissions = new EntriesPermissions({ - getIdentity: context.security.getIdentity, - getPermissions: () => context.security.getPermissions("cms.contentEntry"), - fullAccessPermissionName: "cms.*" - }); - const accessControl = new AccessControl({ getIdentity: context.security.getIdentity, getGroupsPermissions: () => @@ -103,14 +81,6 @@ export const createContextPlugin = ({ storageOperations }: CrudParams) => { PREVIEW: type === "preview", MANAGE: type === "manage", storageOperations, - - // TODO: remove with 5.40 release. - permissions: { - groups: modelGroupsPermissions, - models: modelsPermissions, - entries: entriesPermissions - }, - accessControl, ...createSystemCrud({ context, diff --git a/packages/api-headless-cms/src/types.ts b/packages/api-headless-cms/src/types.ts index 6e935436f2c..aeb0c19a738 100644 --- a/packages/api-headless-cms/src/types.ts +++ b/packages/api-headless-cms/src/types.ts @@ -12,18 +12,9 @@ import { Topic } from "@webiny/pubsub/types"; import { CmsModelConverterCallable } from "~/utils/converters/ConverterCollection"; import { HeadlessCmsExport, HeadlessCmsImport } from "~/export/types"; import { AccessControl } from "~/crud/AccessControl/AccessControl"; -import { ModelGroupsPermissions } from "~/utils/permissions/ModelGroupsPermissions"; -import { ModelsPermissions } from "~/utils/permissions/ModelsPermissions"; -import { EntriesPermissions } from "~/utils/permissions/EntriesPermissions"; export type ApiEndpoint = "manage" | "preview" | "read"; -interface HeadlessCmsPermissions { - groups: ModelGroupsPermissions; - models: ModelsPermissions; - entries: EntriesPermissions; -} - export interface HeadlessCms extends CmsSystemContext, CmsGroupContext, @@ -63,13 +54,6 @@ export interface HeadlessCms */ accessControl: AccessControl; - /** - * Permissions for groups, models and entries. - * @internal - * @deprecated Will be removed with the 5.40.0 release. Use `accessControl` instead. - */ - permissions: HeadlessCmsPermissions; - /** * Export operations. */ diff --git a/packages/api-headless-cms/src/utils/permissions/EntriesPermissions.ts b/packages/api-headless-cms/src/utils/permissions/EntriesPermissions.ts deleted file mode 100644 index 9adef9f6253..00000000000 --- a/packages/api-headless-cms/src/utils/permissions/EntriesPermissions.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { CmsEntryPermission } from "~/types"; -import { AppPermissions } from "@webiny/api-security"; - -export class EntriesPermissions extends AppPermissions {} diff --git a/packages/api-headless-cms/src/utils/permissions/ModelGroupsPermissions.ts b/packages/api-headless-cms/src/utils/permissions/ModelGroupsPermissions.ts deleted file mode 100644 index 8eb5c665b26..00000000000 --- a/packages/api-headless-cms/src/utils/permissions/ModelGroupsPermissions.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { AppPermissions, NotAuthorizedError } from "@webiny/api-security"; -import { CmsGroup, CmsGroupPermission } from "~/types"; - -export interface CanAccessGroupParams { - group: Pick; -} - -export class ModelGroupsPermissions extends AppPermissions { - async canAccessGroup({ group }: CanAccessGroupParams) { - if (await this.hasFullAccess()) { - return true; - } - - const permissions = await this.getPermissions(); - - const locale = group.locale; - - for (const permission of permissions) { - const { groups } = permission; - - // When no groups defined on permission it means user has access to everything. - if (!groups) { - return true; - } - - // when there is no locale in groups, it means that no access was given - // this happens when access control was set but no models or groups were added - if ( - Array.isArray(groups[locale]) === false || - groups[locale].includes(group.id) === false - ) { - continue; - } - return true; - } - - return false; - } - - async ensureCanAccessGroup(params: CanAccessGroupParams) { - const canAccessModel = await this.canAccessGroup(params); - if (canAccessModel) { - return; - } - - throw new NotAuthorizedError({ - data: { - reason: `Not allowed to access group "${params.group.id}".` - } - }); - } -} diff --git a/packages/api-headless-cms/src/utils/permissions/ModelsPermissions.ts b/packages/api-headless-cms/src/utils/permissions/ModelsPermissions.ts deleted file mode 100644 index 53a06368784..00000000000 --- a/packages/api-headless-cms/src/utils/permissions/ModelsPermissions.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { AppPermissions, AppPermissionsParams, NotAuthorizedError } from "@webiny/api-security"; -import { - CmsGroupPermission, - CmsModel as BaseCmsModel, - CmsModelGroup as BaseCmsModelGroup, - CmsModelPermission -} from "~/types"; -import { ModelGroupsPermissions } from "~/utils/permissions/ModelGroupsPermissions"; - -export interface ModelsPermissionsParams extends AppPermissionsParams { - modelGroupsPermissions: ModelGroupsPermissions; -} - -interface PickedCmsModel extends Pick { - group: Pick; -} - -export interface CanAccessModelParams { - model: PickedCmsModel; -} - -export interface EnsureModelAccessParams { - model: PickedCmsModel; -} - -export class ModelsPermissions extends AppPermissions { - private readonly modelGroupsPermissions: ModelGroupsPermissions; - - public constructor(params: ModelsPermissionsParams) { - super(params); - this.modelGroupsPermissions = params.modelGroupsPermissions; - } - - public async canAccessModel({ model }: CanAccessModelParams) { - if (await this.hasFullAccess()) { - return true; - } - - const modelGroupsPermissions = this.modelGroupsPermissions; - - // eslint-disable-next-line - const modelsPermissions = this; - - const canReadGroups = await modelGroupsPermissions.ensure({ rwd: "r" }, { throw: false }); - if (!canReadGroups) { - return false; - } - - const canReadModels = await modelsPermissions.ensure({ rwd: "r" }, { throw: false }); - if (!canReadModels) { - return false; - } - - const modelGroupsPermissionsList = await modelGroupsPermissions.getPermissions(); - const modelsPermissionsList = await this.getPermissions(); - - const locale = model.locale; - - for (let i = 0; i < modelGroupsPermissionsList.length; i++) { - const modelGroupPermission = modelGroupsPermissionsList[i]; - - const { groups } = modelGroupPermission; - - for (let j = 0; j < modelsPermissionsList.length; j++) { - const modelPermission = modelsPermissionsList[j]; - - const { models } = modelPermission; - // when no models or groups defined on permission - // it means user has access to everything - if (!models && !groups) { - return true; - } - - // Does the model belong to a group for which user has permission? - if (groups) { - if ( - Array.isArray(groups[locale]) === false || - groups[locale].includes(model.group.id) === false - ) { - continue; - } - } - - // Does the user have access to the specific model? - if (models) { - if ( - Array.isArray(models[locale]) === false || - models[locale].includes(model.modelId) === false - ) { - continue; - } - } - - return true; - } - } - - return false; - } - - public async ensureCanAccessModel(params: EnsureModelAccessParams) { - const canAccessModel = await this.canAccessModel(params); - if (canAccessModel) { - return; - } - - throw new NotAuthorizedError({ - data: { - reason: `Not allowed to access model "${params.model.modelId}".` - } - }); - } -} diff --git a/packages/api-i18n/src/graphql/crud/locales.crud.ts b/packages/api-i18n/src/graphql/crud/locales.crud.ts index 6ad1a6d0b27..80151de9ffc 100644 --- a/packages/api-i18n/src/graphql/crud/locales.crud.ts +++ b/packages/api-i18n/src/graphql/crud/locales.crud.ts @@ -53,18 +53,6 @@ export const createLocalesCrud = (params: CreateLocalesCrudParams): LocalesCRUD ); return { - /** - * Deprecated in 5.34.0 - */ - onBeforeCreate: onLocaleBeforeCreate, - onAfterCreate: onLocaleAfterCreate, - onBeforeUpdate: onLocaleBeforeUpdate, - onAfterUpdate: onLocaleAfterUpdate, - onBeforeDelete: onLocaleBeforeDelete, - onAfterDelete: onLocaleAfterDelete, - /** - * Introduced in 5.34.0 - */ onLocaleBeforeCreate, onLocaleAfterCreate, onLocaleBeforeUpdate, diff --git a/packages/api-i18n/src/graphql/crud/system.crud.ts b/packages/api-i18n/src/graphql/crud/system.crud.ts index 6ba79b1b12f..51a075a7ab8 100644 --- a/packages/api-i18n/src/graphql/crud/system.crud.ts +++ b/packages/api-i18n/src/graphql/crud/system.crud.ts @@ -31,14 +31,6 @@ export const createSystemCrud = (params: CreateSystemCrudParams): SystemCRUD => ); return { - /** - * Deprecated in 5.34.0 - */ - onBeforeInstall: onSystemBeforeInstall, - onAfterInstall: onSystemAfterInstall, - /** - * Introduced in 5.34.0 - */ onSystemBeforeInstall, onSystemAfterInstall, storageOperations, diff --git a/packages/api-i18n/src/types.ts b/packages/api-i18n/src/types.ts index f0bc31809ae..659782048cb 100644 --- a/packages/api-i18n/src/types.ts +++ b/packages/api-i18n/src/types.ts @@ -63,20 +63,6 @@ export interface SystemCRUD { * Run the install process for the i18n. */ installSystem(params: SystemInstallParams): Promise; - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed in 5.36.0 - */ - /** - * @deprecated - */ - onBeforeInstall: Topic; - /** - * @deprecated - */ - onAfterInstall: Topic; - /** - * Introduced in 5.34.0 - */ onSystemBeforeInstall: Topic; onSystemAfterInstall: Topic; } @@ -166,36 +152,6 @@ export interface OnLocaleAfterDeleteTopicParams { */ export interface LocalesCRUD { storageOperations: I18NLocalesStorageOperations; - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed in 5.36.0 - */ - /** - * @deprecated - */ - onBeforeCreate: Topic; - /** - * @deprecated - */ - onAfterCreate: Topic; - /** - * @deprecated - */ - onBeforeUpdate: Topic; - /** - * @deprecated - */ - onAfterUpdate: Topic; - /** - * @deprecated - */ - onBeforeDelete: Topic; - /** - * @deprecated - */ - onAfterDelete: Topic; - /** - * Introduced in 5.34.0 - */ onLocaleBeforeCreate: Topic; onLocaleAfterCreate: Topic; onLocaleBeforeUpdate: Topic; diff --git a/packages/api-page-builder/src/graphql/crud/categories.crud.ts b/packages/api-page-builder/src/graphql/crud/categories.crud.ts index 7f0edaf50a1..158335ce06e 100644 --- a/packages/api-page-builder/src/graphql/crud/categories.crud.ts +++ b/packages/api-page-builder/src/graphql/crud/categories.crud.ts @@ -63,18 +63,6 @@ export const createCategoriesCrud = (params: CreateCategoriesCrudParams): Catego ); return { - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed from 5.36.0 - */ - onBeforeCategoryCreate: onCategoryBeforeCreate, - onAfterCategoryCreate: onCategoryAfterCreate, - onBeforeCategoryUpdate: onCategoryBeforeUpdate, - onAfterCategoryUpdate: onCategoryAfterUpdate, - onBeforeCategoryDelete: onCategoryBeforeDelete, - onAfterCategoryDelete: onCategoryAfterDelete, - /** - * Introduced in 5.34.0 - */ onCategoryBeforeCreate, onCategoryAfterCreate, onCategoryBeforeUpdate, diff --git a/packages/api-page-builder/src/graphql/crud/menus.crud.ts b/packages/api-page-builder/src/graphql/crud/menus.crud.ts index 40764ac181b..8bdb7804c9a 100644 --- a/packages/api-page-builder/src/graphql/crud/menus.crud.ts +++ b/packages/api-page-builder/src/graphql/crud/menus.crud.ts @@ -58,18 +58,6 @@ export const createMenuCrud = (params: CreateMenuCrudParams): MenusCrud => { ); return { - /** - * Deprecated in 5.34.0 - will be removed in 5.36.0 - */ - onBeforeMenuCreate: onMenuBeforeCreate, - onAfterMenuCreate: onMenuAfterCreate, - onBeforeMenuUpdate: onMenuBeforeUpdate, - onAfterMenuUpdate: onMenuAfterUpdate, - onBeforeMenuDelete: onMenuBeforeDelete, - onAfterMenuDelete: onMenuAfterDelete, - /** - * - */ onMenuBeforeCreate, onMenuAfterCreate, onMenuBeforeUpdate, diff --git a/packages/api-page-builder/src/graphql/crud/pages.crud.ts b/packages/api-page-builder/src/graphql/crud/pages.crud.ts index 472cbbb0020..455895bf06f 100644 --- a/packages/api-page-builder/src/graphql/crud/pages.crud.ts +++ b/packages/api-page-builder/src/graphql/crud/pages.crud.ts @@ -272,24 +272,6 @@ export const createPageCrud = (params: CreatePageCrudParams): PagesCrud => { const pageElementProcessors: PageElementProcessor[] = []; return { - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed in 5.36.0 - */ - onBeforePageCreate: onPageBeforeCreate, - onAfterPageCreate: onPageAfterCreate, - onBeforePageCreateFrom: onPageBeforeCreateFrom, - onAfterPageCreateFrom: onPageAfterCreateFrom, - onBeforePageUpdate: onPageBeforeUpdate, - onAfterPageUpdate: onPageAfterUpdate, - onBeforePageDelete: onPageBeforeDelete, - onAfterPageDelete: onPageAfterDelete, - onBeforePagePublish: onPageBeforePublish, - onAfterPagePublish: onPageAfterPublish, - onBeforePageUnpublish: onPageBeforeUnpublish, - onAfterPageUnpublish: onPageAfterUnpublish, - /** - * Introduced in 5.34.0 - */ onPageBeforeCreate, onPageAfterCreate, onPageBeforeCreateFrom, diff --git a/packages/api-page-builder/src/graphql/crud/settings.crud.ts b/packages/api-page-builder/src/graphql/crud/settings.crud.ts index ec486d034da..78a3394da6a 100644 --- a/packages/api-page-builder/src/graphql/crud/settings.crud.ts +++ b/packages/api-page-builder/src/graphql/crud/settings.crud.ts @@ -65,14 +65,6 @@ export const createSettingsCrud = (params: CreateSettingsCrudParams): SettingsCr ); return { - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed in 5.36.0 - */ - onBeforeSettingsUpdate: onSettingsBeforeUpdate, - onAfterSettingsUpdate: onSettingsAfterUpdate, - /** - * Introduced in 5.34.0 - */ onSettingsBeforeUpdate, onSettingsAfterUpdate, async getCurrentSettings(this: PageBuilderContextObject) { diff --git a/packages/api-page-builder/src/graphql/crud/system.crud.ts b/packages/api-page-builder/src/graphql/crud/system.crud.ts index ffdaf9f08f0..ae3ed4f1d38 100644 --- a/packages/api-page-builder/src/graphql/crud/system.crud.ts +++ b/packages/api-page-builder/src/graphql/crud/system.crud.ts @@ -32,14 +32,6 @@ export const createSystemCrud = (params: CreateSystemCrudParams): SystemCrud => ); return { - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed in 5.36.0 - */ - onBeforeInstall: onSystemBeforeInstall, - onAfterInstall: onSystemAfterInstall, - /** - * Introduced in 5.34.0 - */ onSystemBeforeInstall, onSystemAfterInstall, async getSystem() { diff --git a/packages/api-page-builder/src/graphql/types.ts b/packages/api-page-builder/src/graphql/types.ts index ba0e1220339..fe1d0cf352d 100644 --- a/packages/api-page-builder/src/graphql/types.ts +++ b/packages/api-page-builder/src/graphql/types.ts @@ -224,60 +224,6 @@ export interface PagesCrud { render(args: RenderParams): Promise; flush(args: FlushParams): Promise; }; - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed in 5.36.0 - */ - /** - * @deprecated - */ - onBeforePageCreate: Topic; - /** - * @deprecated - */ - onAfterPageCreate: Topic; - /** - * @deprecated - */ - onBeforePageCreateFrom: Topic; - /** - * @deprecated - */ - onAfterPageCreateFrom: Topic; - /** - * @deprecated - */ - onBeforePageUpdate: Topic; - /** - * @deprecated - */ - onAfterPageUpdate: Topic; - /** - * @deprecated - */ - onBeforePageDelete: Topic; - /** - * @deprecated - */ - onAfterPageDelete: Topic; - /** - * @deprecated - */ - onBeforePagePublish: Topic; - /** - * @deprecated - */ - onAfterPagePublish: Topic; - /** - * @deprecated - */ - onBeforePageUnpublish: Topic; - /** - * @deprecated - */ - onAfterPageUnpublish: Topic; - /** - * Lifecycle events introduced in 5.34.0 - */ onPageBeforeCreate: Topic; onPageAfterCreate: Topic; onPageBeforeCreateFrom: Topic; @@ -403,39 +349,6 @@ export interface CategoriesCrud { createCategory(data: PbCategoryInput): Promise; updateCategory(slug: string, data: PbCategoryInput): Promise; deleteCategory(slug: string): Promise; - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed in 5.36.0 - */ - /** - * @deprecated - */ - /** - * @deprecated - */ - onBeforeCategoryCreate: Topic; - /** - * @deprecated - */ - onAfterCategoryCreate: Topic; - /** - * @deprecated - */ - onBeforeCategoryUpdate: Topic; - /** - * @deprecated - */ - onAfterCategoryUpdate: Topic; - /** - * @deprecated - */ - onBeforeCategoryDelete: Topic; - /** - * @deprecated - */ - onAfterCategoryDelete: Topic; - /** - * Introduced in 5.34.0 - */ onCategoryBeforeCreate: Topic; onCategoryAfterCreate: Topic; onCategoryBeforeUpdate: Topic; @@ -509,36 +422,6 @@ export interface MenusCrud { createMenu(data: CreateMenuInput): Promise; updateMenu(slug: string, data: Record): Promise; deleteMenu(slug: string): Promise; - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed in 5.36.0 - */ - /** - * @deprecated - */ - onBeforeMenuCreate: Topic; - /** - * @deprecated - */ - onAfterMenuCreate: Topic; - /** - * @deprecated - */ - onBeforeMenuUpdate: Topic; - /** - * @deprecated - */ - onAfterMenuUpdate: Topic; - /** - * @deprecated - */ - onBeforeMenuDelete: Topic; - /** - * @deprecated - */ - onAfterMenuDelete: Topic; - /** - * Lifecycle events introduced in 5.34.0 - */ onMenuBeforeCreate: Topic; onMenuAfterCreate: Topic; onMenuBeforeUpdate: Topic; @@ -590,20 +473,6 @@ export interface SettingsCrud { data: Record, options?: { auth?: boolean } & DefaultSettingsCrudOptions ) => Promise; - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed in 5.36.0 - */ - /** - * @deprecated - */ - onBeforeSettingsUpdate: Topic; - /** - * @deprecated - */ - onAfterSettingsUpdate: Topic; - /** - * Lifecycle events introduced in 5.34.0 - */ onSettingsBeforeUpdate: Topic; onSettingsAfterUpdate: Topic; } @@ -628,17 +497,6 @@ export interface SystemCrud { getSystemVersion(): Promise; setSystemVersion(version: string): Promise; installSystem(args: { name: string; insertDemoData: boolean }): Promise; - /** - * Lifecycle events - deprecated in 5.34.0 - will be removed in 5.36.0 - */ - /** - * @deprecated - */ - onBeforeInstall: Topic; - /** - * @deprecated - */ - onAfterInstall: Topic; /** * Lifecycle events */ diff --git a/packages/api-wcp/src/graphql.ts b/packages/api-wcp/src/graphql.ts index 8374b459554..a13e20c9674 100644 --- a/packages/api-wcp/src/graphql.ts +++ b/packages/api-wcp/src/graphql.ts @@ -25,6 +25,8 @@ export const createWcpGraphQL = () => { } type WcpProject { + orgId: ID + projectId: ID package: WcpProjectPackage } @@ -75,6 +77,8 @@ export const createWcpGraphQL = () => { } return new Response({ + orgId: projectLicense.orgId, + projectId: projectLicense.projectId, package: projectLicense.package }); } catch (e) { diff --git a/packages/app-admin-rmwc/src/modules/Navigation/WebinyVersionListItem.tsx b/packages/app-admin-rmwc/src/modules/Navigation/WebinyVersionListItem.tsx new file mode 100644 index 00000000000..a583c5c3f7b --- /dev/null +++ b/packages/app-admin-rmwc/src/modules/Navigation/WebinyVersionListItem.tsx @@ -0,0 +1,53 @@ +import React, { useMemo } from "react"; +import styled from "@emotion/styled"; +import { useWcp } from "@webiny/app-admin"; +import { ListItem } from "@webiny/ui/List"; +import { subFooter } from "./Styled"; +import { config as appConfig } from "@webiny/app/config"; +import { Typography } from "@webiny/ui/Typography"; +import { Tooltip } from "@webiny/ui/Tooltip"; + +const WcpBadge = styled.div` + background-color: var(--mdc-theme-primary, #6200ee); + display: inline-block; + color: white; + padding: 2px 4px; + border-radius: 5px; + font-size: 12px; + font-weight: bold; + line-height: 14px; + margin-left: 5px; +`; + +export const WebinyVersionListItem = () => { + const wbyVersion = appConfig.getKey("WEBINY_VERSION", process.env.REACT_APP_WEBINY_VERSION); + const wcp = useWcp(); + + const wcpBadge = useMemo(() => { + const wcpProject = wcp.getProject(); + if (!wcpProject) { + return null; + } + + const tooltipContent = ( + + {wcpProject.orgId}/{wcpProject.projectId} + + ); + + return ( + + WCP + + ); + }, []); + + return ( + + + Webiny v{wbyVersion} + {wcpBadge} + + + ); +}; diff --git a/packages/app-admin-rmwc/src/modules/Navigation/index.tsx b/packages/app-admin-rmwc/src/modules/Navigation/index.tsx index 080b0deb7a2..a816078ec70 100644 --- a/packages/app-admin-rmwc/src/modules/Navigation/index.tsx +++ b/packages/app-admin-rmwc/src/modules/Navigation/index.tsx @@ -2,16 +2,16 @@ import React, { Fragment, useCallback, useContext, useMemo, useState } from "rea import styled from "@emotion/styled"; import { Drawer, DrawerContent, DrawerHeader } from "@webiny/ui/Drawer"; import { - Compose, - Provider, - NavigationRenderer as NavigationSpec, - MenuItems, - MenuItemRenderer, Brand as BrandSpec, - useNavigation as useAdminNavigation, + Compose, + HigherOrderComponent, MenuData, + MenuItemRenderer, + MenuItems, MenuItemsProps, - HigherOrderComponent + NavigationRenderer as NavigationSpec, + Provider, + useNavigation as useAdminNavigation } from "@webiny/app-admin"; import Hamburger from "./Hamburger"; import { MenuGroupRenderer } from "./renderers/MenuGroupRenderer"; @@ -19,10 +19,9 @@ import { MenuSectionItemRenderer } from "./renderers/MenuSectionItemRenderer"; import { MenuSectionRenderer } from "./renderers/MenuSectionRenderer"; import { MenuLinkRenderer } from "./renderers/MenuLinkRenderer"; import { MenuElementRenderer } from "./renderers/MenuElementRenderer"; -import { List, ListItem } from "@webiny/ui/List"; -import { MenuFooter, subFooter, MenuHeader, navHeader, navContent } from "./Styled"; -import { config as appConfig } from "@webiny/app/config"; -import { Typography } from "@webiny/ui/Typography"; +import { List } from "@webiny/ui/List"; +import { MenuFooter, MenuHeader, navContent, navHeader } from "./Styled"; +import { WebinyVersionListItem } from "./WebinyVersionListItem"; const AutoWidthDrawer = styled(Drawer)` width: auto; @@ -93,8 +92,6 @@ export const NavigationImpl = () => { [menuItems] ); - const wbyVersion = appConfig.getKey("WEBINY_VERSION", process.env.REACT_APP_WEBINY_VERSION); - return ( @@ -108,9 +105,7 @@ export const NavigationImpl = () => { - - Webiny v{wbyVersion} - + diff --git a/packages/app-admin/src/base/providers/TelemetryProvider.tsx b/packages/app-admin/src/base/providers/TelemetryProvider.tsx index cc55fb0de25..16f2dc194ce 100644 --- a/packages/app-admin/src/base/providers/TelemetryProvider.tsx +++ b/packages/app-admin/src/base/providers/TelemetryProvider.tsx @@ -15,7 +15,8 @@ export const createTelemetryProvider = () => (Component: React.ComponentType) => } eventSent = true; - sendEvent("app-start"); + + sendEvent("admin-app-start"); }, []); return {children}; diff --git a/packages/app-page-builder/src/modules/WebsiteSettings/usePbWebsiteSettings.ts b/packages/app-page-builder/src/modules/WebsiteSettings/usePbWebsiteSettings.ts index 057f54e4ee8..ffb4004bf52 100644 --- a/packages/app-page-builder/src/modules/WebsiteSettings/usePbWebsiteSettings.ts +++ b/packages/app-page-builder/src/modules/WebsiteSettings/usePbWebsiteSettings.ts @@ -3,7 +3,7 @@ import get from "lodash/get"; import set from "lodash/set"; import { useMutation, useQuery } from "@apollo/react-hooks"; import { useSnackbar } from "@webiny/app-admin"; -import { sendEvent, setProperties } from "@webiny/telemetry/react"; +import { sendEvent } from "@webiny/telemetry/react"; import { GET_SETTINGS, GetSettingsQueryResponse, @@ -69,20 +69,11 @@ export function usePbWebsiteSettings() { // TODO: try useForm and onSubmit data.websiteUrl = (data.websiteUrl || "").replace(/\/+$/g, ""); - if (settings.websiteUrl !== data.websiteUrl && !data.websiteUrl.includes("localhost")) { - /** - * sendEvent is async, why is it not awaited? - */ - // TODO @pavel - sendEvent("custom-domain", { - domain: data.websiteUrl - }); - - /** - * setProperties is async, why is it not awaited? - */ - // TODO @pavel - setProperties({ + const logWebsiteUrl = + settings.websiteUrl !== data.websiteUrl && !data.websiteUrl.includes("localhost"); + if (logWebsiteUrl) { + // We don't want to await the result, so that we don't block the UI. + sendEvent("admin-custom-domain", { domain: data.websiteUrl }); } diff --git a/packages/app-wcp/src/WcpProvider.tsx b/packages/app-wcp/src/WcpProvider.tsx index 63dfbf3520d..5c996e94342 100644 --- a/packages/app-wcp/src/WcpProvider.tsx +++ b/packages/app-wcp/src/WcpProvider.tsx @@ -9,6 +9,8 @@ export const GET_WCP_PROJECT = gql` wcp { getProject { data { + orgId + projectId package { features { seats { diff --git a/packages/app-wcp/src/types.ts b/packages/app-wcp/src/types.ts index bb35f3d356e..764085287ff 100644 --- a/packages/app-wcp/src/types.ts +++ b/packages/app-wcp/src/types.ts @@ -29,6 +29,8 @@ export type WcpProjectPackage = { }; export interface WcpProject { + orgId: string; + projectId: string; package: WcpProjectPackage; } diff --git a/packages/cli-plugin-deploy-pulumi/commands/build.js b/packages/cli-plugin-deploy-pulumi/commands/build.js index 1569e9bae58..13a192a5df6 100644 --- a/packages/cli-plugin-deploy-pulumi/commands/build.js +++ b/packages/cli-plugin-deploy-pulumi/commands/build.js @@ -1,4 +1,4 @@ -const buildPackages = require("./deploy/buildPackages"); +const { PackagesBuilder } = require("./buildPackages/PackagesBuilder"); const { createPulumiCommand, runHook } = require("../utils"); module.exports = (params, context) => { @@ -16,7 +16,17 @@ module.exports = (params, context) => { context }); - await buildPackages({ projectApplication, inputs, context }); + console.log(); + + const builder = new PackagesBuilder({ + packages: projectApplication.packages, + inputs, + context + }); + + await builder.build(); + + console.log(); await runHook({ hook: "hook-after-build", diff --git a/packages/cli-plugin-deploy-pulumi/commands/buildPackages/BasePackagesBuilder.js b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/BasePackagesBuilder.js new file mode 100644 index 00000000000..a5ba10deecd --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/BasePackagesBuilder.js @@ -0,0 +1,13 @@ +class BasePackagesBuilder { + constructor({ packages, inputs, context }) { + this.packages = packages; + this.inputs = inputs; + this.context = context; + } + + async build() { + throw new Error("Not implemented."); + } +} + +module.exports = { BasePackagesBuilder }; diff --git a/packages/cli-plugin-deploy-pulumi/commands/buildPackages/MultiplePackagesBuilder.js b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/MultiplePackagesBuilder.js new file mode 100644 index 00000000000..f58e274ce96 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/MultiplePackagesBuilder.js @@ -0,0 +1,111 @@ +const path = require("path"); +const { Worker } = require("worker_threads"); +const Listr = require("listr"); +const { BasePackagesBuilder } = require("./BasePackagesBuilder"); +const { gray } = require("chalk"); +const { measureDuration } = require("../../utils"); + +class MultiplePackagesBuilder extends BasePackagesBuilder { + async build() { + const packages = this.packages; + const context = this.context; + const inputs = this.inputs; + + const getBuildDuration = measureDuration(); + + const { env, variant, debug } = inputs; + + context.info(`Building %s packages...`, packages.length); + + const buildTasks = []; + + for (let i = 0; i < packages.length; i++) { + const pkg = packages[i]; + + buildTasks.push({ + pkg: pkg, + task: new Promise((resolve, reject) => { + const enableLogs = inputs.logs === true; + + const workerData = { + options: { + env, + variant, + debug, + logs: enableLogs + }, + package: { ...pkg.paths } + }; + + const worker = new Worker(path.join(__dirname, "./worker.js"), { + workerData, + stderr: true, + stdout: true + }); + + worker.on("message", threadMessage => { + const { type, stdout, stderr, error } = JSON.parse(threadMessage); + + const result = { + package: pkg, + stdout, + stderr, + error, + duration: getBuildDuration() + }; + + if (type === "error") { + reject(result); + return; + } + + if (type === "success") { + resolve(result); + } + }); + }) + }); + } + + const tasks = new Listr( + buildTasks.map(({ pkg, task }) => { + return { + title: this.getPackageLabel(pkg), + task: () => task + }; + }), + { concurrent: true, exitOnError: false } + ); + + await tasks.run().catch(err => { + console.log(); + context.error(`Failed to build all packages. For more details, check the logs below.`); + console.log(); + + err.errors.forEach(({ package: pkg, error }, i) => { + const number = `${i + 1}.`; + const name = context.error.hl(pkg.name); + const relativePath = gray(`(${pkg.paths.relative})`); + const title = [number, name, relativePath].join(" "); + + console.log(title); + console.log(error.message); + console.log(); + }); + + throw new Error(`Failed to build all packages.`); + }); + + console.log(); + + context.success(`Successfully built ${packages.length} packages in ${getBuildDuration()}.`); + } + + getPackageLabel(pkg) { + const pkgName = pkg.name; + const pkgRelativePath = gray(`(${pkg.paths.relative})`); + return `${pkgName} ${pkgRelativePath}`; + } +} + +module.exports = { MultiplePackagesBuilder }; diff --git a/packages/cli-plugin-deploy-pulumi/commands/buildPackages/PackagesBuilder.js b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/PackagesBuilder.js new file mode 100644 index 00000000000..a351ef02771 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/PackagesBuilder.js @@ -0,0 +1,33 @@ +const { BasePackagesBuilder } = require("./BasePackagesBuilder"); + +class PackagesBuilder extends BasePackagesBuilder { + async build() { + const BuilderClass = this.getBuilderClass(); + + const builder = new BuilderClass({ + packages: this.packages, + inputs: this.inputs, + context: this.context + }); + + await builder.build(); + } + + getBuilderClass() { + const packagesCount = this.packages.length; + if (packagesCount === 0) { + const { ZeroPackagesBuilder } = require("./ZeroPackagesBuilder"); + return ZeroPackagesBuilder; + } + + if (packagesCount === 1) { + const { SinglePackageBuilder } = require("./SinglePackageBuilder"); + return SinglePackageBuilder; + } + + const { MultiplePackagesBuilder } = require("./MultiplePackagesBuilder"); + return MultiplePackagesBuilder; + } +} + +module.exports = { PackagesBuilder }; diff --git a/packages/cli-plugin-deploy-pulumi/commands/buildPackages/SinglePackageBuilder.js b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/SinglePackageBuilder.js new file mode 100644 index 00000000000..bf69ddc819d --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/SinglePackageBuilder.js @@ -0,0 +1,39 @@ +const { BasePackagesBuilder } = require("./BasePackagesBuilder"); +const { gray } = require("chalk"); + +class SinglePackageBuilder extends BasePackagesBuilder { + async build() { + const pkg = this.packages[0]; + const context = this.context; + const inputs = this.inputs; + + const { env, debug } = inputs; + + const pkgName = pkg.name; + const pkgRelativePath = gray(`(${pkg.paths.relative})`); + context.info(`Building %s package...`, `${pkgName} ${pkgRelativePath}`); + + const options = { + env, + debug, + cwd: pkg.paths.root, + + // Not much sense in turning off logs when a single package is being built. + logs: true + }; + + let config = require(pkg.paths.config).default || require(pkg.paths.config); + if (typeof config === "function") { + config = config({ options, context }); + } + + const hasBuildCommand = config.commands && typeof config.commands.build === "function"; + if (!hasBuildCommand) { + throw new Error("Build command not found."); + } + + await config.commands.build(options); + } +} + +module.exports = { SinglePackageBuilder }; diff --git a/packages/cli-plugin-deploy-pulumi/commands/buildPackages/ZeroPackagesBuilder.js b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/ZeroPackagesBuilder.js new file mode 100644 index 00000000000..e509330bcb3 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/ZeroPackagesBuilder.js @@ -0,0 +1,10 @@ +const { BasePackagesBuilder } = require("./BasePackagesBuilder"); + +class ZeroPackagesBuilder extends BasePackagesBuilder { + build() { + // Simply don't do anything. There are no packages to build. + this.context.info(`No packages to build.`); + } +} + +module.exports = { ZeroPackagesBuilder }; diff --git a/packages/cli-plugin-deploy-pulumi/commands/buildPackages/worker.js b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/worker.js new file mode 100644 index 00000000000..80a621c52aa --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/buildPackages/worker.js @@ -0,0 +1,56 @@ +const { parentPort, workerData } = require("worker_threads"); +require("@webiny/cli/utils/importModule"); +const { cli } = require("@webiny/cli"); + +let processStdout = ""; +let processStderr = ""; + +const originalStdoutWrite = process.stdout.write.bind(process.stdout); +process.stdout.write = (chunk, encoding, callback) => { + if (typeof chunk === "string") { + processStdout += chunk; + } + + return originalStdoutWrite(chunk, encoding, callback); +}; + +const originalStderrWrite = process.stderr.write.bind(process.stderr); +process.stderr.write = (chunk, encoding, callback) => { + if (typeof chunk === "string") { + processStderr += chunk; + } + + return originalStderrWrite(chunk, encoding, callback); +}; + +const { options, package: pckg } = workerData; +let config = require(pckg.config).default || require(pckg.config); +if (typeof config === "function") { + config = config({ options: { ...options, cwd: pckg.root }, context: cli }); +} + +const hasBuildCommand = config.commands && typeof config.commands.build === "function"; +if (!hasBuildCommand) { + throw new Error("Build command not found."); +} + +config.commands + .build(options) + .then(() => { + parentPort.postMessage( + JSON.stringify({ type: "success", stdout: processStdout, stderr: processStderr }) + ); + }) + .catch(e => { + parentPort.postMessage( + JSON.stringify({ + type: "error", + stdout: processStdout, + stderr: processStderr, + error: { + message: e.message, + stack: e.stack + } + }) + ); + }); diff --git a/packages/cli-plugin-deploy-pulumi/commands/deploy.js b/packages/cli-plugin-deploy-pulumi/commands/deploy.js index f4dce804cb1..6a4737e15eb 100644 --- a/packages/cli-plugin-deploy-pulumi/commands/deploy.js +++ b/packages/cli-plugin-deploy-pulumi/commands/deploy.js @@ -1,11 +1,17 @@ -const buildPackages = require("./deploy/buildPackages"); -const { createPulumiCommand, runHook, login, notify } = require("../utils"); +const { createPulumiCommand, runHook, notify } = require("../utils"); +const { BeforeDeployPlugin } = require("../plugins/BeforeDeployPlugin"); +const { PackagesBuilder } = require("./buildPackages/PackagesBuilder"); +const pulumiLoginSelectStack = require("./deploy/pulumiLoginSelectStack"); +const executeDeploy = require("./deploy/executeDeploy"); +const executePreview = require("./deploy/executePreview"); module.exports = (params, context) => { const command = createPulumiCommand({ name: "deploy", createProjectApplicationWorkspace: params.build, - command: async ({ inputs, context, projectApplication, pulumi, getDuration }) => { + telemetry: true, + command: async commandParams => { + const { inputs, context, projectApplication, pulumi, getDuration } = commandParams; const { env, folder, build, deploy } = inputs; const hookArgs = { context, env, inputs, projectApplication }; @@ -17,7 +23,17 @@ module.exports = (params, context) => { context }); - await buildPackages({ projectApplication, inputs, context }); + console.log(); + + const builder = new PackagesBuilder({ + packages: projectApplication.packages, + inputs, + context + }); + + await builder.build(); + + console.log(); await runHook({ hook: "hook-after-build", @@ -35,80 +51,20 @@ module.exports = (params, context) => { return; } - await login(projectApplication); - - const PULUMI_SECRETS_PROVIDER = process.env.PULUMI_SECRETS_PROVIDER; - const PULUMI_CONFIG_PASSPHRASE = process.env.PULUMI_CONFIG_PASSPHRASE; - - await pulumi.run({ - command: ["stack", "select", env], - args: { - create: true, - secretsProvider: PULUMI_SECRETS_PROVIDER - }, - execa: { - env: { - PULUMI_CONFIG_PASSPHRASE - } - } - }); - await runHook({ - hook: "hook-before-deploy", + hook: BeforeDeployPlugin.type, args: hookArgs, context }); - console.log(); - const continuing = inputs.preview ? `Previewing deployment...` : `Deploying...`; - context.info(continuing); - console.log(); + await pulumiLoginSelectStack({ inputs, projectApplication, pulumi }); - if (inputs.preview) { - await pulumi.run({ - command: "preview", - args: { - diff: true, - debug: inputs.debug - // Preview command does not accept "--secrets-provider" argument. - // secretsProvider: PULUMI_SECRETS_PROVIDER - }, - execa: { - stdio: "inherit", - env: { - WEBINY_ENV: env, - WEBINY_PROJECT_NAME: context.project.name, - PULUMI_CONFIG_PASSPHRASE - } - } - }); - } else { - await pulumi.run({ - command: "up", - args: { - yes: true, - skipPreview: true, - secretsProvider: PULUMI_SECRETS_PROVIDER, - debug: inputs.debug - }, - execa: { - // We pipe "stderr" so that we can intercept potential received error messages, - // and hopefully, show extra information / help to the user. - stdio: ["inherit", "inherit", "pipe"], - env: { - WEBINY_ENV: env, - WEBINY_PROJECT_NAME: context.project.name, - PULUMI_CONFIG_PASSPHRASE - } - } - }); - } + console.log(); - const duration = getDuration(); if (inputs.preview) { - context.success(`Done! Preview finished in %s.`, duration); + await executePreview(commandParams); } else { - context.success(`Done! Deploy finished in %s.`, duration); + await executeDeploy(commandParams); } console.log(); @@ -119,7 +75,10 @@ module.exports = (params, context) => { context }); - notify({ message: `"${folder}" stack deployed in ${duration}.` }); + await notify({ + message: `"${folder}" stack deployed in ${getDuration()}.`, + timeout: 1 + }); } }); diff --git a/packages/cli-plugin-deploy-pulumi/commands/deploy/buildPackages.js b/packages/cli-plugin-deploy-pulumi/commands/deploy/buildPackages.js deleted file mode 100644 index aff282beff5..00000000000 --- a/packages/cli-plugin-deploy-pulumi/commands/deploy/buildPackages.js +++ /dev/null @@ -1,176 +0,0 @@ -const path = require("path"); -const { Worker } = require("worker_threads"); -const chalk = require("chalk"); - -const parseMessage = message => { - try { - return JSON.parse(message); - } catch (e) { - return { - type: "error", - message: `Could not parse received build result (JSON): ${message}` - }; - } -}; - -module.exports = async ({ projectApplication, inputs, context }) => { - const start = new Date(); - - const { env, variant, debug } = inputs; - let multipleBuilds = false; - switch (projectApplication.packages.length) { - case 0: - context.info(`No packages to build...`); - return; - case 1: - context.info(`Building %s package...`, projectApplication.packages[0].name); - break; - default: - multipleBuilds = true; - context.info(`Building %s packages...`, projectApplication.packages.length); - break; - } - - const log = (packageName, message) => { - let prefix = ""; - if (multipleBuilds) { - prefix = chalk.blueBright(packageName) + ": "; - } - - if (Array.isArray(message)) { - message = message.filter(Boolean); - if (message.length) { - const [first, ...rest] = message; - console.log(prefix + first, ...rest); - } - } else { - console.log(prefix + message); - } - }; - - console.log(); - - const promises = []; - const stats = { success: 0, warning: 0, error: 0 }; - for (let i = 0; i < projectApplication.packages.length; i++) { - const current = projectApplication.packages[i]; - const start = new Date(); - - promises.push( - new Promise(resolve => { - let enableLogs = inputs.logs; - if (typeof enableLogs === "undefined") { - enableLogs = !multipleBuilds; - } - - const workerData = { - options: { - env, - variant, - debug, - logs: enableLogs - }, - package: { ...current.paths } - }; - - const worker = new Worker(path.join(__dirname, "./worker.js"), { workerData }); - worker.on("message", threadMessage => { - const { type, message } = parseMessage(threadMessage); - - if (type === "error") { - stats.error++; - context.error(current.name); - - if (Array.isArray(message)) { - for (const msg of message) { - console.log(msg); - } - } else { - console.log(message); - } - - console.log(); - return resolve({ - package: current, - error: message - }); - } - - if (type === "success") { - if (multipleBuilds) { - stats.success++; - const duration = (new Date() - start) / 1000 + "s"; - context.success(`${current.name} (%s)`, duration); - } - - return resolve({ - package: current, - error: message - }); - } - - log(current.name, message); - }); - - worker.on("error", () => { - stats.error++; - context.error( - `An unknown error occurred while building %s package.`, - current.name - ); - - resolve({ - package: current, - result: { - message: `An unknown error occurred.` - } - }); - }); - - worker.on("exit", code => { - if (code === 0) { - return; - } - - stats.error++; - context.error(`An error occurred while building %s package.`, current.name); - - resolve({ - package: current, - result: { - message: `Process exited with a non-zero exit code.` - } - }); - }); - }) - ); - } - - await Promise.all(promises); - - console.log(); - - if (stats.error > 0) { - const errorsCount = context.error.hl(stats.error); - const errorsWord = stats.error === 1 ? "error" : "errors"; - const errorsOccurred = `(${errorsCount} ${errorsWord} occurred)`; - - throw new Error(`Failed to build all packages ${errorsOccurred}.`); - } - - const duration = (new Date() - start) / 1000 + "s"; - - if (multipleBuilds) { - context.success( - `Successfully built %s packages in %s.`, - projectApplication.packages.length, - duration - ); - } else { - context.success( - `Successfully built %s in %s.`, - projectApplication.packages[0].name, - duration - ); - } -}; diff --git a/packages/cli-plugin-deploy-pulumi/commands/deploy/executeDeploy.js b/packages/cli-plugin-deploy-pulumi/commands/deploy/executeDeploy.js new file mode 100644 index 00000000000..c13b47238b8 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/deploy/executeDeploy.js @@ -0,0 +1,105 @@ +const { measureDuration } = require("../../utils"); +const ora = require("ora"); + +const spinnerMessages = [ + [60, "Still deploying..."], + [120, "Still deploying, please wait..."], + [180, "Some resources take some time to become ready, please wait..."], + + [270, "Still deploying, please don't interrupt..."], + [360, "Still deploying, please be patient..."], + [450, "Still deploying, please don't interrupt..."], + [540, "Still deploying, please be patient..."], + + [600, "Deploying for 10 minutes now, probably a couple more to go..."], + [720, "Still deploying, shouldn't be much longer now..."], + + [840, "Looks like it's taking a bit longer than usual, please wait..."], + [900, "Deploying for 15 minutes now, hopefully it's almost done..."], + + [1200, "Deploying for 20 minutes now, hopefully it's almost done..."] +]; + +module.exports = async ({ inputs, context, pulumi }) => { + // We always show deployment logs when doing previews. + const showDeploymentLogs = inputs.deploymentLogs; + + const PULUMI_SECRETS_PROVIDER = process.env.PULUMI_SECRETS_PROVIDER; + const PULUMI_CONFIG_PASSPHRASE = process.env.PULUMI_CONFIG_PASSPHRASE; + + const getDeploymentDuration = measureDuration(); + + const spinner = ora("Deploying..."); + + try { + const subprocess = pulumi.run({ + command: "up", + args: { + yes: true, + skipPreview: true, + secretsProvider: PULUMI_SECRETS_PROVIDER, + debug: inputs.debug + }, + execa: { + env: { + WEBINY_ENV: inputs.env, + WEBINY_PROJECT_NAME: context.project.name, + PULUMI_CONFIG_PASSPHRASE + } + } + }); + + if (showDeploymentLogs) { + subprocess.stdout.pipe(process.stdout); + subprocess.stderr.pipe(process.stderr); + await subprocess; + } else { + spinner.start(); + + // When showing spinner, we want to show a few messages to the user. + // The deployment process can take in some cases 10-15 minutes, so we want to + // give the user some feedback. + const timeouts = spinnerMessages.map(([seconds, message]) => { + return setTimeout(() => { + spinner.text = message; + }, seconds * 1000); + }); + + // Every second, let's add a dot to the end of the message. Once we reach + // three, we start over. + const interval = setInterval(() => { + const spinnerText = spinner.text; + if (spinnerText.endsWith("...")) { + spinner.text = spinnerText.substring(0, spinnerText.length - 3); + } else { + spinner.text = spinnerText + "."; + } + }, 1000); + + try { + await subprocess; + } finally { + timeouts.forEach(clearTimeout); + clearInterval(interval); + } + } + + const message = `Deployed in ${getDeploymentDuration()}.`; + + if (showDeploymentLogs) { + context.success(message); + } else { + spinner.succeed(message); + } + } catch (e) { + // If the deployment logs were already shown, we don't want to do anything. + if (showDeploymentLogs) { + throw e; + } + + spinner.fail(`Deployment failed. Please check the below logs for more details.`); + console.log(); + console.log(e.stderr || e.stdout || e.message); + throw e; + } +}; diff --git a/packages/cli-plugin-deploy-pulumi/commands/deploy/executePreview.js b/packages/cli-plugin-deploy-pulumi/commands/deploy/executePreview.js new file mode 100644 index 00000000000..c9c4c7eeb57 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/deploy/executePreview.js @@ -0,0 +1,27 @@ +module.exports = async ({ inputs, context, pulumi }) => { + const PULUMI_CONFIG_PASSPHRASE = process.env.PULUMI_CONFIG_PASSPHRASE; + + const subprocess = pulumi.run({ + command: "preview", + args: { + diff: true, + debug: inputs.debug + // Preview command does not accept "--secrets-provider" argument. + // secretsProvider: PULUMI_SECRETS_PROVIDER + }, + execa: { + env: { + WEBINY_ENV: inputs.env, + WEBINY_PROJECT_NAME: context.project.name, + PULUMI_CONFIG_PASSPHRASE + } + } + }); + + subprocess.stdout.pipe(process.stdout); + subprocess.stderr.pipe(process.stderr); + + await subprocess; + + context.success(`Preview successful.`); +}; diff --git a/packages/cli-plugin-deploy-pulumi/commands/deploy/pulumiLoginSelectStack.js b/packages/cli-plugin-deploy-pulumi/commands/deploy/pulumiLoginSelectStack.js new file mode 100644 index 00000000000..0c0b8b5e23f --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/deploy/pulumiLoginSelectStack.js @@ -0,0 +1,23 @@ +const { login } = require("../../utils"); + +module.exports = async ({ inputs, projectApplication, pulumi }) => { + const { env } = inputs; + + await login(projectApplication); + + const PULUMI_SECRETS_PROVIDER = process.env.PULUMI_SECRETS_PROVIDER; + const PULUMI_CONFIG_PASSPHRASE = process.env.PULUMI_CONFIG_PASSPHRASE; + + await pulumi.run({ + command: ["stack", "select", env], + args: { + create: true, + secretsProvider: PULUMI_SECRETS_PROVIDER + }, + execa: { + env: { + PULUMI_CONFIG_PASSPHRASE + } + } + }); +}; diff --git a/packages/cli-plugin-deploy-pulumi/commands/index.js b/packages/cli-plugin-deploy-pulumi/commands/index.js index 5949e5addcf..6e190cdb30c 100644 --- a/packages/cli-plugin-deploy-pulumi/commands/index.js +++ b/packages/cli-plugin-deploy-pulumi/commands/index.js @@ -1,10 +1,3 @@ -const { red } = require("chalk"); -const destroy = require("./destroy"); -const deploy = require("./deploy"); -const build = require("./build"); -const watch = require("./watch"); -const output = require("./output"); - module.exports = [ { type: "cli-command", @@ -56,13 +49,17 @@ module.exports = [ }); yargs.option("logs", { default: undefined, - describe: `Enable base compilation-related logs`, + describe: `Print build logs`, + type: "boolean" + }); + yargs.option("deployment-logs", { + default: undefined, + describe: `Print deployment logs`, type: "boolean" }); }, async argv => { - await deploy(argv, context); - process.exit(0); + return require("./deploy")(argv, context); } ); @@ -96,8 +93,7 @@ module.exports = [ }); }, async argv => { - await build(argv, context); - process.exit(0); + return require("./build")(argv, context); } ); @@ -170,7 +166,9 @@ module.exports = [ type: "boolean" }); }, - async argv => watch(argv, context) + async argv => { + return require("./watch")(argv, context); + } ); yargs.command( @@ -194,6 +192,7 @@ module.exports = [ type: "string" }) .check(args => { + const { red } = require("chalk"); const { folder, confirmDestroyEnv } = args; // If the folder is not defined, we are destroying the whole project. @@ -226,8 +225,7 @@ module.exports = [ }); }, async argv => { - await destroy(argv, context); - process.exit(0); + return require("./destroy")(argv, context); } ); @@ -260,8 +258,7 @@ module.exports = [ }); }, async argv => { - await output(argv, context); - process.exit(0); + return require("./output")(argv, context); } ); @@ -291,8 +288,7 @@ module.exports = [ }); }, async argv => { - await require("./pulumiRun")(argv, context); - process.exit(0); + return require("./pulumiRun")(argv, context); } ); @@ -322,8 +318,7 @@ module.exports = [ }); }, async argv => { - await require("./executeMigrations")(argv, context); - process.exit(0); + return require("./executeMigrations")(argv, context); } ); } diff --git a/packages/cli-plugin-deploy-pulumi/commands/watch.js b/packages/cli-plugin-deploy-pulumi/commands/watch.js index 0e2a59219c3..08e9ec43fca 100644 --- a/packages/cli-plugin-deploy-pulumi/commands/watch.js +++ b/packages/cli-plugin-deploy-pulumi/commands/watch.js @@ -9,9 +9,11 @@ const { getProjectApplication, getProject } = require("@webiny/cli/utils"); const get = require("lodash/get"); const merge = require("lodash/merge"); const simpleOutput = require("./watch/output/simpleOutput"); +const listPackages = require("./watch/listPackages"); const minimatch = require("minimatch"); const glob = require("fast-glob"); const watchPackages = require("./watch/watchPackages"); +const { PackagesWatcher } = require("./watch/watchers/PackagesWatcher"); const { login, getPulumi, @@ -55,21 +57,19 @@ module.exports = async (inputs, context) => { // If exists - read default inputs from "webiny.application.ts" file. inputs = merge({}, get(projectApplication, "config.cli.watch"), inputs); - if (projectApplication.type === "v5-workspaces") { - // We don't do anything here. We assume the workspace has already been created - // upon running the `webiny deploy` command. We rely on that. - // TODO: maybe we can improve this in the future, depending on the feedback. - // await createProjectApplicationWorkspace({ - // projectApplication, - // env: inputs.env, - // context, - // inputs - // }); - - // Check if there are any plugins that need to be registered. - if (projectApplication.config.plugins) { - context.plugins.register(projectApplication.config.plugins); - } + // We don't do anything here. We assume the workspace has already been created + // upon running the `webiny deploy` command. We rely on that. + // TODO: maybe we can improve this in the future, depending on the feedback. + // await createProjectApplicationWorkspace({ + // projectApplication, + // env: inputs.env, + // context, + // inputs + // }); + + // Check if there are any plugins that need to be registered. + if (projectApplication.config.plugins) { + context.plugins.register(projectApplication.config.plugins); } // Load env vars specified via .env files located in project application folder. @@ -109,6 +109,17 @@ module.exports = async (inputs, context) => { context }); + console.log(); + + // TODO: separate the rest of the code below into separate "watcher" classes. + // TODO: This was done just because of the time constraints. + if (!inputs.deploy) { + const packages = await listPackages({ inputs }); + const packagesWatcher = new PackagesWatcher({ packages, context, inputs }); + await packagesWatcher.watch(); + return; + } + // 1.1. Check if the project application and Pulumi stack exist. let PULUMI_SECRETS_PROVIDER = process.env.PULUMI_SECRETS_PROVIDER; let PULUMI_CONFIG_PASSPHRASE = process.env.PULUMI_CONFIG_PASSPHRASE; @@ -267,17 +278,9 @@ module.exports = async (inputs, context) => { message: chalk.green("Watching cloud infrastructure resources...") }); - let buildFoldersGlob = [projectApplication.paths.workspace, "**/build/*.js"].join("/"); - - // For non-workspaces projects, we still want to be watching `**/build/*.js` files located - // in user's project (for example `api/graphql/code/build/handler.js`). - if (projectApplication.type !== "v5-workspaces") { - buildFoldersGlob = [ - projectApplication.paths.absolute, - inputs.folder, - "**/build/*.js" - ].join("/"); - } + const buildFoldersGlob = [projectApplication.paths.workspace, "**/build/*.js"].join( + "/" + ); const buildFolders = glob.sync(buildFoldersGlob, { onlyFiles: false }); diff --git a/packages/cli-plugin-deploy-pulumi/commands/watch/listPackages.js b/packages/cli-plugin-deploy-pulumi/commands/watch/listPackages.js new file mode 100644 index 00000000000..cda9e48c138 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/watch/listPackages.js @@ -0,0 +1,62 @@ +const execa = require("execa"); +const fs = require("fs"); +const path = require("path"); + +const listPackages = async ({ inputs }) => { + let packagesList = []; + if (inputs.package) { + packagesList = Array.isArray(inputs.package) ? inputs.package : [inputs.package]; + } else { + packagesList = await execa("yarn", [ + "webiny", + "workspaces", + "tree", + "--json", + "--depth", + inputs.depth, + "--distinct", + "--folder", + inputs.folder + ]).then(({ stdout }) => JSON.parse(stdout)); + } + + const commandArgs = [ + "webiny", + "workspaces", + "list", + "--json", + "--withPath", + ...packagesList.reduce((current, item) => { + current.push("--scope", item); + return current; + }, []) + ]; + + if (inputs.env) { + commandArgs.push("--env", inputs.env); + } + + return execa("yarn", commandArgs).then(({ stdout }) => { + const result = JSON.parse(stdout); + const packages = []; + for (const packageName in result) { + const root = result[packageName]; + const configPath = fs.existsSync(path.join(root, "webiny.config.ts")) + ? path.join(root, "webiny.config.ts") + : path.join(root, "webiny.config.js"); + + packages.push({ + name: packageName, + config: require(configPath).default || require(configPath), + paths: { + root, + config: configPath + } + }); + } + + return packages; + }); +}; + +module.exports = listPackages; diff --git a/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/BasePackagesWatcher.js b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/BasePackagesWatcher.js new file mode 100644 index 00000000000..5f0fc8e000b --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/BasePackagesWatcher.js @@ -0,0 +1,13 @@ +class BasePackagesWatcher { + constructor({ packages, inputs, context }) { + this.packages = packages; + this.inputs = inputs; + this.context = context; + } + + async watch() { + throw new Error("Not implemented."); + } +} + +module.exports = { BasePackagesWatcher }; diff --git a/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsMultiplePackagesWatcher.js b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsMultiplePackagesWatcher.js new file mode 100644 index 00000000000..83a53d1ab8d --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsMultiplePackagesWatcher.js @@ -0,0 +1,118 @@ +const path = require("path"); +const { Worker } = require("worker_threads"); +const { BasePackagesWatcher } = require("../BasePackagesWatcher"); +const chalk = require("chalk"); +const { getRandomColorForString } = require("../../../../utils"); + +class NoDeploymentsMultiplePackagesWatcher extends BasePackagesWatcher { + async watch() { + const packages = this.packages; + const context = this.context; + const inputs = this.inputs; + + const { env, debug } = inputs; + + context.info(`Watching %s packages...`, packages.length); + + if (inputs.debug) { + context.debug("The following packages will be watched for changes:"); + packages.forEach(item => console.log("‣ " + item.name)); + } + + const commandOptions = { env, debug, logs: true }; + const log = createLog({ context }); + + const promises = []; + for (let i = 0; i < packages.length; i++) { + const current = packages[i]; + promises.push( + new Promise(resolve => { + const worker = new Worker(path.join(__dirname, "./worker.js"), { + workerData: { + options: commandOptions, + package: { ...current.paths } + } + }); + + worker.on("message", threadMessage => { + const { type, message } = parseMessage(threadMessage); + + if (type === "error") { + log(current.name, message, "error"); + } else if (type === "warn") { + log(current.name, message); + } else { + log(current.name, message); + } + }); + + worker.on("error", e => { + log( + current.name, + `An unknown error occurred while watching ${context.error.hl( + current.name + )}:` + ); + + log(e); + + resolve({ + package: current, + result: { + message: `An unknown error occurred.` + } + }); + }); + }) + ); + } + + await Promise.all(promises); + } +} + +const createLog = ({ context }) => { + return (packageName, message, type) => { + const prefix = chalk.hex(getRandomColorForString(packageName))(packageName) + ": "; + + let send = ""; + if (Array.isArray(message)) { + message = message.filter(Boolean); + if (message.length) { + const [first, ...rest] = message; + send = [prefix + first, ...rest].join(" "); + } + } else { + send = prefix + message; + } + + if (type) { + if (type === "error") { + send = context.error.hl(send); + } + if (type === "warn") { + send = context.warning.hl(send); + } + } + + send = send.trim().replace(/^\s+|\s+$/g, ""); + if (!send) { + return; + } + + console.log(send); + }; +}; + +const parseMessage = message => { + try { + return JSON.parse(message); + } catch (e) { + return { + type: "error", + message: `Could not parse received watch result (JSON): ${message}` + }; + } +}; + +module.exports = { NoDeploymentsMultiplePackagesWatcher }; diff --git a/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsPackagesWatcher.js b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsPackagesWatcher.js new file mode 100644 index 00000000000..aa8294338da --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsPackagesWatcher.js @@ -0,0 +1,37 @@ +const { BasePackagesWatcher } = require("./../BasePackagesWatcher"); + +class NoDeploymentsPackagesWatcher extends BasePackagesWatcher { + async watch() { + const WatcherClass = this.getWatcherClass(); + + const watcher = new WatcherClass({ + packages: this.packages, + inputs: this.inputs, + context: this.context + }); + + await watcher.watch(); + } + + getWatcherClass() { + const packagesCount = this.packages.length; + if (packagesCount === 0) { + const { ZeroPackagesWatcher } = require("./NoDeploymentsZeroPackagesWatcher"); + return ZeroPackagesWatcher; + } + + if (packagesCount === 1) { + const { + NoDeploymentsSinglePackageWatcher + } = require("./NoDeploymentsSinglePackageWatcher"); + return NoDeploymentsSinglePackageWatcher; + } + + const { + NoDeploymentsMultiplePackagesWatcher + } = require("./NoDeploymentsMultiplePackagesWatcher"); + return NoDeploymentsMultiplePackagesWatcher; + } +} + +module.exports = { NoDeploymentsPackagesWatcher }; diff --git a/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsSinglePackageWatcher.js b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsSinglePackageWatcher.js new file mode 100644 index 00000000000..2d97db09562 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsSinglePackageWatcher.js @@ -0,0 +1,34 @@ +const { BasePackagesWatcher } = require("./../BasePackagesWatcher"); + +class NoDeploymentsSinglePackageWatcher extends BasePackagesWatcher { + async watch() { + const pkg = this.packages[0]; + const context = this.context; + const inputs = this.inputs; + + const { env, debug } = inputs; + + const options = { + env, + debug, + cwd: pkg.paths.root, + + // Not much sense in turning off logs when a single package is being built. + logs: true + }; + + let config = require(pkg.paths.config).default || require(pkg.paths.config); + if (typeof config === "function") { + config = config({ options, context }); + } + + const hasWatchCommand = config.commands && typeof config.commands.watch === "function"; + if (!hasWatchCommand) { + throw new Error("Watch command not found."); + } + + await config.commands.watch(options); + } +} + +module.exports = { NoDeploymentsSinglePackageWatcher }; diff --git a/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsZeroPackagesWatcher.js b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsZeroPackagesWatcher.js new file mode 100644 index 00000000000..ae3e73ceb8a --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/NoDeploymentsZeroPackagesWatcher.js @@ -0,0 +1,10 @@ +const { BasePackagesWatcher } = require("./../BasePackagesWatcher"); + +class NoDeploymentsZeroPackagesWatcher extends BasePackagesWatcher { + watch() { + // Simply don't do anything. There are no packages to watch. + return; + } +} + +module.exports = { NoDeploymentsZeroPackagesWatcher }; diff --git a/packages/cli-plugin-deploy-pulumi/commands/deploy/worker.js b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/worker.js similarity index 70% rename from packages/cli-plugin-deploy-pulumi/commands/deploy/worker.js rename to packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/worker.js index 30071039bb5..27d2952775b 100644 --- a/packages/cli-plugin-deploy-pulumi/commands/deploy/worker.js +++ b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/NoDeploymentsPackagesWatcher/worker.js @@ -26,19 +26,25 @@ for (let i = 0; i < types.length; i++) { (async () => { try { const { options, package: pckg } = workerData; - let config = require(pckg.config).default || require(pckg.config); + let config = require(pckg.config); + if (config.default) { + config = config.default; + } + if (typeof config === "function") { config = config({ options: { ...options, cwd: pckg.root }, context: cli }); } - const hasBuildCommand = config.commands && typeof config.commands.build === "function"; - if (!hasBuildCommand) { - throw new Error("Build command not found."); + if (typeof config.commands.watch !== "function") { + console.log( + `Skipping watch; ${cli.warning.hl( + "watch" + )} command is missing. Check package's ${cli.warning.hl("webiny.config.ts")} file.` + ); + return; } - await config.commands.build(options); - parentPort.postMessage(JSON.stringify({ type: "success" })); - process.exit(0); + await config.commands.watch(options, cli); } catch (e) { console.log(e.stack); console.error(e); diff --git a/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/PackagesWatcher.js b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/PackagesWatcher.js new file mode 100644 index 00000000000..9115658c529 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/commands/watch/watchers/PackagesWatcher.js @@ -0,0 +1,28 @@ +const { BasePackagesWatcher } = require("./BasePackagesWatcher"); + +class PackagesWatcher extends BasePackagesWatcher { + async watch() { + const WatcherClass = this.getWatcherClass(); + + const watcher = new WatcherClass({ + packages: this.packages, + inputs: this.inputs, + context: this.context + }); + + await watcher.watch(); + } + + getWatcherClass() { + if (!this.inputs.deploy) { + const { + NoDeploymentsPackagesWatcher + } = require("./NoDeploymentsPackagesWatcher/NoDeploymentsPackagesWatcher"); + return NoDeploymentsPackagesWatcher; + } + + throw new Error("Not implemented."); + } +} + +module.exports = { PackagesWatcher }; diff --git a/packages/cli-plugin-deploy-pulumi/index.js b/packages/cli-plugin-deploy-pulumi/index.js index 443cb2d7214..00c948ddf9b 100644 --- a/packages/cli-plugin-deploy-pulumi/index.js +++ b/packages/cli-plugin-deploy-pulumi/index.js @@ -1 +1 @@ -module.exports = () => [require("./commands"), require("./plugins")]; +module.exports = () => [require("./commands")]; diff --git a/packages/cli-plugin-deploy-pulumi/package.json b/packages/cli-plugin-deploy-pulumi/package.json index 07d4628bb68..ffa3b0e09cf 100644 --- a/packages/cli-plugin-deploy-pulumi/package.json +++ b/packages/cli-plugin-deploy-pulumi/package.json @@ -13,14 +13,17 @@ "@webiny/aws-sdk": "0.0.0", "@webiny/cli": "0.0.0", "@webiny/data-migration": "0.0.0", + "@webiny/plugins": "0.0.0", "@webiny/pulumi-sdk": "0.0.0", "body-parser": "1.20.1", "chalk": "4.1.2", "execa": "5.1.1", "express": "4.18.2", "fast-glob": "^3.2.7", + "humanize-duration": "^3.31.0", + "listr": "^0.14.3", "localtunnel": "2.0.2", - "lodash": "4.17.21", + "lodash": "^4.17.21", "log-update": "^4.0.0", "mime": "2.6.0", "minimatch": "^5.1.0", diff --git a/packages/cli-plugin-deploy-pulumi/plugins/AfterBuildPlugin.d.ts b/packages/cli-plugin-deploy-pulumi/plugins/AfterBuildPlugin.d.ts new file mode 100644 index 00000000000..afb7c53916e --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/AfterBuildPlugin.d.ts @@ -0,0 +1,5 @@ +import { PulumiCommandLifecycleEventHookPlugin } from "./PulumiCommandLifecycleEventHookPlugin"; + +export class AfterBuildPlugin extends PulumiCommandLifecycleEventHookPlugin { + public static override readonly type: "hook-after-build"; +} diff --git a/packages/cli-plugin-deploy-pulumi/plugins/AfterBuildPlugin.js b/packages/cli-plugin-deploy-pulumi/plugins/AfterBuildPlugin.js new file mode 100644 index 00000000000..1ee85cc4bee --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/AfterBuildPlugin.js @@ -0,0 +1,9 @@ +const { + PulumiCommandLifecycleEventHookPlugin +} = require("./PulumiCommandLifecycleEventHookPlugin"); + +class AfterBuildPlugin extends PulumiCommandLifecycleEventHookPlugin { + static type = "hook-after-build"; +} + +module.exports = { AfterBuildPlugin }; diff --git a/packages/cli-plugin-deploy-pulumi/plugins/AfterDeployPlugin.d.ts b/packages/cli-plugin-deploy-pulumi/plugins/AfterDeployPlugin.d.ts new file mode 100644 index 00000000000..0c880b28ee5 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/AfterDeployPlugin.d.ts @@ -0,0 +1,5 @@ +import { PulumiCommandLifecycleEventHookPlugin } from "./PulumiCommandLifecycleEventHookPlugin"; + +export class AfterDeployPlugin extends PulumiCommandLifecycleEventHookPlugin { + public static override readonly type: "hook-after-deploy"; +} diff --git a/packages/cli-plugin-deploy-pulumi/plugins/AfterDeployPlugin.js b/packages/cli-plugin-deploy-pulumi/plugins/AfterDeployPlugin.js new file mode 100644 index 00000000000..b1cca2e748d --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/AfterDeployPlugin.js @@ -0,0 +1,9 @@ +const { + PulumiCommandLifecycleEventHookPlugin +} = require("./PulumiCommandLifecycleEventHookPlugin"); + +class AfterDeployPlugin extends PulumiCommandLifecycleEventHookPlugin { + static type = "hook-after-deploy"; +} + +module.exports = { AfterDeployPlugin }; diff --git a/packages/cli-plugin-deploy-pulumi/plugins/BeforeBuildPlugin.d.ts b/packages/cli-plugin-deploy-pulumi/plugins/BeforeBuildPlugin.d.ts new file mode 100644 index 00000000000..788a27a729e --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/BeforeBuildPlugin.d.ts @@ -0,0 +1,5 @@ +import { PulumiCommandLifecycleEventHookPlugin } from "./PulumiCommandLifecycleEventHookPlugin"; + +export class BeforeBuildPlugin extends PulumiCommandLifecycleEventHookPlugin { + public static override readonly type: "hook-before-build"; +} diff --git a/packages/cli-plugin-deploy-pulumi/plugins/BeforeBuildPlugin.js b/packages/cli-plugin-deploy-pulumi/plugins/BeforeBuildPlugin.js new file mode 100644 index 00000000000..67898e48323 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/BeforeBuildPlugin.js @@ -0,0 +1,9 @@ +const { + PulumiCommandLifecycleEventHookPlugin +} = require("./PulumiCommandLifecycleEventHookPlugin"); + +class BeforeBuildPlugin extends PulumiCommandLifecycleEventHookPlugin { + static type = "hook-before-build"; +} + +module.exports = { BeforeBuildPlugin }; diff --git a/packages/cli-plugin-deploy-pulumi/plugins/BeforeDeployPlugin.d.ts b/packages/cli-plugin-deploy-pulumi/plugins/BeforeDeployPlugin.d.ts new file mode 100644 index 00000000000..70fcb5cf956 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/BeforeDeployPlugin.d.ts @@ -0,0 +1,5 @@ +import { PulumiCommandLifecycleEventHookPlugin } from "./PulumiCommandLifecycleEventHookPlugin"; + +export class BeforeDeployPlugin extends PulumiCommandLifecycleEventHookPlugin { + public static override readonly type: "hook-before-deploy"; +} diff --git a/packages/cli-plugin-deploy-pulumi/plugins/BeforeDeployPlugin.js b/packages/cli-plugin-deploy-pulumi/plugins/BeforeDeployPlugin.js new file mode 100644 index 00000000000..f77b9f2eea9 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/BeforeDeployPlugin.js @@ -0,0 +1,9 @@ +const { + PulumiCommandLifecycleEventHookPlugin +} = require("./PulumiCommandLifecycleEventHookPlugin"); + +class BeforeDeployPlugin extends PulumiCommandLifecycleEventHookPlugin { + static type = "hook-before-deploy"; +} + +module.exports = { BeforeDeployPlugin }; diff --git a/packages/cli-plugin-deploy-pulumi/plugins/PulumiCommandLifecycleEventHookPlugin.d.ts b/packages/cli-plugin-deploy-pulumi/plugins/PulumiCommandLifecycleEventHookPlugin.d.ts new file mode 100644 index 00000000000..8f7c7517135 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/PulumiCommandLifecycleEventHookPlugin.d.ts @@ -0,0 +1,21 @@ +import { Plugin } from "@webiny/plugins"; +import { CliContext, ProjectApplication } from "@webiny/cli/types"; + +export interface CallableParams { + inputs: Record; + env: string; + projectApplication: ProjectApplication; +} + +export interface Callable { + (params: CallableParams, context: CliContext): void | Promise; +} + +export class PulumiCommandLifecycleEventHookPlugin extends Plugin { + public static override readonly type: string; + private readonly _callable: Callable; + + constructor(callable: Callable); + + public hook(params: CallableParams, context: CliContext): void | Promise; +} diff --git a/packages/cli-plugin-deploy-pulumi/plugins/PulumiCommandLifecycleEventHookPlugin.js b/packages/cli-plugin-deploy-pulumi/plugins/PulumiCommandLifecycleEventHookPlugin.js new file mode 100644 index 00000000000..7cf07d15294 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/PulumiCommandLifecycleEventHookPlugin.js @@ -0,0 +1,23 @@ +const { Plugin } = require("@webiny/plugins"); + +class PulumiCommandLifecycleEventHookPlugin extends Plugin { + constructor(callable) { + super(); + this._callable = callable; + } + + async hook(params, context) { + if (typeof this._callable !== "function") { + throw Error( + [ + `Missing callable in PulumiCommandLifecycleEventHookPlugin! Either pass a callable`, + `to plugin constructor or extend the plugin and override the "hook" method.` + ].join(" ") + ); + } + + return this._callable(params, context); + } +} + +module.exports = { PulumiCommandLifecycleEventHookPlugin }; diff --git a/packages/cli-plugin-deploy-pulumi/plugins/index.d.ts b/packages/cli-plugin-deploy-pulumi/plugins/index.d.ts new file mode 100644 index 00000000000..d192b816b3b --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/plugins/index.d.ts @@ -0,0 +1,4 @@ +export * from "./AfterBuildPlugin"; +export * from "./AfterDeployPlugin"; +export * from "./BeforeBuildPlugin"; +export * from "./BeforeDeployPlugin"; diff --git a/packages/cli-plugin-deploy-pulumi/plugins/index.js b/packages/cli-plugin-deploy-pulumi/plugins/index.js index c16f23c9238..750b01ffb51 100644 --- a/packages/cli-plugin-deploy-pulumi/plugins/index.js +++ b/packages/cli-plugin-deploy-pulumi/plugins/index.js @@ -1 +1,6 @@ -module.exports = [require("./pendingOperationsInfo")]; +module.exports = { + ...require("./AfterBuildPlugin"), + ...require("./AfterDeployPlugin"), + ...require("./BeforeBuildPlugin"), + ...require("./BeforeDeployPlugin") +}; diff --git a/packages/cli-plugin-deploy-pulumi/plugins/pendingOperationsInfo.js b/packages/cli-plugin-deploy-pulumi/plugins/pendingOperationsInfo.js deleted file mode 100644 index 27fb6fe4bb2..00000000000 --- a/packages/cli-plugin-deploy-pulumi/plugins/pendingOperationsInfo.js +++ /dev/null @@ -1,22 +0,0 @@ -const { blue } = require("chalk"); -const MATCH_STRING = 'remove that operation from the "pending_operations" section of the file'; - -module.exports = { - type: "cli-command-error", - handle: ({ context, error }) => { - const { message } = error; - const hasError = typeof message === "string" && message.includes(MATCH_STRING); - if (!hasError) { - return; - } - - context.info( - [ - `The ${blue( - "pending operations" - )} Pulumi error you've just experienced can occur if one of the previous deployments has been interrupted, or another deployment is already in progress.`, - "To learn more, please visit https://docs.webiny.com/docs/how-to-guides/deployment/deploy-your-project#the-current-deployment-has-x-resources-with-pending-operations." - ].join(" ") - ); - } -}; diff --git a/packages/cli-plugin-deploy-pulumi/utils/GracefulError.d.ts b/packages/cli-plugin-deploy-pulumi/utils/GracefulError.d.ts new file mode 100644 index 00000000000..902a002eefd --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/utils/GracefulError.d.ts @@ -0,0 +1 @@ +export class GracefulError extends Error {} diff --git a/packages/cli-plugin-deploy-pulumi/utils/GracefulError.js b/packages/cli-plugin-deploy-pulumi/utils/GracefulError.js new file mode 100644 index 00000000000..9c9250e7aba --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/utils/GracefulError.js @@ -0,0 +1,3 @@ +class GracefulError extends Error {} + +module.exports = { GracefulError }; diff --git a/packages/cli-plugin-deploy-pulumi/utils/GracefulPulumiError.d.ts b/packages/cli-plugin-deploy-pulumi/utils/GracefulPulumiError.d.ts new file mode 100644 index 00000000000..23133988029 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/utils/GracefulPulumiError.d.ts @@ -0,0 +1,3 @@ +export class GracefulPulumiError extends Error { + static from(e: Error, context: Record): GracefulPulumiError | undefined; +} diff --git a/packages/cli-plugin-deploy-pulumi/utils/GracefulPulumiError.js b/packages/cli-plugin-deploy-pulumi/utils/GracefulPulumiError.js new file mode 100644 index 00000000000..6a867900bb5 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/utils/GracefulPulumiError.js @@ -0,0 +1,31 @@ +const { GracefulError } = require("./GracefulError"); +const gracefulPulumiErrorHandlers = require("./gracefulPulumiErrorHandlers"); + +class GracefulPulumiError extends GracefulError { + static from(e, context) { + if (e instanceof GracefulError) { + return e; + } + + for (const handler of gracefulPulumiErrorHandlers) { + const result = handler({ error: e, context }); + if (!result) { + continue; + } + + let errorMessage = result; + if (typeof result === "object") { + const { message, learnMore } = result; + + errorMessage = message; + if (learnMore) { + errorMessage += ` Learn more: ${learnMore}.`; + } + } + + return new GracefulPulumiError(errorMessage, { cause: e }); + } + } +} + +module.exports = { GracefulPulumiError }; diff --git a/packages/cli-plugin-deploy-pulumi/utils/createPulumiCommand.js b/packages/cli-plugin-deploy-pulumi/utils/createPulumiCommand.js index 4e1cc097c8e..598c46bb50f 100644 --- a/packages/cli-plugin-deploy-pulumi/utils/createPulumiCommand.js +++ b/packages/cli-plugin-deploy-pulumi/utils/createPulumiCommand.js @@ -1,77 +1,90 @@ const path = require("path"); -const { getProjectApplication, getProject } = require("@webiny/cli/utils"); +const { getProjectApplication, getProject, sendEvent } = require("@webiny/cli/utils"); const createProjectApplicationWorkspace = require("./createProjectApplicationWorkspace"); const login = require("./login"); const loadEnvVariables = require("./loadEnvVariables"); const getPulumi = require("./getPulumi"); +const measureDuration = require("./measureDuration"); +const { GracefulPulumiError } = require("./GracefulPulumiError"); const createPulumiCommand = ({ name, command, - createProjectApplicationWorkspace: createProjectApplicationWorkspaceParam + createProjectApplicationWorkspace: createProjectApplicationWorkspaceParam, + telemetry }) => { - return async (inputs, context) => { + return async (params, context) => { // If folder not specified, that means we want to deploy the whole project (all project applications). // For that, we look if there are registered plugins that perform that. - if (!inputs.folder) { + if (!params.folder) { const plugin = context.plugins.byName(`cli-command-deployment-${name}-all`); if (!plugin) { - throw new Error( + throw new GracefulPulumiError( `Cannot continue - "cli-command-deployment-${name}-all" plugin not found.` ); } - return plugin[name](inputs, context); - } else { - // Before proceeding, let's detect if multiple project applications were passed. - const folders = inputs.folder.split(",").map(current => current.trim()); - if (folders.length > 1) { - for (let i = 0; i < folders.length; i++) { - const folder = folders[i]; - await createPulumiCommand({ name, command, createProjectApplicationWorkspace })( - { - ...inputs, - folder - }, - context - ); - } + return plugin[name](params, context); + } - return; + // Before proceeding, let's detect if multiple project applications were passed. + const folders = params.folder.split(",").map(current => current.trim()); + if (folders.length > 1) { + for (let i = 0; i < folders.length; i++) { + const folder = folders[i]; + await createPulumiCommand({ name, command, createProjectApplicationWorkspace })( + { + ...params, + folder + }, + context + ); } - // Detect if an app alias was provided. - const project = getProject(); - if (project.config.appAliases) { - const appAliases = project.config.appAliases; - if (appAliases[inputs.folder]) { - inputs.folder = appAliases[inputs.folder]; - } - } + return; } - if (!inputs.env) { - throw new Error(`Please specify environment, for example "dev".`); + // Detect if an app alias was provided. + const project = getProject(); + if (project.config.appAliases) { + const appAliases = project.config.appAliases; + if (appAliases[params.folder]) { + params.folder = appAliases[params.folder]; + } } - const start = new Date(); - const getDuration = () => { - return (new Date() - start) / 1000 + "s"; + const sendTelemetryEvents = telemetry === true && params.telemetry !== false; + const getTelemetryEventName = stage => `pulumi-command-${name}-${stage}`; + const telemetryProperties = { + env: params.env || "unknown", + commandParams: JSON.stringify(params) }; - const cwd = path.join(process.cwd(), inputs.folder); + let projectApplication = null; + + try { + if (sendTelemetryEvents) { + const eventName = getTelemetryEventName("start"); + await sendEvent(eventName, telemetryProperties); + } + + if (!params.env) { + throw new GracefulPulumiError(`Please specify environment, for example "dev".`); + } + + const getDuration = measureDuration(); + + const cwd = path.join(process.cwd(), params.folder); - // Get project application metadata. - const projectApplication = getProjectApplication({ cwd }); + // Get project application metadata. + projectApplication = getProjectApplication({ cwd }); - if (projectApplication.type === "v5-workspaces") { - // If needed, let's create a project application workspace. if (createProjectApplicationWorkspaceParam !== false) { await createProjectApplicationWorkspace({ projectApplication, context, - inputs, - env: inputs.env + inputs: params, + env: params.env }); } @@ -80,16 +93,64 @@ const createPulumiCommand = ({ if (projectApplication.config.plugins) { context.plugins.register(projectApplication.config.plugins); } - } - // Load env vars specified via .env files located in project application folder. - await loadEnvVariables(inputs, context); + // Load env vars specified via .env files located in project application folder. + await loadEnvVariables(params, context); + + await login(projectApplication); + + const pulumi = await getPulumi({ projectApplication }); - await login(projectApplication); + const result = await command({ + inputs: params, + context, + projectApplication, + pulumi, + getDuration + }); - const pulumi = await getPulumi({ projectApplication }); + if (sendTelemetryEvents) { + const eventName = getTelemetryEventName("end"); + await sendEvent(eventName, telemetryProperties); + } - return command({ inputs, context, projectApplication, pulumi, getDuration }); + return result; + } catch (e) { + const gracefulError = GracefulPulumiError.from(e, { + projectApplication, + commandName: command, + commandParams: params + }); + if (gracefulError) { + if (sendTelemetryEvents) { + const eventName = getTelemetryEventName("error-graceful"); + await sendEvent(eventName, { + ...telemetryProperties, + errorMessage: e.message, + errorStack: e.stack + }); + } + throw gracefulError; + } + + if (sendTelemetryEvents) { + const eventName = getTelemetryEventName("error"); + await sendEvent(eventName, { + ...telemetryProperties, + errorMessage: e.message, + errorStack: e.stack + }); + } + + const debugFlag = context.error.hl(`--debug`); + throw new Error( + [ + `Command failed with an unexpected error. Please check the above logs. Alternatively,`, + `try running the same command with the ${debugFlag} flag to get more detailed information.` + ].join(" "), + { cause: e } + ); + } }; }; diff --git a/packages/cli-plugin-deploy-pulumi/utils/getPulumi.js b/packages/cli-plugin-deploy-pulumi/utils/getPulumi.js index 9b91995f26c..731768a565a 100644 --- a/packages/cli-plugin-deploy-pulumi/utils/getPulumi.js +++ b/packages/cli-plugin-deploy-pulumi/utils/getPulumi.js @@ -1,12 +1,12 @@ -const { green, red } = require("chalk"); -const { Pulumi } = require("@webiny/pulumi-sdk"); -const ora = require("ora"); -const merge = require("lodash/merge"); -const { getProject } = require("@webiny/cli/utils"); -const path = require("path"); -const fs = require("fs"); - module.exports = async ({ projectApplication, pulumi, install }) => { + const { green, red } = require("chalk"); + const { Pulumi } = require("@webiny/pulumi-sdk"); + const ora = require("ora"); + const merge = require("lodash/merge"); + const { getProject } = require("@webiny/cli/utils"); + const path = require("path"); + const fs = require("fs"); + const spinner = new ora(); let cwd; @@ -14,19 +14,16 @@ module.exports = async ({ projectApplication, pulumi, install }) => { // When running the `webiny deploy` command without specifying the // project application, the `projectApplication` variable is empty. if (projectApplication) { - cwd = projectApplication.paths.absolute; - if (projectApplication.type === "v5-workspaces") { - cwd = projectApplication.paths.workspace; - if (!fs.existsSync(cwd)) { - const cmd = `yarn webiny build ${projectApplication.paths.relative} --env {environment}`; - const message = [ - "The command cannot be run because the project application hasn't been built. ", - "To build it, run ", - red(cmd), - "." - ].join(""); - throw new Error(message); - } + cwd = projectApplication.paths.workspace; + if (!fs.existsSync(cwd)) { + const cmd = `yarn webiny build ${projectApplication.paths.relative} --env {environment}`; + const message = [ + "The command cannot be run because the project application hasn't been built. ", + "To build it, run ", + red(cmd), + "." + ].join(""); + throw new Error(message); } } diff --git a/packages/cli-plugin-deploy-pulumi/utils/getStackOutput.js b/packages/cli-plugin-deploy-pulumi/utils/getStackOutput.js index 9b14e2f1ea9..3baa6feca44 100644 --- a/packages/cli-plugin-deploy-pulumi/utils/getStackOutput.js +++ b/packages/cli-plugin-deploy-pulumi/utils/getStackOutput.js @@ -1,10 +1,9 @@ -const execa = require("execa"); -const mapStackOutput = require("./mapStackOutput"); -const { getProject } = require("@webiny/cli/utils"); - const cache = {}; + const getOutputJson = ({ folder, env, cwd, variant }) => { + const { getProject } = require("@webiny/cli/utils"); const project = getProject(); + const execa = require("execa"); if (cache[folder + env]) { return cache[folder + env]; @@ -46,7 +45,7 @@ module.exports = (folderOrArgs, env, map) => { } if (!args.folder) { - throw new Error(`Please specify a project application folder, for example "apps/admin".`); + throw new Error(`Please specify a project application folder, for example "admin".`); } if (!args.env) { @@ -62,5 +61,6 @@ module.exports = (folderOrArgs, env, map) => { return output; } + const mapStackOutput = require("./mapStackOutput"); return mapStackOutput(output, args.map); }; diff --git a/packages/cli-plugin-deploy-pulumi/utils/gracefulPulumiErrorHandlers/index.js b/packages/cli-plugin-deploy-pulumi/utils/gracefulPulumiErrorHandlers/index.js new file mode 100644 index 00000000000..9d8c0c559b6 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/utils/gracefulPulumiErrorHandlers/index.js @@ -0,0 +1,4 @@ +const missingFilesInBuild = require("./missingFilesInBuild"); +const pendingOperationsInfo = require("./pendingOperationsInfo"); + +module.exports = [missingFilesInBuild, pendingOperationsInfo]; diff --git a/packages/cli-plugin-deploy-pulumi/utils/gracefulPulumiErrorHandlers/missingFilesInBuild.js b/packages/cli-plugin-deploy-pulumi/utils/gracefulPulumiErrorHandlers/missingFilesInBuild.js new file mode 100644 index 00000000000..9ae7edceede --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/utils/gracefulPulumiErrorHandlers/missingFilesInBuild.js @@ -0,0 +1,16 @@ +const { red } = require("chalk"); + +const MATCH_STRING = "failed to compute archive hash for"; + +module.exports = ({ error }) => { + const { message } = error; + + if (typeof message === "string" && message.includes(MATCH_STRING)) { + const cmd = red(`yarn webiny build {APP_NAME} --env {ENVIRONMENT_NAME}`); + return [ + `Looks like the deployment failed because Pulumi could not retrieve the built code.`, + `Please try again, or, alternatively, try building the project application you're`, + `trying to deploy by running ${cmd}.` + ].join(" "); + } +}; diff --git a/packages/cli-plugin-deploy-pulumi/utils/gracefulPulumiErrorHandlers/pendingOperationsInfo.js b/packages/cli-plugin-deploy-pulumi/utils/gracefulPulumiErrorHandlers/pendingOperationsInfo.js new file mode 100644 index 00000000000..f1b31527575 --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/utils/gracefulPulumiErrorHandlers/pendingOperationsInfo.js @@ -0,0 +1,24 @@ +const MATCH_STRING = "the stack is currently locked by"; +const { red } = require("chalk"); + +module.exports = ({ error, context }) => { + const { message } = error; + + const projectApplicationName = context.projectApplication?.id || `PROJECT_APPLICATION`; + const environmentName = context.commandParams?.env || `ENVIRONMENT_NAME`; + + if (typeof message === "string" && message.includes(MATCH_STRING)) { + const cmd = `yarn webiny pulumi ${projectApplicationName} --env ${environmentName} -- cancel`; + + const message = [ + `The Pulumi error you've just experienced can occur`, + `if one of the previous deployments has been interrupted or another deployment`, + `is already in progress. For development purposes, the quickest way to get`, + `past this issue is to run the following command: ${red(cmd)}.` + ].join(" "); + + const learnMore = "https://webiny.link/locked-stacks"; + + return { message, learnMore }; + } +}; diff --git a/packages/cli-plugin-deploy-pulumi/utils/index.d.ts b/packages/cli-plugin-deploy-pulumi/utils/index.d.ts index edd65fe87e0..da23d438f99 100644 --- a/packages/cli-plugin-deploy-pulumi/utils/index.d.ts +++ b/packages/cli-plugin-deploy-pulumi/utils/index.d.ts @@ -9,7 +9,6 @@ export function getStackOutput>( export function getStackOutput>(options: { folder: string; env: string; - // variant?: string; TODO: finish staged deployments. map?: Record; cwd?: string; }): TStackOutput; @@ -21,3 +20,6 @@ interface GetPulumiParams { } export function getPulumi(params: GetPulumiParams): Pulumi; + +export * from "./GracefulError"; +export * from "./GracefulPulumiError"; \ No newline at end of file diff --git a/packages/cli-plugin-deploy-pulumi/utils/index.js b/packages/cli-plugin-deploy-pulumi/utils/index.js index dc598076e0b..60c1839d996 100644 --- a/packages/cli-plugin-deploy-pulumi/utils/index.js +++ b/packages/cli-plugin-deploy-pulumi/utils/index.js @@ -1,6 +1,8 @@ const createProjectApplicationWorkspace = require("./createProjectApplicationWorkspace"); const getPulumi = require("./getPulumi"); const getStackOutput = require("./getStackOutput"); +const { GracefulError } = require("./GracefulError"); +const { GracefulPulumiError } = require("./GracefulPulumiError"); const createPulumiCommand = require("./createPulumiCommand"); const loadEnvVariables = require("./loadEnvVariables"); const processHooks = require("./processHooks"); @@ -8,14 +10,18 @@ const runHook = require("./runHook"); const notify = require("./notify"); const login = require("./login"); const mapStackOutput = require("./mapStackOutput"); +const measureDuration = require("./measureDuration"); const getRandomColorForString = require("./getRandomColorForString"); module.exports = { getPulumi, getStackOutput, + GracefulError, + GracefulPulumiError, createPulumiCommand, loadEnvVariables, mapStackOutput, + measureDuration, processHooks, runHook, notify, diff --git a/packages/cli-plugin-deploy-pulumi/utils/loadEnvVariables.js b/packages/cli-plugin-deploy-pulumi/utils/loadEnvVariables.js index 35ef68246af..c3505e8bc23 100644 --- a/packages/cli-plugin-deploy-pulumi/utils/loadEnvVariables.js +++ b/packages/cli-plugin-deploy-pulumi/utils/loadEnvVariables.js @@ -1,11 +1,11 @@ -const path = require("path"); - // Tries to load env files from a couple of different places, for a stack and a given environment. // 1. Load from {PROJECT_APPLICATION_FOLDER}/.env.{PROVIDED_ENV} // 2. Load from {PROJECT_APPLICATION_FOLDER}/.env module.exports = async (inputs, context) => { + const path = require("path"); + const { folder, env, debug } = inputs; const projectRoot = context.project.root; diff --git a/packages/cli-plugin-deploy-pulumi/utils/login.js b/packages/cli-plugin-deploy-pulumi/utils/login.js index 2b04917bd63..055cba9e92d 100644 --- a/packages/cli-plugin-deploy-pulumi/utils/login.js +++ b/packages/cli-plugin-deploy-pulumi/utils/login.js @@ -1,8 +1,3 @@ -const getPulumi = require("../utils/getPulumi"); -const trimEnd = require("lodash/trimEnd"); -const fs = require("fs"); -const { join } = require("path"); - // To use a self-managed backend, specify a storage endpoint URL as pulumi login’s argument: // s3://, azblob://, gs://, or file://. // This will tell Pulumi to store state in AWS S3, Azure Blob Storage, Google Cloud Storage, or the @@ -11,6 +6,11 @@ const { join } = require("path"); const SELF_MANAGED_BACKEND = ["s3://", "azblob://", "gs://"]; module.exports = async projectApplication => { + const getPulumi = require("../utils/getPulumi"); + const trimEnd = require("lodash/trimEnd"); + const fs = require("fs"); + const { join } = require("path"); + // Do the login with Pulumi CLI. const pulumi = await getPulumi({ projectApplication }); diff --git a/packages/cli-plugin-deploy-pulumi/utils/measureDuration.js b/packages/cli-plugin-deploy-pulumi/utils/measureDuration.js new file mode 100644 index 00000000000..5a66df27ccc --- /dev/null +++ b/packages/cli-plugin-deploy-pulumi/utils/measureDuration.js @@ -0,0 +1,9 @@ +const humanizeDuration = require("humanize-duration"); + +module.exports = () => { + const start = new Date(); + return () => + humanizeDuration(new Date() - start, { + maxDecimalPoints: 2 + }); +}; diff --git a/packages/cli-plugin-deploy-pulumi/utils/notify.js b/packages/cli-plugin-deploy-pulumi/utils/notify.js index 47da434fe58..23e7fda2628 100644 --- a/packages/cli-plugin-deploy-pulumi/utils/notify.js +++ b/packages/cli-plugin-deploy-pulumi/utils/notify.js @@ -7,7 +7,8 @@ module.exports = ({ message }) => { title: "Webiny CLI", message, icon: join(__dirname, "logo.png"), - sound: false + sound: false, + timeout: 1 }); setTimeout(resolve, 100); diff --git a/packages/cli-plugin-deploy-pulumi/utils/processHooks.js b/packages/cli-plugin-deploy-pulumi/utils/processHooks.js index ef44a1d013f..3cdfd263b98 100644 --- a/packages/cli-plugin-deploy-pulumi/utils/processHooks.js +++ b/packages/cli-plugin-deploy-pulumi/utils/processHooks.js @@ -1,3 +1,5 @@ +const { GracefulError } = require("./GracefulError"); + module.exports = async (hook, { context, ...options }) => { const plugins = context.plugins.byType(hook); @@ -5,9 +7,14 @@ module.exports = async (hook, { context, ...options }) => { try { await plugins[i].hook(options, context); } catch (err) { + if (err instanceof GracefulError) { + throw err; + } + err.message = `An error occurred while processing ${context.error.hl( plugins[i].name )} plugin: ${err.message}`; + throw err; } } diff --git a/packages/cli-plugin-deploy-pulumi/utils/runHook.js b/packages/cli-plugin-deploy-pulumi/utils/runHook.js index c1b6886b3e2..856c852a6ef 100644 --- a/packages/cli-plugin-deploy-pulumi/utils/runHook.js +++ b/packages/cli-plugin-deploy-pulumi/utils/runHook.js @@ -2,10 +2,10 @@ const processHooks = require("./processHooks"); module.exports = async function runHook({ hook, skip, args, context }) { if (skip) { - context.info(`Skipped "${hook}" hook.`); + context.info(`Skipped %s hook.`, hook); } else { - context.info(`Running "${hook}" hook...`); + context.info(`Running %s hook...`, hook); await processHooks(hook, args); - context.success(`Hook "${hook}" completed.`); + context.info(`Hook %s completed.`, hook); } }; diff --git a/packages/cli-plugin-scaffold-admin-app-module/src/index.ts b/packages/cli-plugin-scaffold-admin-app-module/src/index.ts index 6563db1b032..d9f2fa843e7 100644 --- a/packages/cli-plugin-scaffold-admin-app-module/src/index.ts +++ b/packages/cli-plugin-scaffold-admin-app-module/src/index.ts @@ -15,7 +15,6 @@ import { updateScaffoldsIndexFile, formatCode } from "@webiny/cli-plugin-scaffold/utils"; -import { getApiProjectApplicationFolder } from "@webiny/cli/utils"; import { projectHasCodeFolders } from "./utils"; const ncp = util.promisify(ncpBase.ncp); @@ -53,7 +52,7 @@ export default (): CliCommandScaffoldTemplate => ({ { name: "graphqlPluginsFolderPath", message: "Enter GraphQL API plugins folder path:", - default: `${getApiProjectApplicationFolder(context.project)}${gqlSuffixPath}`, + default: `apps/api${gqlSuffixPath}`, validate: (location: string) => { if (location.length < 2) { return `Please enter GraphQL API ${chalk.cyan("plugins")} folder path.`; @@ -329,9 +328,7 @@ export default (): CliCommandScaffoldTemplate => ({ console.log( `‣ deploy the extended GraphQL API and continue developing by running the ${chalk.green( - `yarn webiny watch ${getApiProjectApplicationFolder( - context.project - )}${suffixPath} --env dev` + `yarn webiny watch apps/api${suffixPath} --env dev` )} command` ); diff --git a/packages/cli-plugin-scaffold-graphql-service/src/index.ts b/packages/cli-plugin-scaffold-graphql-service/src/index.ts index f385bd5970e..634bf4fe705 100644 --- a/packages/cli-plugin-scaffold-graphql-service/src/index.ts +++ b/packages/cli-plugin-scaffold-graphql-service/src/index.ts @@ -19,7 +19,6 @@ import { LAST_USED_GQL_API_PLUGINS_PATH } from "@webiny/cli-plugin-scaffold/utils"; import getContextMeta from "./getContextMeta"; -import { getApiProjectApplicationFolder } from "@webiny/cli/utils"; import { projectHasCodeFolders } from "./utils"; const ncp = util.promisify(ncpBase.ncp); @@ -62,7 +61,7 @@ export default (): CliCommandScaffoldTemplate => ({ return ( context.localStorage.get(LAST_USED_GQL_API_PLUGINS_PATH) || - `${getApiProjectApplicationFolder(context.project)}${suffixPath}` + `apps/api${suffixPath}` ); }, validate: (pluginsFolderPath: string) => { @@ -358,9 +357,7 @@ export default (): CliCommandScaffoldTemplate => ({ console.log( `‣ deploy the extended GraphQL API and continue developing by running the ${chalk.green( - `yarn webiny watch ${getApiProjectApplicationFolder( - context.project - )}${suffixPath} --env dev` + `yarn webiny watch apps/api/${suffixPath} --env dev` )} command` ); diff --git a/packages/cli/cli.js b/packages/cli/cli.js index 8bb45fc2451..dcf2b1f8e70 100644 --- a/packages/cli/cli.js +++ b/packages/cli/cli.js @@ -59,13 +59,14 @@ yargs } if (error) { - context.error(error.message); // Unfortunately, yargs doesn't provide passed args here, so we had to do it via process.argv. + console.log(); if (process.argv.includes("--debug")) { context.debug(error); + } else { + context.error(error.message); } - console.log(); const plugins = context.plugins.byType("cli-command-error"); for (let i = 0; i < plugins.length; i++) { const plugin = plugins[i]; diff --git a/packages/cli/commands/about/getDatabaseSetup.js b/packages/cli/commands/about/getDatabaseSetup.js new file mode 100644 index 00000000000..6f0e56d6a52 --- /dev/null +++ b/packages/cli/commands/about/getDatabaseSetup.js @@ -0,0 +1,45 @@ +const { getProject } = require("@webiny/cli/utils"); +const path = require("path"); +const fs = require("fs"); + +const DATABASE_SETUPS = { + DDB: "ddb", + DDB_ES: "ddb-es", + DDB_OS: "ddb-os" +}; + +const DATABASE_SETUPS_LABELS = { + [DATABASE_SETUPS.DDB]: "Amazon DynamoDB", + [DATABASE_SETUPS.DDB_ES]: "Amazon DynamoDB + Amazon Elasticsearch Service", + [DATABASE_SETUPS.DDB_OS]: "Amazon DynamoDB + Amazon OpenSearch Service" +}; + +// In order to get the database setup, we check for existence of `elasticSearch` +// or `openSearch` strings within the `apps/core/webiny.application.ts` file. +const getDatabaseSetup = () => { + const project = getProject(); + const webinyAppTsPath = path.join(project.root, "apps", "core", "webiny.application.ts"); + + const webinyAppTs = fs.readFileSync(webinyAppTsPath, "utf8"); + if (webinyAppTs.includes("elasticSearch")) { + return "ddb-es"; + } + + if (webinyAppTs.includes("openSearch")) { + return "ddb-os"; + } + + return "ddb"; +}; + +const getDatabaseSetupLabel = () => { + const setup = getDatabaseSetup(); + return DATABASE_SETUPS_LABELS[setup]; +}; + +module.exports = { + getDatabaseSetup, + getDatabaseSetupLabel, + DATABASE_SETUPS, + DATABASE_SETUPS_LABELS +}; diff --git a/packages/cli/commands/about/getNpmVersion.js b/packages/cli/commands/about/getNpmVersion.js new file mode 100644 index 00000000000..37fd068a2f2 --- /dev/null +++ b/packages/cli/commands/about/getNpmVersion.js @@ -0,0 +1,10 @@ +const execa = require("execa"); + +module.exports.getNpmVersion = async () => { + try { + const { stdout } = await execa("npm", ["--version"]); + return stdout; + } catch (err) { + return ""; + } +}; diff --git a/packages/cli/commands/about/index.js b/packages/cli/commands/about/index.js index 0a03b721b37..f3667bd32ee 100644 --- a/packages/cli/commands/about/index.js +++ b/packages/cli/commands/about/index.js @@ -1,20 +1,27 @@ const NO_VALUE = "-"; +const isCI = require("is-ci"); const getData = async context => { const { getUser } = require("../wcp/utils"); const { getNpxVersion } = require("./getNpxVersion"); + const { getNpmVersion } = require("./getNpmVersion"); const { getPulumiVersions } = require("./getPulumiVersions"); const { getYarnVersion } = require("./getYarnVersion"); + const { getDatabaseSetupLabel } = require("./getDatabaseSetup"); const [pulumiVersion, pulumiAwsVersion] = await getPulumiVersions(); + const wcpProjectId = process.env.WCP_PROJECT_ID; + const wcpUser = await getUser().catch(() => null); + const wcpUsingProjectEnvironmentApiKey = Boolean(process.env.WCP_ENVIRONMENT_API_KEY); + return [ { sectionName: "Webiny Project", data: { Name: context.project.name, Version: context.version, - Template: context.project.config.template || NO_VALUE, + "Database Setup": getDatabaseSetupLabel(), "Debug Enabled": process.env.DEBUG === "true" ? "Yes" : "No", "Feature Flags": process.env.WEBINY_FEATURE_FLAGS || "N/A" } @@ -22,13 +29,20 @@ const getData = async context => { { sectionName: "Webiny Control Panel (WCP)", data: { - "Project ID": context.project.config.id || process.env.WCP_PROJECT_ID, - User: await getUser() - .catch(() => "N/A") - .then(res => res.email), - Authentication: process.env.WEBINY_PROJECT_ENVIRONMENT_API_KEY - ? "Project Environment API Key" - : "Personal Access Token" + "Project ID": wcpProjectId, + User: wcpUser?.email || "N/A", + "Using Project Environment API Key": wcpUsingProjectEnvironmentApiKey ? "Yes" : "No" + } + }, + { + sectionName: "Host", + data: { + OS: `${process.platform} (${process.arch})`, + "Node.js": process.version, + NPM: await getNpmVersion(), + NPX: await getNpxVersion(), + Yarn: await getYarnVersion(), + "Is CI": isCI ? "Yes" : "No" } }, { @@ -36,19 +50,9 @@ const getData = async context => { data: { "@pulumi/pulumi": pulumiVersion, "@pulumi/aws": pulumiAwsVersion, - "Used AWS Region": process.env.AWS_REGION, "Secrets Provider": process.env.PULUMI_SECRETS_PROVIDER, "Using Password": process.env.PULUMI_CONFIG_PASSPHRASE ? "Yes" : "No" } - }, - { - sectionName: "Host", - data: { - OS: `${process.platform} (${process.arch})`, - "Node.js": process.version, - NPX: await getNpxVersion(), - Yarn: await getYarnVersion() - } } ]; }; @@ -84,7 +88,7 @@ module.exports = { console.log(bold(sectionName)); Object.keys(data).forEach(key => { - console.log(key.padEnd(30), data[key] || NO_VALUE); + console.log(key.padEnd(36), data[key] || NO_VALUE); }); }); } diff --git a/packages/cli/commands/run/index.js b/packages/cli/commands/run/index.js index 636d7e484f8..80ba974d640 100644 --- a/packages/cli/commands/run/index.js +++ b/packages/cli/commands/run/index.js @@ -1,7 +1,3 @@ -const camelCase = require("camelcase"); -const findUp = require("find-up"); -const path = require("path"); - module.exports = { type: "cli-command", name: "cli-command-run", @@ -16,6 +12,10 @@ module.exports = { }); }, async argv => { + const camelCase = require("camelcase"); + const findUp = require("find-up"); + const path = require("path"); + const configFile = findUp.sync(["webiny.config.ts", "webiny.config.js"]); let config = context.import(configFile); diff --git a/packages/cli/commands/telemetry/index.js b/packages/cli/commands/telemetry/index.js index 7870435b5b8..d7af84fbb23 100644 --- a/packages/cli/commands/telemetry/index.js +++ b/packages/cli/commands/telemetry/index.js @@ -1,10 +1,10 @@ -const telemetry = require("@webiny/telemetry/cli"); - module.exports = { type: "cli-command", name: "cli-command-telemetry", create({ yargs, context }) { yargs.command("enable-telemetry", "Enable anonymous telemetry.", async () => { + const telemetry = require("@webiny/telemetry/cli"); + telemetry.enable(); await telemetry.sendEvent({ event: "enable-telemetry" }); context.info( @@ -17,6 +17,8 @@ module.exports = { }); yargs.command("disable-telemetry", "Disable anonymous telemetry.", async () => { + const telemetry = require("@webiny/telemetry/cli"); + await telemetry.sendEvent({ event: "disable-telemetry" }); telemetry.disable(); context.info(`Webiny telemetry is now %s!`, "disabled"); diff --git a/packages/cli/commands/upgrade/index.js b/packages/cli/commands/upgrade/index.js index f605f5e81f7..e96811435d3 100644 --- a/packages/cli/commands/upgrade/index.js +++ b/packages/cli/commands/upgrade/index.js @@ -1,7 +1,3 @@ -const { red } = require("chalk"); -const execa = require("execa"); -const semver = require("semver"); - module.exports = [ { type: "cli-command", @@ -29,6 +25,10 @@ module.exports = [ }); }, async argv => { + const { red } = require("chalk"); + const execa = require("execa"); + const semver = require("semver"); + if (!argv.skipChecks) { // Before doing any upgrading, there must not be any active changes in the current branch. let gitStatus = ""; diff --git a/packages/cli/package.json b/packages/cli/package.json index e1c0e81e261..07d7a090d96 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -25,6 +25,7 @@ "fs-extra": "^9.1.0", "graphql-request": "^3.7.0", "inquirer": "^7.3.3", + "is-ci": "^3.0.0", "ncp": "2.0.0", "open": "^8.0.6", "pirates": "^4.0.1", diff --git a/packages/cli/types.d.ts b/packages/cli/types.d.ts index e4f5e33911a..46040a02a71 100644 --- a/packages/cli/types.d.ts +++ b/packages/cli/types.d.ts @@ -2,12 +2,16 @@ * Rename file to types.ts when switching the package to Typescript. */ +import glob from "fast-glob"; +import { dirname, join } from "path"; + /** * A simplified plugins container interface, used specifically within the Webiny CLI. * Not in relation with "@webiny/plugins" package. */ export interface PluginsContainer { byType(type: T["type"]): T[]; + byName(name: T["name"]): T; } @@ -18,6 +22,7 @@ export interface PluginsContainer { export interface Plugin { type: string; name?: string; + [key: string]: any; } @@ -36,11 +41,65 @@ interface Project { root: string; } +export interface ProjectApplication { + /** + * Unique ID of the project application. + */ + id: string; + /** + * Name of the project application. + */ + name: string; + /** + * Description of the project application. + */ + description: string; + /** + * Type of the project application. + */ + type: string; + /** + * Root path of the project application. + */ + root: string; + /** + * Commonly used paths. + */ + paths: { + relative: string; + absolute: string; + workspace: string; + }; + /** + * Project application config (exported via `webiny.application.ts` file). + */ + config: Record; + /** + * Project application package.json. + */ + project: Project; + + /** + * A list of all the packages in the project application. + */ + get packages(): Array<{ + name: string; + paths: { + root: string; + packageJson: string; + config: string; + }; + packageJson: Record; + get config(): any; + }>; +} + /** * A type that represents the logging method. */ interface Log { (...args: any): string; + hl: (...args: any) => string; highlight: (...args: any) => string; } diff --git a/packages/cli/utils/getApiProjectApplicationFolder.js b/packages/cli/utils/getApiProjectApplicationFolder.js deleted file mode 100644 index a9f52694468..00000000000 --- a/packages/cli/utils/getApiProjectApplicationFolder.js +++ /dev/null @@ -1,12 +0,0 @@ -const fs = require("fs"); -const path = require("path"); - -// This function has been created in order to help preserve backwards compatibility -// (from 5.29.0, the `api` app has been moved into the `apps/api` directory). -module.exports = project => { - if (fs.existsSync(path.join(project.root, "api"))) { - return "api"; - } - - return "apps/api"; -}; diff --git a/packages/cli/utils/getProjectApplication.js b/packages/cli/utils/getProjectApplication.js index 4d568d7fe29..f6215eaba85 100644 --- a/packages/cli/utils/getProjectApplication.js +++ b/packages/cli/utils/getProjectApplication.js @@ -43,16 +43,10 @@ module.exports = args => { projectAppRelativePath ); - // If we're missing the `pulumi` property in the `applicationConfig` object, that - // means we're dealing with an old project application where all of the Pulumi code is - // located in user's project. New projects applications have this code abstracted away. - const type = applicationConfig.pulumi ? "v5-workspaces" : "v5"; - return { id, name, description, - type, root: projectAppRootPath, paths: { relative: projectAppRelativePath, @@ -72,6 +66,8 @@ module.exports = args => { return { name: packageJson.name, paths: { + absolute: dirname(config), + relative: relative(project.root, dirPath), root: dirname(config), packageJson: join(dirPath, "package.json"), config diff --git a/packages/cli/utils/index.d.ts b/packages/cli/utils/index.d.ts deleted file mode 100644 index 85ea69cd986..00000000000 --- a/packages/cli/utils/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export function getApiProjectApplicationFolder(project: Record): boolean; diff --git a/packages/cli/utils/index.js b/packages/cli/utils/index.js index a69797332d6..934d1d37637 100644 --- a/packages/cli/utils/index.js +++ b/packages/cli/utils/index.js @@ -2,7 +2,6 @@ const { importModule } = require("./importModule"); const createProjectApplicationWorkspace = require("./createProjectApplicationWorkspace"); const getProject = require("./getProject"); const getProjectApplication = require("./getProjectApplication"); -const getApiProjectApplicationFolder = require("./getApiProjectApplicationFolder"); const localStorage = require("./localStorage"); const log = require("./log"); const sendEvent = require("./sendEvent"); @@ -14,7 +13,6 @@ const noop = () => { module.exports = { createProjectApplicationWorkspace, - getApiProjectApplicationFolder, getProject, getProjectApplication, importModule, diff --git a/packages/cli/utils/loadEnvVariables.js b/packages/cli/utils/loadEnvVariables.js index 2ef3486756a..52d6d0cac0d 100644 --- a/packages/cli/utils/loadEnvVariables.js +++ b/packages/cli/utils/loadEnvVariables.js @@ -24,6 +24,15 @@ if (yargs.argv.env) { paths.push(path.join(project.root, `.env.${yargs.argv.env}`)); } +// If the `WCP_PROJECT_ID` environment variable is not set already, we check if there's +// a WCP project ID set via the `webiny.project.ts` config file. If so, we assign it +// to the `WCP_PROJECT_ID` environment variable. +if (!process.env.WCP_PROJECT_ID) { + if (project.config.id) { + process.env.WCP_PROJECT_ID = project.config.id; + } +} + // Let's load environment variables for (let i = 0; i < paths.length; i++) { const path = paths[i]; diff --git a/packages/cli/utils/sendEvent.js b/packages/cli/utils/sendEvent.js index a198256351c..0d6436a17af 100644 --- a/packages/cli/utils/sendEvent.js +++ b/packages/cli/utils/sendEvent.js @@ -1,15 +1,11 @@ const { sendEvent } = require("@webiny/telemetry/cli"); const getProject = require("./getProject"); -module.exports = ({ event, properties, extraPayload }) => { +module.exports = (event, properties) => { const project = getProject(); if (project.config.cli && project.config.cli.telemetry === false) { return; } - return sendEvent({ - event, - properties, - extraPayload - }); + return sendEvent({ event, properties }); }; diff --git a/packages/commodo/.babelrc.js b/packages/commodo/.babelrc.js deleted file mode 100644 index 9da7674cb52..00000000000 --- a/packages/commodo/.babelrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@webiny/project-utils").createBabelConfigForNode({ path: __dirname }); diff --git a/packages/commodo/LICENSE b/packages/commodo/LICENSE deleted file mode 100644 index f772d04d4db..00000000000 --- a/packages/commodo/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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/commodo/README.md b/packages/commodo/README.md deleted file mode 100644 index 99a819496d2..00000000000 --- a/packages/commodo/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# @webiny/commodo -[![](https://img.shields.io/npm/dw/webiny-commodo.svg)](https://www.npmjs.com/package/webiny-commodo) -[![](https://img.shields.io/npm/v/webiny-commodo.svg)](https://www.npmjs.com/package/webiny-commodo) -[![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) - -A set of frequently used Commodo higher order functions. - -For more information, please visit -[the official docs](https://github.com/doitadrian/commodo). - -## Install -``` -npm install --save @webiny/commodo -``` - -Or if you prefer yarn: -``` -yarn add @webiny/commodo -``` diff --git a/packages/commodo/package.json b/packages/commodo/package.json deleted file mode 100644 index abd60b88df9..00000000000 --- a/packages/commodo/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "@webiny/commodo", - "version": "0.0.0", - "main": "index.js", - "repository": { - "type": "git", - "url": "https://github.com/webiny/webiny-js.git" - }, - "description": "A set of frequently used Commodo higher order functions.", - "contributors": [ - "Pavel Denisjuk ", - "Sven Al Hamad ", - "Adrian Smijulj " - ], - "license": "MIT", - "dependencies": { - "@commodo/fields": "1.1.2-beta.20", - "@commodo/hooks": "^1.2.1", - "@commodo/name": "^1.3.1", - "commodo-fields-date": "^1.0.3", - "commodo-fields-float": "^1.0.2", - "commodo-fields-int": "^1.0.1", - "commodo-fields-object": "^1.0.3", - "ramda": "^0.26.1", - "repropose": "^1.0.2" - }, - "devDependencies": { - "@babel/cli": "^7.23.9", - "@babel/core": "^7.24.0", - "@webiny/cli": "0.0.0", - "@webiny/project-utils": "0.0.0", - "rimraf": "^5.0.5", - "typescript": "4.7.4" - }, - "publishConfig": { - "access": "public", - "directory": "dist" - }, - "scripts": { - "build": "yarn webiny run build", - "watch": "yarn webiny run watch" - }, - "gitHead": "8476da73b653c89cc1474d968baf55c1b0ae0e5f" -} diff --git a/packages/commodo/src/compose.ts b/packages/commodo/src/compose.ts deleted file mode 100644 index eac8f05d25e..00000000000 --- a/packages/commodo/src/compose.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * We need to ignore here because ramda TS produces errors. - */ -// @ts-expect-error -export { default as compose } from "ramda/src/compose"; diff --git a/packages/commodo/src/fields-date.ts b/packages/commodo/src/fields-date.ts deleted file mode 100644 index 02ba98a147b..00000000000 --- a/packages/commodo/src/fields-date.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * We need to ignore here because commodo-fields-date do not have types. - */ -// @ts-expect-error -export * from "commodo-fields-date"; diff --git a/packages/commodo/src/fields-float.ts b/packages/commodo/src/fields-float.ts deleted file mode 100644 index 149281fa412..00000000000 --- a/packages/commodo/src/fields-float.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * We need to ignore here because commodo-fields-float do not have types. - */ -// @ts-expect-error -export * from "commodo-fields-float"; diff --git a/packages/commodo/src/fields-int.ts b/packages/commodo/src/fields-int.ts deleted file mode 100644 index 00c83ff72bc..00000000000 --- a/packages/commodo/src/fields-int.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * We need to ignore here because commodo-fields-int do not have types. - */ -// @ts-expect-error -export * from "commodo-fields-int"; diff --git a/packages/commodo/src/fields-object.ts b/packages/commodo/src/fields-object.ts deleted file mode 100644 index 174f6046920..00000000000 --- a/packages/commodo/src/fields-object.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * We need to ignore here because commodo-fields-object do not have types. - */ -// @ts-expect-error -export * from "commodo-fields-object"; diff --git a/packages/commodo/src/fields.ts b/packages/commodo/src/fields.ts deleted file mode 100644 index 9121837b129..00000000000 --- a/packages/commodo/src/fields.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * We need to ignore here because @commodo/fields do not have types. - */ -// @ts-expect-error -export * from "@commodo/fields"; diff --git a/packages/commodo/src/hooks.ts b/packages/commodo/src/hooks.ts deleted file mode 100644 index dba464d735e..00000000000 --- a/packages/commodo/src/hooks.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * We need to ignore here because @commodo/hooks do not have types. - */ -// @ts-expect-error -export * from "@commodo/hooks"; diff --git a/packages/commodo/src/index.ts b/packages/commodo/src/index.ts deleted file mode 100644 index 48f410e2316..00000000000 --- a/packages/commodo/src/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from "./repropose"; -export * from "./name"; -export * from "./fields"; -export * from "./hooks"; -export * from "./fields-int"; -export * from "./fields-float"; -export * from "./fields-date"; -export * from "./fields-object"; -export * from "./pipe"; -export * from "./compose"; diff --git a/packages/commodo/src/name.ts b/packages/commodo/src/name.ts deleted file mode 100644 index 901ebbda61e..00000000000 --- a/packages/commodo/src/name.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * We need to ignore here because ramda TS produces errors. - */ -// @ts-expect-error -export * from "@commodo/name"; diff --git a/packages/commodo/src/pipe.ts b/packages/commodo/src/pipe.ts deleted file mode 100644 index e198306a94c..00000000000 --- a/packages/commodo/src/pipe.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * We need to ignore here because ramda TS produces errors. - */ -// @ts-expect-error -export { default as pipe } from "ramda/src/pipe"; diff --git a/packages/commodo/src/repropose.ts b/packages/commodo/src/repropose.ts deleted file mode 100644 index 8fd8cf4e2ad..00000000000 --- a/packages/commodo/src/repropose.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * We need to ignore here because repropose do not have types. - */ -// @ts-expect-error -export * from "repropose"; diff --git a/packages/commodo/tsconfig.build.json b/packages/commodo/tsconfig.build.json deleted file mode 100644 index 5e7843d3c8c..00000000000 --- a/packages/commodo/tsconfig.build.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.build.json", - "include": ["src"], - "references": [], - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist", - "declarationDir": "./dist", - "paths": { "~/*": ["./src/*"], "~tests/*": ["./__tests__/*"] }, - "baseUrl": "." - } -} diff --git a/packages/commodo/tsconfig.json b/packages/commodo/tsconfig.json deleted file mode 100644 index 6ca26f3c929..00000000000 --- a/packages/commodo/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["src", "__tests__"], - "references": [], - "compilerOptions": { - "rootDirs": ["./src", "./__tests__"], - "outDir": "./dist", - "declarationDir": "./dist", - "paths": { "~/*": ["./src/*"], "~tests/*": ["./__tests__/*"] }, - "baseUrl": "." - } -} diff --git a/packages/commodo/webiny.config.js b/packages/commodo/webiny.config.js deleted file mode 100644 index 6dff86766c9..00000000000 --- a/packages/commodo/webiny.config.js +++ /dev/null @@ -1,8 +0,0 @@ -const { createWatchPackage, createBuildPackage } = require("@webiny/project-utils"); - -module.exports = { - commands: { - build: createBuildPackage({ cwd: __dirname }), - watch: createWatchPackage({ cwd: __dirname }) - } -}; diff --git a/packages/create-webiny-project/bin.js b/packages/create-webiny-project/bin.js index 809008ba8f0..65db972f61e 100755 --- a/packages/create-webiny-project/bin.js +++ b/packages/create-webiny-project/bin.js @@ -8,18 +8,17 @@ const getNpmVersion = require("./utils/getNpmVersion"); const verifyConfig = require("./utils/verifyConfig"); (async () => { - const minNodeVersion = "16"; const minNpmVersion = "10"; const minYarnVersion = "1.22.21"; /** * Node */ const nodeVersion = process.versions.node; - if (!semver.satisfies(nodeVersion, `>=${minNodeVersion}`)) { + if (!semver.satisfies(nodeVersion, `^18 || ^20`)) { console.error( chalk.red( [ - `You are running Node.js ${nodeVersion}, but Webiny requires version ${minNodeVersion} or higher.`, + `You are running Node.js ${nodeVersion}, but Webiny requires version 18 or 20.`, `Please switch to one of the required versions and try again.`, "For more information, please visit https://docs.webiny.com/docs/tutorials/install-webiny#prerequisites." ].join(" ") diff --git a/packages/create-webiny-project/index.js b/packages/create-webiny-project/index.js index 79132f14fca..87081b8f202 100644 --- a/packages/create-webiny-project/index.js +++ b/packages/create-webiny-project/index.js @@ -71,12 +71,18 @@ yargs.command( }); yargs.option("log", { describe: - "Creates a log file to see output of installation. Defaults to creating cwp-logs.txt in current directory", + "Creates a log file to see output of installation. Defaults to create-webiny-project-logs.txt in current directory", alias: "l", - default: "cwp-logs.txt", + default: "create-webiny-project-logs.txt", type: "string", demandOption: false }); + yargs.option("debug", { + describe: "Turn on debug logs", + default: false, + type: "boolean", + demandOption: false + }); yargs.option("cleanup", { describe: "If an error occurs upon project creation, deletes all generated files", alias: "c", diff --git a/packages/create-webiny-project/utils/GracefulError.d.ts b/packages/create-webiny-project/utils/GracefulError.d.ts new file mode 100644 index 00000000000..902a002eefd --- /dev/null +++ b/packages/create-webiny-project/utils/GracefulError.d.ts @@ -0,0 +1 @@ +export class GracefulError extends Error {} diff --git a/packages/create-webiny-project/utils/GracefulError.js b/packages/create-webiny-project/utils/GracefulError.js new file mode 100644 index 00000000000..9c9250e7aba --- /dev/null +++ b/packages/create-webiny-project/utils/GracefulError.js @@ -0,0 +1,3 @@ +class GracefulError extends Error {} + +module.exports = { GracefulError }; diff --git a/packages/create-webiny-project/utils/GracefulYarnError.d.ts b/packages/create-webiny-project/utils/GracefulYarnError.d.ts new file mode 100644 index 00000000000..a14db51c35a --- /dev/null +++ b/packages/create-webiny-project/utils/GracefulYarnError.d.ts @@ -0,0 +1,3 @@ +export class GracefulYarnError extends Error { + static from(e: Error, context: Record): GracefulYarnError | undefined; +} diff --git a/packages/create-webiny-project/utils/GracefulYarnError.js b/packages/create-webiny-project/utils/GracefulYarnError.js new file mode 100644 index 00000000000..8a5858aad45 --- /dev/null +++ b/packages/create-webiny-project/utils/GracefulYarnError.js @@ -0,0 +1,31 @@ +const { GracefulError } = require("./GracefulError"); +const gracefulYarnErrorHandlers = require("./gracefulYarnErrorHandlers"); + +class GracefulYarnError extends GracefulError { + static from(e, context) { + if (e instanceof GracefulError) { + return e; + } + + for (const handler of gracefulYarnErrorHandlers) { + const result = handler({ error: e, context }); + if (!result) { + continue; + } + + let errorMessage = result; + if (typeof result === "object") { + const { message, learnMore } = result; + + errorMessage = message; + if (learnMore) { + errorMessage += ` Learn more: ${learnMore}.`; + } + } + + return new GracefulYarnError(errorMessage, { cause: e }); + } + } +} + +module.exports = { GracefulYarnError }; diff --git a/packages/create-webiny-project/utils/createProject.js b/packages/create-webiny-project/utils/createProject.js index d37f823fccf..33b7435fb19 100644 --- a/packages/create-webiny-project/utils/createProject.js +++ b/packages/create-webiny-project/utils/createProject.js @@ -1,5 +1,5 @@ #!/usr/bin/env node -const { yellow, red, green, gray } = require("chalk"); +const { yellow, red, green, gray, bold } = require("chalk"); const execa = require("execa"); const fs = require("fs-extra"); const Listr = require("listr"); @@ -8,11 +8,20 @@ const writeJson = require("write-json-file"); const rimraf = require("rimraf"); const { sendEvent } = require("@webiny/telemetry/cli"); const getPackageJson = require("./getPackageJson"); -const checkProjectName = require("./checkProjectName"); +const validateProjectName = require("./validateProjectName"); const yaml = require("js-yaml"); const findUp = require("find-up"); +const { GracefulError } = require("./GracefulError"); const NOT_APPLICABLE = gray("N/A"); +const HL = bold(gray("—")).repeat(30); + +const sleep = () => + new Promise(resolve => { + setTimeout(() => { + resolve(); + }, 500); + }); module.exports = async function createProject({ projectName, @@ -20,6 +29,7 @@ module.exports = async function createProject({ template, tag, log, + debug, cleanup, interactive, templateOptions, @@ -91,6 +101,8 @@ module.exports = async function createProject({ // @webiny/cli is not installed globally } + validateProjectName(projectName); + console.log(`Initializing a new Webiny project in ${green(projectRoot)}...`); await sendEvent({ event: "create-webiny-project-start" }); @@ -109,7 +121,6 @@ module.exports = async function createProject({ // Creates root package.json. title: "Prepare project folder", task: () => { - checkProjectName(projectName); fs.ensureDirSync(projectName); writeJson.sync( path.join(projectRoot, "package.json"), @@ -119,7 +130,7 @@ module.exports = async function createProject({ }, { // Setup yarn - title: "Setup yarn", + title: "Setup Yarn", task: async () => { const yarnVersion = "3.6.4"; const yarnFile = `yarn-${yarnVersion}.cjs`; @@ -137,18 +148,22 @@ module.exports = async function createProject({ if (!fs.existsSync(source)) { throw new Error(`No yarn binary source file: ${source}`); } + const target = path.join(projectRoot, yarnReleasesFilePath); fs.copyFileSync(source, target); - const yamlPath = path.join(projectRoot, ".yarnrc.yml"); - if (!fs.existsSync(yamlPath)) { - fs.writeFileSync(yamlPath, `yarnPath: ${yarnReleasesFilePath}`, "utf-8"); + // `.yarnrc.yml` file is created here. + const yarnRcPath = path.join(projectRoot, ".yarnrc.yml"); + + let rawYarnRc = `yarnPath: ${yarnReleasesFilePath}`; + if (fs.existsSync(yarnRcPath)) { + rawYarnRc = fs.readFileSync(yarnRcPath, "utf-8"); } - const parsedYaml = yaml.load(fs.readFileSync(yamlPath, "utf-8")); + const parsedYarnRc = yaml.load(rawYarnRc); - // Default settings are applied here. Currently we only apply the `nodeLinker` param. - parsedYaml.nodeLinker = "node-modules"; + // Default settings are applied here. Currently, we only apply the `nodeLinker` param. + parsedYarnRc.nodeLinker = "node-modules"; // Enables adding additional params into the `.yarnrc.yml` file. if (assignToYarnRc) { @@ -162,15 +177,15 @@ module.exports = async function createProject({ } if (parsedAssignToYarnRc) { - Object.assign(parsedYaml, parsedAssignToYarnRc); + Object.assign(parsedYarnRc, parsedAssignToYarnRc); } } - fs.writeFileSync(yamlPath, yaml.dump(parsedYaml)); + fs.writeFileSync(yarnRcPath, yaml.dump(parsedYarnRc)); } }, { - // "yarn adds" given template which can be either a real package or a path of a local package. + // Yarn adds given template which can be either a real package or a path of a local package. title: `Install template package`, task: async context => { let add; @@ -179,6 +194,7 @@ module.exports = async function createProject({ if (template.startsWith(".") || template.startsWith("file:")) { templateName = "file:" + path.relative(projectName, template.replace("file:", "")); + templateName = `@webiny/cwp-template-aws@` + templateName; add = templateName; } else { add = `${templateName}@${tag}`; @@ -218,10 +234,9 @@ module.exports = async function createProject({ await tasks.run(context); let templateName = context.templateName; - - console.log(`Starting ${green(templateName)} template ...`); - if (templateName.startsWith("file:")) { - templateName = templateName.replace("file:", ""); + if (templateName.includes("file:")) { + const [, templatePath] = templateName.match(/.*?file\:(.*)/); + templateName = templatePath; } const templatePath = path.dirname( @@ -230,11 +245,7 @@ module.exports = async function createProject({ }) ); - await new Promise(resolve => { - setTimeout(() => { - resolve(); - }, 500); - }); + await sleep(); let parsedTemplateOptions = {}; if (templateOptions) { @@ -246,25 +257,36 @@ module.exports = async function createProject({ } console.log(); + await require(templatePath)({ log, isGitAvailable, projectName, projectRoot, interactive, + debug, templateOptions: parsedTemplateOptions }); await sendEvent({ event: "create-webiny-project-end" }); } catch (err) { - await sendEvent({ - event: "create-webiny-project-error", - properties: { - errorMessage: err.message, - errorStack: err.stack - } - }); - + if (err instanceof GracefulError) { + await sendEvent({ + event: "create-webiny-project-error-graceful", + properties: { + errorMessage: err.message, + errorStack: err.stack + } + }); + } else { + await sendEvent({ + event: "create-webiny-project-error", + properties: { + errorMessage: err.message, + errorStack: err.stack + } + }); + } const node = process.versions.node; const os = process.platform; @@ -311,18 +333,18 @@ module.exports = async function createProject({ console.log( [ "", - `${green("ERROR OUTPUT: ")}`, - "----------------------------------------", + `${bold("Error Logs")}`, + HL, err.message, "", - `${green("SYSTEM INFORMATION: ")}`, - "----------------------------------------", + `${bold("System Information")}`, + HL, + `create-webiny-project: ${cwp}`, `Operating System: ${os}`, `Node: ${node}`, `Yarn: ${yarn}`, `Npm: ${npm}`, `Npx: ${npx}`, - `create-webiny-project: ${cwp}`, `Template: ${cwpTemplate}`, `Template Options: ${templateOptionsJson}`, "", @@ -332,18 +354,17 @@ module.exports = async function createProject({ ].join("\n") ); - console.log(`Writing log to ${green(path.resolve(log))}...`); + console.log(`Writing logs to ${green(path.resolve(log))}...`); fs.writeFileSync(path.resolve(log), err.toString()); + console.log(); if (cleanup) { - console.log("Cleaning up generated files and folders..."); + console.log("Deleting created files and folders..."); rimraf.sync(projectRoot); - console.log("Done."); } else { console.log("Project cleanup skipped."); } - await sendEvent({ event: "create-webiny-project-end" }); process.exit(1); } }; diff --git a/packages/create-webiny-project/utils/gracefulYarnErrorHandlers/index.js b/packages/create-webiny-project/utils/gracefulYarnErrorHandlers/index.js new file mode 100644 index 00000000000..e0a30c5dfa3 --- /dev/null +++ b/packages/create-webiny-project/utils/gracefulYarnErrorHandlers/index.js @@ -0,0 +1 @@ +module.exports = []; diff --git a/packages/create-webiny-project/utils/checkProjectName.js b/packages/create-webiny-project/utils/validateProjectName.js similarity index 100% rename from packages/create-webiny-project/utils/checkProjectName.js rename to packages/create-webiny-project/utils/validateProjectName.js diff --git a/packages/cwp-template-aws/__tests__/telemetry.test.js b/packages/cwp-template-aws/__tests__/telemetry.test.js index ac0abe32ed1..9506a3467ed 100644 --- a/packages/cwp-template-aws/__tests__/telemetry.test.js +++ b/packages/cwp-template-aws/__tests__/telemetry.test.js @@ -3,7 +3,12 @@ const fs = require("fs-extra"); describe("Telemetry events test", () => { test("should send telemetry events", async () => { - const events = ["project-deploy-start", "project-deploy-end", "project-deploy-error"]; + const events = [ + "project-deploy-start", + "project-deploy-end", + "project-deploy-error", + "project-deploy-error-graceful" + ]; const deployScript = await fs.readFile( path.resolve(__dirname, "..", "cli", "deploy", "deploy.js") diff --git a/packages/cwp-template-aws/cli/deploy/deploy.js b/packages/cwp-template-aws/cli/deploy/deploy.js index fb847416002..274828e8015 100644 --- a/packages/cwp-template-aws/cli/deploy/deploy.js +++ b/packages/cwp-template-aws/cli/deploy/deploy.js @@ -1,165 +1,139 @@ -const fs = require("fs"); -const { green } = require("chalk"); -const { getStackOutput, getPulumi } = require("@webiny/cli-plugin-deploy-pulumi/utils"); -const { sendEvent, getApiProjectApplicationFolder } = require("@webiny/cli/utils"); -const path = require("path"); -const execa = require("execa"); +const { + getStackOutput, + getPulumi, + GracefulPulumiError +} = require("@webiny/cli-plugin-deploy-pulumi/utils"); +const { sendEvent } = require("@webiny/cli/utils"); +const { bold } = require("chalk"); +const deployCommand = require("@webiny/cli-plugin-deploy-pulumi/commands/deploy"); +const { getInfo } = require("../info"); const sleep = require("../utils/sleep"); +const open = require("open"); +const ora = require("ora"); -const deploy = (stack, env, inputs) => - execa( - "yarn", - [ - "webiny", - "deploy", - stack, - "--env", - env, - "--debug", - Boolean(inputs.debug), - "--build", - Boolean(inputs.build), - "--preview", - Boolean(inputs.preview) - ], +const deployApp = async ({ name, folder, inputs, context, isFirstDeployment }) => { + context.info(`Deploying %s project application...`, name); + console.log(); + + await deployCommand( { - stdio: "inherit" - } + ...inputs, + folder: folder, + env: inputs.env || "dev", + telemetry: false + }, + context ); -module.exports = async (inputs, context) => { - const { env = "dev" } = inputs; - - // 1. By calling the install manually here, we get to know if the installation was initiated or not. - const pulumi = await getPulumi({ install: false }); - - const installed = await pulumi.install(); - - // If we just installed Pulumi, let's add a new line. - installed && console.log(); - - // 2. Check if first deployment. - - // 2.1 Check the location of `api` project application (can be `api` or `apps/api`). - const apiFolder = getApiProjectApplicationFolder(context.project); - - // 2.2 We want to be backwards compatible. That's why we need to take into - // consideration that some projects do not have the `core` application. - const hasCore = fs.existsSync(path.join(context.project.root, "apps", "core")); - - // If we have at least `core` output or `api` output, - // then we can be sure this is not the first deployment. - let isFirstDeployment; - if (hasCore) { - isFirstDeployment = !getStackOutput({ folder: "apps/core", env }); - } else { - isFirstDeployment = !getStackOutput({ folder: apiFolder, env }); - } - - if (isFirstDeployment) { - context.info( - `This is your first time deploying the project (${green( - env - )} environment). Note that the initial deployment can take up to 15 minutes, so please be patient.` - ); + console.log(); + context.success(`%s project application deployed.`, name); + console.log(); - await sleep(); - } + isFirstDeployment && (await sleep()); +}; - // 3. Start deploying apps one-by-one. +module.exports = async (inputs, context) => { + await sendEvent("cli-project-deploy-start"); try { - await sendEvent({ event: "project-deploy-start" }); - - // Deploying `core` project application. - if (hasCore) { - isFirstDeployment && console.log(); - context.info(`Deploying ${green("Core")} project application...`); - - await deploy("apps/core", env, inputs); - context.success(`${green("Core")} project application was deployed successfully!`); - isFirstDeployment && (await sleep(2000)); + const { env = "dev" } = inputs; + + // 1. Check if Pulumi is installed. By calling the `install` method + // manually, we get to know if the installation was initiated or not. + const pulumi = await getPulumi({ install: false }); + const installed = await pulumi.install(); + + // If we just installed Pulumi, let's add a new line. + installed && console.log(); + + // 2. Check if first deployment. + const isFirstDeployment = !getStackOutput({ folder: "apps/core", env }); + if (isFirstDeployment) { + context.info(`Looks like this is your first time deploying the project.`); + context.info( + `Note that the initial deployment can take up to %s, so please be patient.`, + "15 minutes" + ); + await sleep(); } - // Deploying `api` project application. - console.log(); - context.info(`Deploying ${green("API")} project application...`); - - await deploy(apiFolder, env, inputs); - context.success(`${green("API")} project application was deployed successfully!`); - isFirstDeployment && (await sleep(2000)); - - // Deploying `apps/admin` project application. - console.log(); - context.info(`Deploying ${green("Admin")} project application...`); - isFirstDeployment && (await sleep()); + // 3. Start deploying apps one-by-one. + isFirstDeployment && console.log(); + + await deployApp({ name: "Core", folder: "apps/core", inputs, context, isFirstDeployment }); + await deployApp({ name: "API", folder: "apps/api", inputs, context, isFirstDeployment }); + await deployApp({ + name: "Admin", + folder: "apps/admin", + inputs, + context, + isFirstDeployment + }); + await deployApp({ + name: "Website", + folder: "apps/website", + inputs, + context, + isFirstDeployment + }); - await deploy("apps/admin", env, inputs); - context.success(`${green("Admin")} project application was deployed successfully!`); + if (isFirstDeployment) { + context.success(`Congratulations! You've just deployed a brand new project!`); + } else { + context.success(`Project deployed.`); + } - // Deploying `apps/admin` project application. + const projectDetails = await getInfo(env); console.log(); - context.info(`Deploying ${green("Website")} project application...`); - isFirstDeployment && (await sleep()); - - await deploy("apps/website", env, inputs); - context.success(`${green("Website")} project application was deployed successfully!`); + console.log(bold("Project Details")); + console.log(projectDetails); + + const adminAppOutput = getStackOutput({ folder: "apps/admin", env }); + + if (isFirstDeployment) { + console.log(); + context.info( + "The final step is to open the %s app in your browser and complete the installation wizard.", + "Admin" + ); + + const spinner = ora( + `Opening ${context.info.hl("Admin")} app in your browser...` + ).start(); + + try { + await sleep(7000); + await open(adminAppOutput.appUrl); + spinner.succeed( + `Successfully opened ${context.info.hl("Admin")} app in your browser.` + ); + } catch (e) { + spinner.fail(`Failed to open ${context.error.hl("Admin")} app in your browser.`); + + await sleep(1000); + console.log(); + context.warning( + `Failed to open %s app in your browser. To finish the setup and start using the project, please visit %s and complete the installation wizard.`, + "Admin", + adminAppOutput.appUrl + ); + } + } - await sendEvent({ event: "project-deploy-end" }); + await sendEvent("cli-project-deploy-end"); } catch (e) { - await sendEvent({ - event: "project-deploy-error", - properties: { + if (e instanceof GracefulPulumiError) { + await sendEvent("cli-project-deploy-error-graceful", { errorMessage: e.message, errorStack: e.stack - } - }); - - throw e; - } - - const outputs = { - api: getStackOutput({ folder: apiFolder, env }), - apps: { - admin: getStackOutput({ folder: "apps/admin", env }), - site: getStackOutput({ folder: "apps/website", env }) + }); + } else { + await sendEvent("cli-project-deploy-error", { + errorMessage: e.message, + errorStack: e.stack + }); } - }; - console.log(); - if (isFirstDeployment) { - console.log( - [ - `Congratulations! You've just deployed a brand new project (${green( - env - )} environment)!`, - "", - `To finish the setup, please open your ${green("Admin")} app (${green( - outputs.apps.admin.appUrl - )}) and complete the installation wizard. To learn more, visit ${green( - "https://www.webiny.com/docs" - )}.` - ].join("\n") - ); - } else { - const usefulLinks = [ - `➜ Main GraphQL API: ${green(outputs.api.apiUrl + "/graphql")}`, - `➜ Admin app: ${green(outputs.apps.admin.appUrl)}`, - `➜ Public website:`, - ` - Website URL: ${green(outputs.apps.site.deliveryUrl)}`, - ` - Website preview URL: ${green(outputs.apps.site.appUrl)}` - ].join("\n"); - - console.log( - [ - usefulLinks, - "", - `💡 Tip: to deploy project applications separately, use the ${green( - "deploy" - )} command (e.g. ${green( - `yarn webiny deploy website --env ${env}` - )}). For additional help, please run ${green("yarn webiny --help")}.` - ].join("\n") - ); + throw e; } }; diff --git a/packages/cwp-template-aws/cli/destroy/destroy.js b/packages/cwp-template-aws/cli/destroy/destroy.js index 6e1be3ea198..0dc254922ac 100644 --- a/packages/cwp-template-aws/cli/destroy/destroy.js +++ b/packages/cwp-template-aws/cli/destroy/destroy.js @@ -1,7 +1,6 @@ const fs = require("fs"); const { green } = require("chalk"); const { getPulumi } = require("@webiny/cli-plugin-deploy-pulumi/utils"); -const { getApiProjectApplicationFolder } = require("@webiny/cli/utils"); const path = require("path"); const execa = require("execa"); @@ -34,7 +33,6 @@ module.exports = async (inputs, context) => { pulumi.install(); - const apiFolder = getApiProjectApplicationFolder(context.project); const hasCore = fs.existsSync(path.join(context.project.root, "apps", "core")); console.log(); @@ -47,7 +45,7 @@ module.exports = async (inputs, context) => { console.log(); context.info(`Destroying ${green("API")} project application...`); - await destroy(apiFolder, env, inputs); + await destroy("apps/api", env, inputs); if (hasCore) { console.log(); diff --git a/packages/cwp-template-aws/cli/info/index.js b/packages/cwp-template-aws/cli/info/index.js index 4c181e23238..ae5415caf54 100644 --- a/packages/cwp-template-aws/cli/info/index.js +++ b/packages/cwp-template-aws/cli/info/index.js @@ -1,60 +1,77 @@ const getStackOutput = require("@webiny/cli-plugin-deploy-pulumi/utils/getStackOutput"); -const { green } = require("chalk"); const path = require("path"); +const { blue } = require("chalk"); -const line = `—————————————————————————`; - -const printEnvOutput = async (env, context) => { - console.log(line); - console.log(`Environment: ${green(env)}`); - console.log(line); - - let stacksDeployedCount = 0; - let output = getStackOutput({ folder: "apps/api", env }); - if (output) { - stacksDeployedCount++; - console.log( - [ - `‣ AWS Region: ${output.region}`, - `‣ Main GraphQL API: ${green(output.apiUrl + "/graphql")}`, - `‣ Headless CMS GraphQL API:`, - ` - Manage API: ${green(output.apiUrl + "/cms/manage/{LOCALE_CODE}")}`, - ` - Read API: ${green(output.apiUrl + "/cms/read/{LOCALE_CODE}")}`, - ` - Preview API: ${green(output.apiUrl + "/cms/preview/{LOCALE_CODE}")}` - ].join("\n") +const getInfo = async env => { + const apiOutputPromise = new Promise(resolve => { + resolve(getStackOutput({ folder: "apps/api", env })); + }); + + const adminOutputPromise = new Promise(resolve => { + resolve(getStackOutput({ folder: "apps/admin", env })); + }); + + const websiteOutputPromise = new Promise(resolve => { + resolve(getStackOutput({ folder: "apps/website", env })); + }); + + const outputs = await Promise.all([apiOutputPromise, adminOutputPromise, websiteOutputPromise]); + + const stacksDeployedCount = outputs.filter(Boolean).length; + + if (stacksDeployedCount === 0) { + return [ + "It seems none of the stacks were deployed, so no info could be provided.", + `Please check if the provided environment ${env} is correct.` + ]; + } + + const [api, admin, website] = outputs; + + const output = []; + + // API. + if (api) { + output.push( + `‣ Environment name: ${blue(env)}`, + `‣ AWS region: ${api?.region}`, + `‣ Main GraphQL API: ${api.apiUrl + "/graphql"}`, + `‣ Headless CMS GraphQL API:`, + ` · Manage API: ${api.apiUrl + "/cms/manage/{LOCALE_CODE}"}`, + ` · Read API: ${api.apiUrl + "/cms/read/{LOCALE_CODE}"}`, + ` · Preview API: ${api.apiUrl + "/cms/preview/{LOCALE_CODE}"}` ); } else { - context.info(`Stack ${green("apps/api")} not deployed yet.`); + output.push( + `‣ Environment name: -`, + `‣ AWS region: -`, + `‣ Main GraphQL API: -`, + `‣ Headless CMS GraphQL API:`, + ` · Manage API: -`, + ` · Read API: -`, + ` · Preview API: -` + ); } - output = getStackOutput({ folder: "apps/admin", env }); - if (output) { - stacksDeployedCount++; - console.log([`‣ Admin app: ${green(output.appUrl)}`].join("\n")); + // Admin. + if (admin) { + output.push(`‣ Admin app: ${admin.appUrl}`); } else { - context.info(`Stack ${green("apps/admin")} not deployed yet.`); + output.push(`‣ Admin app: -`); } - output = getStackOutput({ folder: "apps/website", env }); - if (output) { - stacksDeployedCount++; - console.log( - [ - `‣ Public website:`, - ` - Website URL: ${green(output.deliveryUrl)}`, - ` - Website preview URL: ${green(output.appUrl)}` - ].join("\n") + // Website. + if (website) { + output.push( + `‣ Public website:`, + ` · Website URL: ${website.deliveryUrl}`, + ` · Website preview URL: ${website.appUrl}` ); } else { - context.info(`Stack ${green("apps/website")} not deployed yet.`); + output.push(`‣ Public website:`, ` · Website URL: -`, ` · Website preview URL: -`); } - if (stacksDeployedCount === 0) { - context.info("It seems none of the stacks were deployed, so no info could be provided."); - context.info(`Please check if the provided environment ${green(env)} is correct.`); - } - - console.log(line + "\n"); + return output.join("\n"); }; module.exports = { @@ -96,15 +113,40 @@ module.exports = { path.basename(current, ".json") ); - for (const env of existingEnvs) { - await printEnvOutput(env, context); + if (existingEnvs.length === 0) { + context.info( + "It seems that no environments have been deployed yet. Please deploy the project first." + ); + return; } - return; + if (existingEnvs.length === 1) { + context.info("There is one deployed environment."); + context.info("Here is the information for the environment."); + } else { + context.info( + "There's a total of %d deployed environments.", + existingEnvs.length + ); + context.info("Here is the information for each environment."); + console.log(); + } + + for (const env of existingEnvs) { + console.log(await getInfo(env, context)); + console.log(); + } + } else { + await getInfo(env, context); } - await printEnvOutput(env, context); + context.info( + "If some of the information is missing for a particular environment, make sure that the project has been fully deployed into that environment. You can do that by running the %s command.", + "yarn webiny deploy --env {ENVIRONMENT_NAME}" + ); } ); } }; + +module.exports.getInfo = getInfo; diff --git a/packages/cwp-template-aws/index.js b/packages/cwp-template-aws/index.js index 0606637d999..79bcbc8dd0e 100644 --- a/packages/cwp-template-aws/index.js +++ b/packages/cwp-template-aws/index.js @@ -18,7 +18,7 @@ const runInquirer = async cwp => { } console.log( - "In order to setup your new Webiny project, please answer the following questions." + "In order to create your new Webiny project, please answer the following questions." ); console.log(); @@ -27,7 +27,7 @@ const runInquirer = async cwp => { type: "list", name: "region", default: "us-east-1", - message: "Please choose the AWS region in which your new project will be deployed:", + message: "Please choose the AWS region in which your project will be deployed:", // Some of the regions might be commented out (not all service supported). choices: [ { value: "us-east-1", name: "us-east-1 (US East, N. Virginia)" }, @@ -56,7 +56,7 @@ const runInquirer = async cwp => { type: "list", name: "storageOperations", default: "ddb", - message: `Please choose the database setup you wish to use with your Webiny project (cannot be changed later):`, + message: `Please choose the database setup you wish to use with your project (cannot be changed later):`, choices: Object.values(choices) } ]); diff --git a/packages/cwp-template-aws/package.json b/packages/cwp-template-aws/package.json index b2407028876..4373144966c 100644 --- a/packages/cwp-template-aws/package.json +++ b/packages/cwp-template-aws/package.json @@ -23,7 +23,9 @@ "load-json-file": "6.2.0", "lodash": "4.17.21", "open": "^8.4.0", - "write-json-file": "4.3.0" + "ora": "4.1.1", + "write-json-file": "4.3.0", + "yesno": "^0.4.0" }, "devDependencies": { "dotenv": "^8.2.0" diff --git a/packages/cwp-template-aws/setup.js b/packages/cwp-template-aws/setup.js index d1902adc204..657ec891b5a 100644 --- a/packages/cwp-template-aws/setup.js +++ b/packages/cwp-template-aws/setup.js @@ -7,7 +7,9 @@ const merge = require("lodash/merge"); const writeJsonFile = require("write-json-file"); const loadJsonFile = require("load-json-file"); const getPackages = require("get-yarn-workspaces"); -const { green } = require("chalk"); +const { green, yellow, bold } = require("chalk"); +const yesno = require("yesno"); +const ora = require("ora"); const IS_TEST = process.env.NODE_ENV === "test"; @@ -78,8 +80,18 @@ const setup = async args => { if (!IS_TEST && isGitAvailable) { // Commit .gitignore. - execa.sync("git", ["add", ".gitignore"], { cwd: projectRoot }); - execa.sync("git", ["commit", "-m", `chore: initialize .gitignore`], { cwd: projectRoot }); + try { + execa.sync("git", ["add", ".gitignore"], { cwd: projectRoot }); + execa.sync("git", ["commit", "-m", `chore: initialize .gitignore`], { + cwd: projectRoot + }); + } catch (e) { + console.log( + yellow( + "Failed to commit .gitignore. You will have to do it manually once the project is created." + ) + ); + } } const rootEnvFilePath = path.join(projectRoot, ".env"); @@ -114,47 +126,87 @@ const setup = async args => { } if (!IS_TEST) { - console.log(`⏳ Installing dependencies....`); - console.log(); // Install dependencies. - const options = { - cwd: projectRoot, - maxBuffer: "500_000_000", - stdio: "inherit" - }; - + console.log(); + const spinner = ora("Installing packages...").start(); try { - await execa("yarn", [], options); + const subprocess = execa("yarn", [], { + cwd: projectRoot, + maxBuffer: "500_000_000" + }); + await subprocess; + spinner.succeed("Packages installed successfully."); } catch (e) { + spinner.fail("Failed to install packages."); + + console.log(e.message); + throw new Error( - "Failed while installing project dependencies. Please check the above logs for more information." + "Failed while installing project dependencies. Please check the above Yarn logs for more information." ); } } - if (!IS_TEST) { - console.log( - [ - "", - `🎉 Your new Webiny project ${green(projectName)} is ready!`, - "", - `Finish the setup by running the following command: ${green( - `cd ${projectName} && yarn webiny deploy` - )}`, - "", - `To see all of the available CLI commands, run ${green( - "yarn webiny --help" - )} in your ${green(projectName)} directory.`, - "", - "Want to dive deeper into Webiny? Check out https://webiny.com/docs/!", - "Like the project? Star us on https://github.com/webiny/webiny-js!", - "", - "Need help? Join our Slack community! https://www.webiny.com/slack", - "", - "🚀 Happy coding!" - ].join("\n") - ); + if (IS_TEST) { + return; } + + console.log(); + console.log( + `🎉 Your new Webiny project ${green( + projectName + )} has been created and is ready to be deployed for the first time!` + ); + console.log(); + + const ok = await yesno({ + question: bold(`${green("?")} Would you like to deploy your project now (Y/n)?`), + defaultValue: true + }); + + console.log(); + + if (ok) { + console.log("🚀 Deploying your new Webiny project..."); + console.log(); + + try { + const command = ["webiny", "deploy"]; + if (args.debug) { + command.push("--debug"); + } + + await execa("yarn", command, { + cwd: projectRoot, + stdio: "inherit" + }); + } catch { + // Don't do anything. This is because the `webiny deploy` command has its own + // error handling and will print the error message. As far as this setup script + // is concerned, it succeeded, and it doesn't need to do anything else. + } + + return; + } + + console.log( + [ + `Finish the setup by running the following command: ${green( + `cd ${projectName} && yarn webiny deploy` + )}`, + "", + `To see all of the available CLI commands, run ${green( + "yarn webiny --help" + )} in your ${green(projectName)} directory.`, + "", + "Want to dive deeper into Webiny? Check out https://webiny.com/docs/!", + "Like the project? Star us on https://github.com/webiny/webiny-js!", + "", + "Need help? Join our Slack community! https://www.webiny.com/slack", + "", + "🚀 Happy coding!" + ].join("\n") + ); }; module.exports = setup; diff --git a/packages/feature-flags/src/index.ts b/packages/feature-flags/src/index.ts index 73ec6ff107a..8adf5c50cb6 100644 --- a/packages/feature-flags/src/index.ts +++ b/packages/feature-flags/src/index.ts @@ -1,7 +1,6 @@ export type FeatureFlags> = { copyPermissionsButton?: boolean; experimentalAdminOmniSearch?: boolean; - pbLegacyRenderingEngine?: boolean; allowCmsLegacyRichTextInput?: boolean; } & TFeatureFlags; diff --git a/packages/global-config/index.d.ts b/packages/global-config/index.d.ts new file mode 100644 index 00000000000..6966810ef1e --- /dev/null +++ b/packages/global-config/index.d.ts @@ -0,0 +1,6 @@ +export interface GlobalConfig { + get(key: string): any; + set(key: string, value: any): void; +} + +export declare const globalConfig: GlobalConfig; diff --git a/packages/global-config/index.js b/packages/global-config/index.js index 1d4f01a16f6..0dc1bf266de 100644 --- a/packages/global-config/index.js +++ b/packages/global-config/index.js @@ -18,7 +18,15 @@ module.exports.globalConfig = { } } catch (e) { // A new config file is written if it doesn't exist or is invalid. - this.__globalConfig = { id: uuidv4(), telemetry: true }; + this.__globalConfig = { + id: uuidv4(), + telemetry: true, + + // This flag is set to `false` the moment user successfully + // deploys a Webiny project for the first time. Once they do, + // they're considered no longer a "new user". + newUser: true + }; writeJson.sync(GLOBAL_CONFIG_PATH, this.__globalConfig); } diff --git a/packages/project-utils/bundling/app/buildApp.js b/packages/project-utils/bundling/app/buildApp.js index af54e565bc1..7100993c20c 100644 --- a/packages/project-utils/bundling/app/buildApp.js +++ b/packages/project-utils/bundling/app/buildApp.js @@ -117,11 +117,11 @@ module.exports = async options => { ); printBuildError(err); } else { - log(err); log(chalk.red("Failed to compile.\n")); printBuildError(err); - process.exit(1); } + + throw err; } }; diff --git a/packages/project-utils/bundling/app/config/webpack.config.js b/packages/project-utils/bundling/app/config/webpack.config.js index 4a750fd3568..181093a76f4 100644 --- a/packages/project-utils/bundling/app/config/webpack.config.js +++ b/packages/project-utils/bundling/app/config/webpack.config.js @@ -528,7 +528,6 @@ module.exports = function (webpackEnv, { paths, options }) { }, async: isEnvDevelopment }), - logs && new WebpackBar({ name: path.basename(paths.appPath) }) ].filter(Boolean), diff --git a/packages/project-utils/bundling/app/utils.js b/packages/project-utils/bundling/app/utils.js index 7343a76c6e2..4b4af5fb37d 100644 --- a/packages/project-utils/bundling/app/utils.js +++ b/packages/project-utils/bundling/app/utils.js @@ -2,6 +2,7 @@ const { version } = require("@webiny/project-utils/package.json"); const { getProject } = require("@webiny/cli/utils"); const { isEnabled } = require("@webiny/telemetry/cli"); const { globalConfig } = require("@webiny/global-config"); +const isCI = require("is-ci"); module.exports.applyDefaults = () => { let telemetry; @@ -17,18 +18,27 @@ module.exports.applyDefaults = () => { process.env.REACT_APP_WCP_PROJECT_ID = wcpProjectId; } - if (!("REACT_APP_USER_ID" in process.env)) { - process.env.REACT_APP_USER_ID = globalConfig.get("id"); - } - if (!("REACT_APP_WEBINY_TELEMETRY" in process.env)) { process.env.REACT_APP_WEBINY_TELEMETRY = String(telemetry); } + if (!("REACT_APP_WEBINY_TELEMETRY_USER_ID" in process.env)) { + process.env.REACT_APP_WEBINY_TELEMETRY_USER_ID = globalConfig.get("id"); + } + + if (!("REACT_APP_WEBINY_TELEMETRY_NEW_USER" in process.env)) { + const newUser = Boolean(globalConfig.get("newUser")).toString(); + process.env.REACT_APP_WEBINY_TELEMETRY_NEW_USER = newUser; + } + if (!("INLINE_RUNTIME_CHUNK" in process.env)) { process.env.INLINE_RUNTIME_CHUNK = "true"; } + if (!("REACT_APP_IS_CI" in process.env)) { + process.env.REACT_APP_IS_CI = Boolean(isCI).toString(); + } + if (!("REACT_APP_WEBINY_VERSION" in process.env)) { process.env.REACT_APP_WEBINY_VERSION = process.env.WEBINY_VERSION || version; } diff --git a/packages/project-utils/bundling/function/buildFunction.js b/packages/project-utils/bundling/function/buildFunction.js index fc7684ebdd7..d85564aa3e7 100644 --- a/packages/project-utils/bundling/function/buildFunction.js +++ b/packages/project-utils/bundling/function/buildFunction.js @@ -1,12 +1,7 @@ const formatWebpackMessages = require("react-dev-utils/formatWebpackMessages"); -const { getDuration } = require("../../utils"); -const chalk = require("chalk"); const { getProjectApplication } = require("@webiny/cli/utils"); module.exports = async options => { - const duration = getDuration(); - const path = require("path"); - const { overrides, logs, cwd, debug } = options; let projectApplication; @@ -16,8 +11,6 @@ module.exports = async options => { // No need to do anything. } - logs && console.log(`Compiling ${chalk.green(path.basename(cwd))}...`); - let webpackConfig = require("./webpack.config")({ production: !debug, projectApplication, @@ -32,7 +25,7 @@ module.exports = async options => { const webpack = require("webpack"); return new Promise(async (resolve, reject) => { - return webpack(webpackConfig).run(async (err, stats) => { + webpack(webpackConfig).run(async (err, stats) => { let messages = {}; if (err) { @@ -41,8 +34,9 @@ module.exports = async options => { warnings: [] }); - console.error(messages.errors.join("\n\n")); - return reject(); + const errorMessages = messages.errors.join("\n\n"); + console.error(errorMessages); + return reject(new Error(errorMessages)); } if (stats.hasErrors()) { @@ -62,11 +56,13 @@ module.exports = async options => { messages.errors.length = 1; } - console.error(messages.errors.join("\n\n")); - return reject(); + const errorMessages = messages.errors.join("\n\n"); + console.error(errorMessages); + reject(new Error(errorMessages)); + return; } - logs && console.log(`Compiled successfully in ${chalk.green(duration()) + "s"}.`); + logs && console.log(`Compiled successfully.`); resolve(); }); }); diff --git a/packages/project-utils/bundling/function/buildFunctionWithDll/buildFunctionWithDll.js b/packages/project-utils/bundling/function/buildFunctionWithDll/buildFunctionWithDll.js index fde6bfc835e..afbeb0fd83c 100644 --- a/packages/project-utils/bundling/function/buildFunctionWithDll/buildFunctionWithDll.js +++ b/packages/project-utils/bundling/function/buildFunctionWithDll/buildFunctionWithDll.js @@ -1,5 +1,4 @@ const formatWebpackMessages = require("react-dev-utils/formatWebpackMessages"); -const { getDuration } = require("../../../utils"); const chalk = require("chalk"); const path = require("path"); const { getProjectApplication } = require("@webiny/cli/utils"); @@ -44,7 +43,6 @@ function applyOverrides(webpackConfig, options) { } function buildConfig(config, options) { - const duration = getDuration(); const webpack = require("webpack"); return new Promise(async (resolve, reject) => { return webpack(config).run(async (err, stats) => { @@ -81,8 +79,7 @@ function buildConfig(config, options) { return reject(); } - options.logs && - console.log(`Compiled successfully in ${chalk.green(duration()) + "s"}.`); + options.logs && console.log(`Compiled successfully.`); resolve(); }); }); diff --git a/packages/project-utils/bundling/function/utils.js b/packages/project-utils/bundling/function/utils.js index 55f4f8fe890..72200639c92 100644 --- a/packages/project-utils/bundling/function/utils.js +++ b/packages/project-utils/bundling/function/utils.js @@ -2,7 +2,7 @@ const path = require("path"); const getDefaults = ({ cwd, projectApplication }) => { let outputPath = path.join(cwd, "build"); - if (projectApplication && projectApplication.type === "v5-workspaces") { + if (projectApplication) { outputPath = path.join( projectApplication.paths.workspace, path.relative(projectApplication.paths.absolute, cwd), diff --git a/packages/project-utils/bundling/function/watchFunction.js b/packages/project-utils/bundling/function/watchFunction.js index 22fccbf6f45..8dfd6fca0de 100644 --- a/packages/project-utils/bundling/function/watchFunction.js +++ b/packages/project-utils/bundling/function/watchFunction.js @@ -1,3 +1,4 @@ +const WebpackBar = require("webpackbar"); const { getProjectApplication } = require("@webiny/cli/utils"); module.exports = async options => { @@ -30,6 +31,18 @@ module.exports = async options => { webpackConfig = overrides.webpack(webpackConfig); } + // We remove the WebpackBar plugin, as it's not needed in watch mode. This is mostly + // because of the fact that, usually, when working on AWS Lambda function code, you're + // also redeploying the function. When watching with deployments enabled, we're showing + // our special watch command output, where Webpackbar doesn't work well. + const webpackBarPluginIndex = webpackConfig.plugins.findIndex( + plugin => plugin instanceof WebpackBar + ); + const usesWebpackBar = webpackBarPluginIndex > -1; + if (usesWebpackBar) { + webpackConfig.plugins.splice(webpackBarPluginIndex, 1); + } + return new Promise(async (resolve, reject) => { options.logs && console.log("Compiling..."); return webpack(webpackConfig).watch({}, async (err, stats) => { diff --git a/packages/project-utils/bundling/function/webpack.config.js b/packages/project-utils/bundling/function/webpack.config.js index 046ee022d70..0e793bad8d4 100644 --- a/packages/project-utils/bundling/function/webpack.config.js +++ b/packages/project-utils/bundling/function/webpack.config.js @@ -1,14 +1,9 @@ const path = require("path"); -const fs = require("fs"); const webpack = require("webpack"); const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin"); const { version } = require("@webiny/project-utils/package.json"); const { getOutput, getEntry } = require("./utils"); - -const isPre529 = () => { - const { cli } = require("@webiny/cli"); - return fs.existsSync(cli.resolve("api")); -}; +const WebpackBar = require("webpackbar"); module.exports = options => { const output = getOutput(options); @@ -51,7 +46,6 @@ module.exports = options => { }, plugins: [ new webpack.DefinePlugin({ - "process.env.WEBINY_IS_PRE_529": JSON.stringify(String(isPre529())), "process.env.WEBINY_VERSION": JSON.stringify(process.env.WEBINY_VERSION || version), ...definitions }), @@ -69,8 +63,8 @@ module.exports = options => { typescriptPath: require.resolve("typescript") }, async: !production - }) - // options.logs && new WebpackBar({ name: path.basename(cwd) }) + }), + options.logs && new WebpackBar({ name: path.basename(cwd) }) ].filter(Boolean), // Run babel on all .js files and skip those in node_modules module: { diff --git a/packages/project-utils/package.json b/packages/project-utils/package.json index 9b099354a96..b02b37b56e3 100644 --- a/packages/project-utils/package.json +++ b/packages/project-utils/package.json @@ -46,6 +46,7 @@ "get-yarn-workspaces": "1.0.2", "glob": "^7.1.2", "html-webpack-plugin": "5.5.0", + "is-ci": "^3.0.0", "lodash": "4.17.21", "mini-css-extract-plugin": "2.4.5", "null-loader": "^4.0.1", @@ -80,7 +81,7 @@ "webpack": "^5.90.0", "webpack-dev-server": "^4.6.0", "webpack-manifest-plugin": "^4.0.2", - "webpackbar": "5.0.2" + "webpackbar": "^6.0.0" }, "devDependencies": { "@elastic/elasticsearch": "7.12.0", diff --git a/packages/pulumi-aws/src/apps/api/ApiWebsocket.ts b/packages/pulumi-aws/src/apps/api/ApiWebsocket.ts index adef55bc347..b44d255320d 100644 --- a/packages/pulumi-aws/src/apps/api/ApiWebsocket.ts +++ b/packages/pulumi-aws/src/apps/api/ApiWebsocket.ts @@ -96,21 +96,6 @@ export const ApiWebsocket = createAppModule({ } }); - const deployment = app.addResource(aws.apigatewayv2.Deployment, { - name: "websocket-api-deployment", - config: { - apiId: websocketApi.output.id, - description: "WebSocket API Deployment" - }, - opts: { - dependsOn: [ - websocketApiDefaultRoute.output, - websocketApiConnectRoute.output, - websocketApiDisconnectRoute.output - ] - } - }); - const apiGatewayLoggingRole = app.addResource(aws.iam.Role, { name: "apiGatewayLoggingRole", config: { @@ -141,10 +126,13 @@ export const ApiWebsocket = createAppModule({ name: "websocket-api-stage", config: { apiId: websocketApi.output.id, - deploymentId: deployment.output.id, + autoDeploy: true, name: app.params.run.env, defaultRouteSettings: { - loggingLevel: "INFO", + // Only enable when debugging. Note that by default, API Gateway does not + // have the required permissions to write logs to CloudWatch logs. More: + // https://coady.tech/aws-cloudwatch-logs-arn/ + // loggingLevel: "INFO", throttlingBurstLimit: 1000, throttlingRateLimit: 500 } @@ -160,7 +148,6 @@ export const ApiWebsocket = createAppModule({ websocketLambdaPermission, lambdaWebsocketPolicy, lambdaWebsocketRolePolicyAttachment, - deployment, websocketApiUrl: pulumi.interpolate`${websocketApi.output.apiEndpoint}/${websocketApiStage.output.name}` }; } diff --git a/packages/serverless-cms-aws/package.json b/packages/serverless-cms-aws/package.json index 4a74ba2d969..f13e2351d5a 100644 --- a/packages/serverless-cms-aws/package.json +++ b/packages/serverless-cms-aws/package.json @@ -48,7 +48,7 @@ "@webiny/cli-plugin-deploy-pulumi": "0.0.0", "@webiny/data-migration": "0.0.0", "@webiny/db-dynamodb": "0.0.0", - "@webiny/feature-flags": "0.0.0", + "@webiny/global-config": "0.0.0", "@webiny/handler-aws": "0.0.0", "@webiny/handler-db": "0.0.0", "@webiny/handler-logs": "0.0.0", diff --git a/packages/serverless-cms-aws/src/admin/plugins/ensureApiDeployed.ts b/packages/serverless-cms-aws/src/admin/plugins/ensureApiDeployed.ts new file mode 100644 index 00000000000..d388bb6d907 --- /dev/null +++ b/packages/serverless-cms-aws/src/admin/plugins/ensureApiDeployed.ts @@ -0,0 +1,24 @@ +import { getStackOutput } from "@webiny/cli-plugin-deploy-pulumi/utils"; +import { BeforeDeployPlugin } from "@webiny/cli-plugin-deploy-pulumi/plugins"; +import { GracefulError } from "@webiny/cli-plugin-deploy-pulumi/utils"; + +export const ensureApiDeployed = new BeforeDeployPlugin(({ env }, ctx) => { + const output = getStackOutput({ folder: "apps/api", env }); + const apiDeployed = output && Object.keys(output).length > 0; + if (apiDeployed) { + return; + } + + const apiAppName = ctx.error.hl("API"); + const adminAppName = ctx.error.hl("Admin"); + const cmd = ctx.error.hl(`yarn webiny deploy api --env ${env}`); + + throw new GracefulError( + [ + `Cannot deploy ${adminAppName} project application before deploying ${apiAppName}.`, + `Please deploy ${apiAppName} project application first by running: ${cmd}.` + ].join(" ") + ); +}); + +ensureApiDeployed.name = "api.before-deploy.ensure-api-deployed"; diff --git a/packages/serverless-cms-aws/src/admin/plugins/index.ts b/packages/serverless-cms-aws/src/admin/plugins/index.ts new file mode 100644 index 00000000000..41a124eddfc --- /dev/null +++ b/packages/serverless-cms-aws/src/admin/plugins/index.ts @@ -0,0 +1 @@ +export * from "./ensureApiDeployed"; diff --git a/packages/serverless-cms-aws/src/api/plugins/ensureCoreDeployed.ts b/packages/serverless-cms-aws/src/api/plugins/ensureCoreDeployed.ts new file mode 100644 index 00000000000..1a249d8b5b6 --- /dev/null +++ b/packages/serverless-cms-aws/src/api/plugins/ensureCoreDeployed.ts @@ -0,0 +1,24 @@ +import { getStackOutput } from "@webiny/cli-plugin-deploy-pulumi/utils"; +import { BeforeDeployPlugin } from "@webiny/cli-plugin-deploy-pulumi/plugins"; +import { GracefulError } from "@webiny/cli-plugin-deploy-pulumi/utils"; + +export const ensureCoreDeployed = new BeforeDeployPlugin(({ env }, ctx) => { + const output = getStackOutput({ folder: "apps/core", env }); + const coreDeployed = output && Object.keys(output).length > 0; + if (coreDeployed) { + return; + } + + const coreAppName = ctx.error.hl("Core"); + const apiAppName = ctx.error.hl("API"); + const cmd = ctx.error.hl(`yarn webiny deploy core --env ${env}`); + + throw new GracefulError( + [ + `Cannot deploy ${apiAppName} project application before deploying ${coreAppName}.`, + `Please deploy ${coreAppName} project application first by running: ${cmd}.` + ].join(" ") + ); +}); + +ensureCoreDeployed.name = "api.before-deploy.ensure-core-deployed"; diff --git a/packages/serverless-cms-aws/src/api/plugins/index.ts b/packages/serverless-cms-aws/src/api/plugins/index.ts index be0572acd04..c070a135eb6 100644 --- a/packages/serverless-cms-aws/src/api/plugins/index.ts +++ b/packages/serverless-cms-aws/src/api/plugins/index.ts @@ -1,3 +1,4 @@ +export * from "./ensureCoreDeployed"; export * from "./generateDdbHandlers"; export * from "./generateDdbEsHandlers"; export * from "./generateCommonHandlers"; diff --git a/packages/serverless-cms-aws/src/createAdminApp.ts b/packages/serverless-cms-aws/src/createAdminApp.ts index 1c32ba3318d..d6295e8e5df 100644 --- a/packages/serverless-cms-aws/src/createAdminApp.ts +++ b/packages/serverless-cms-aws/src/createAdminApp.ts @@ -1,17 +1,14 @@ import { createAdminPulumiApp, CreateAdminPulumiAppParams } from "@webiny/pulumi-aws"; import { uploadAppToS3 } from "./react/plugins"; +import { ensureApiDeployed } from "./admin/plugins"; import { PluginCollection } from "@webiny/plugins/types"; -import { pbLegacyRenderingWarningPlugins } from "~/utils/pbLegacyRenderingWarning"; export interface CreateAdminAppParams extends CreateAdminPulumiAppParams { plugins?: PluginCollection; } export function createAdminApp(projectAppParams: CreateAdminAppParams = {}) { - const builtInPlugins = [ - uploadAppToS3({ folder: "apps/admin" }), - ...pbLegacyRenderingWarningPlugins - ]; + const builtInPlugins = [uploadAppToS3({ folder: "apps/admin" }), ensureApiDeployed]; const customPlugins = projectAppParams.plugins ? [...projectAppParams.plugins] : []; diff --git a/packages/serverless-cms-aws/src/createApiApp.ts b/packages/serverless-cms-aws/src/createApiApp.ts index 90c45d4587d..999f34d58b7 100644 --- a/packages/serverless-cms-aws/src/createApiApp.ts +++ b/packages/serverless-cms-aws/src/createApiApp.ts @@ -1,6 +1,7 @@ import { createApiPulumiApp, CreateApiPulumiAppParams } from "@webiny/pulumi-aws"; import { PluginCollection } from "@webiny/plugins/types"; import { + ensureCoreDeployed, executeDataMigrations, generateCommonHandlers, generateDdbHandlers, @@ -16,6 +17,7 @@ export interface CreateApiAppParams extends CreateApiPulumiAppParams { export function createApiApp(projectAppParams: CreateApiAppParams = {}) { const builtInPlugins = [ + ensureCoreDeployed, injectWcpTelemetryClientCode, generateCommonHandlers, executeDataMigrations diff --git a/packages/serverless-cms-aws/src/createWebsiteApp.ts b/packages/serverless-cms-aws/src/createWebsiteApp.ts index 8ae8bb8ca84..21439c64824 100644 --- a/packages/serverless-cms-aws/src/createWebsiteApp.ts +++ b/packages/serverless-cms-aws/src/createWebsiteApp.ts @@ -1,8 +1,12 @@ import { createWebsitePulumiApp, CreateWebsitePulumiAppParams } from "@webiny/pulumi-aws"; import { PluginCollection } from "@webiny/plugins/types"; -import { generateCommonHandlers, lambdaEdgeWarning, renderWebsite } from "./website/plugins"; +import { + generateCommonHandlers, + lambdaEdgeWarning, + renderWebsite, + telemetryNoLongerNewUser +} from "./website/plugins"; import { uploadAppToS3 } from "./react/plugins"; -import { pbLegacyRenderingWarningPlugins } from "~/utils/pbLegacyRenderingWarning"; export interface CreateWebsiteAppParams extends CreateWebsitePulumiAppParams { plugins?: PluginCollection; @@ -12,9 +16,9 @@ export function createWebsiteApp(projectAppParams: CreateWebsiteAppParams = {}) const builtInPlugins = [ uploadAppToS3({ folder: "apps/website" }), generateCommonHandlers, + lambdaEdgeWarning, renderWebsite, - pbLegacyRenderingWarningPlugins, - lambdaEdgeWarning + telemetryNoLongerNewUser ]; const customPlugins = projectAppParams.plugins ? [...projectAppParams.plugins] : []; diff --git a/packages/serverless-cms-aws/src/enterprise/createAdminApp.ts b/packages/serverless-cms-aws/src/enterprise/createAdminApp.ts index c73d8a33fa3..f9461ec520e 100644 --- a/packages/serverless-cms-aws/src/enterprise/createAdminApp.ts +++ b/packages/serverless-cms-aws/src/enterprise/createAdminApp.ts @@ -1,17 +1,13 @@ import { createAdminPulumiApp, CreateAdminPulumiAppParams } from "@webiny/pulumi-aws/enterprise"; import { uploadAppToS3 } from "~/react/plugins"; import { PluginCollection } from "@webiny/plugins/types"; -import { pbLegacyRenderingWarningPlugins } from "~/utils/pbLegacyRenderingWarning"; export interface CreateAdminAppParams extends CreateAdminPulumiAppParams { plugins?: PluginCollection; } export function createAdminApp(projectAppParams: CreateAdminAppParams = {}) { - const builtInPlugins = [ - uploadAppToS3({ folder: "apps/admin" }), - ...pbLegacyRenderingWarningPlugins - ]; + const builtInPlugins = [uploadAppToS3({ folder: "apps/admin" })]; const customPlugins = projectAppParams.plugins ? [...projectAppParams.plugins] : []; diff --git a/packages/serverless-cms-aws/src/enterprise/createWebsiteApp.ts b/packages/serverless-cms-aws/src/enterprise/createWebsiteApp.ts index 6b891fb29a1..a337f1a9c4f 100644 --- a/packages/serverless-cms-aws/src/enterprise/createWebsiteApp.ts +++ b/packages/serverless-cms-aws/src/enterprise/createWebsiteApp.ts @@ -5,7 +5,6 @@ import { import { PluginCollection } from "@webiny/plugins/types"; import { generateCommonHandlers, lambdaEdgeWarning, renderWebsite } from "~/website/plugins"; import { uploadAppToS3 } from "~/react/plugins"; -import { pbLegacyRenderingWarningPlugins } from "~/utils/pbLegacyRenderingWarning"; export interface CreateWebsiteAppParams extends CreateWebsitePulumiAppParams { plugins?: PluginCollection; @@ -16,7 +15,6 @@ export function createWebsiteApp(projectAppParams: CreateWebsiteAppParams = {}) uploadAppToS3({ folder: "apps/website" }), generateCommonHandlers, renderWebsite, - pbLegacyRenderingWarningPlugins, lambdaEdgeWarning ]; diff --git a/packages/serverless-cms-aws/src/utils/pbLegacyRenderingWarning.ts b/packages/serverless-cms-aws/src/utils/pbLegacyRenderingWarning.ts deleted file mode 100644 index 076373b5fbb..00000000000 --- a/packages/serverless-cms-aws/src/utils/pbLegacyRenderingWarning.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { CliContext } from "@webiny/cli/types"; -import { featureFlags } from "@webiny/feature-flags"; - -// @deprecation-warning pb-legacy-rendering-engine -export const isLegacyRenderingEngine = featureFlags.pbLegacyRenderingEngine === true; - -const DOCS_LINK = "https://webiny.link/pb-legacy-rendering-deprecation"; - -const hook = async (_: Record, context: CliContext) => { - if (isLegacyRenderingEngine) { - const message = [ - "It seems that the Webiny's Page Builder legacy rendering engine is still enabled", - `(detected %s in %s file).`, - "With 5.37.0 version of Webiny, the legacy rendering engine has been fully deprecated.", - `Learn more: ${DOCS_LINK}.` - ].join(" "); - - console.log(); - context.warning(message, "pbLegacyRenderingWarningPlugins: true", "webiny.project.ts"); - console.log(); - - await new Promise(resolve => { - setTimeout(resolve, 5000); - }); - } -}; - -export const pbLegacyRenderingWarningPlugins = [ - { - type: "hook-before-watch", - name: "hook-before-watch-pb-legacy-rendering-warning", - hook - }, - { - type: "hook-before-build", - name: "hook-before-build-pb-legacy-rendering-warning", - hook - } -]; diff --git a/packages/serverless-cms-aws/src/website/plugins/index.ts b/packages/serverless-cms-aws/src/website/plugins/index.ts index 563a69913c0..dc629d4e880 100644 --- a/packages/serverless-cms-aws/src/website/plugins/index.ts +++ b/packages/serverless-cms-aws/src/website/plugins/index.ts @@ -1,3 +1,4 @@ export * from "./renderWebsite"; export * from "./generateCommonHandlers"; export * from "./lambdaEdgeWarning"; +export * from "./telemetryNoLongerNewUser"; diff --git a/packages/serverless-cms-aws/src/website/plugins/telemetryNoLongerNewUser.ts b/packages/serverless-cms-aws/src/website/plugins/telemetryNoLongerNewUser.ts new file mode 100644 index 00000000000..903837b3795 --- /dev/null +++ b/packages/serverless-cms-aws/src/website/plugins/telemetryNoLongerNewUser.ts @@ -0,0 +1,12 @@ +import { globalConfig } from "@webiny/global-config"; +import { AfterDeployPlugin } from "@webiny/cli-plugin-deploy-pulumi/plugins"; + +export const telemetryNoLongerNewUser = new AfterDeployPlugin(params => { + // If for some reason the deployment was skipped, we don't want to mark the user as no longer new. + if (params.inputs.deploy === false) { + return; + } + + // Mark the user as no longer new. + globalConfig.set("newUser", false); +}); diff --git a/packages/serverless-cms-aws/tsconfig.build.json b/packages/serverless-cms-aws/tsconfig.build.json index 36b5a0cc310..81e05620b36 100644 --- a/packages/serverless-cms-aws/tsconfig.build.json +++ b/packages/serverless-cms-aws/tsconfig.build.json @@ -34,7 +34,6 @@ { "path": "../aws-sdk/tsconfig.build.json" }, { "path": "../data-migration/tsconfig.build.json" }, { "path": "../db-dynamodb/tsconfig.build.json" }, - { "path": "../feature-flags/tsconfig.build.json" }, { "path": "../handler-aws/tsconfig.build.json" }, { "path": "../handler-db/tsconfig.build.json" }, { "path": "../handler-logs/tsconfig.build.json" }, diff --git a/packages/serverless-cms-aws/tsconfig.json b/packages/serverless-cms-aws/tsconfig.json index fcbac513425..c6f8e607e44 100644 --- a/packages/serverless-cms-aws/tsconfig.json +++ b/packages/serverless-cms-aws/tsconfig.json @@ -34,7 +34,6 @@ { "path": "../aws-sdk" }, { "path": "../data-migration" }, { "path": "../db-dynamodb" }, - { "path": "../feature-flags" }, { "path": "../handler-aws" }, { "path": "../handler-db" }, { "path": "../handler-logs" }, @@ -119,8 +118,6 @@ "@webiny/data-migration": ["../data-migration/src"], "@webiny/db-dynamodb/*": ["../db-dynamodb/src/*"], "@webiny/db-dynamodb": ["../db-dynamodb/src"], - "@webiny/feature-flags/*": ["../feature-flags/src/*"], - "@webiny/feature-flags": ["../feature-flags/src"], "@webiny/handler-aws/*": ["../handler-aws/src/*"], "@webiny/handler-aws": ["../handler-aws/src"], "@webiny/handler-db/*": ["../handler-db/src/*"], diff --git a/packages/telemetry/cli.js b/packages/telemetry/cli.js index 91b626d9b2a..ba5845379a2 100644 --- a/packages/telemetry/cli.js +++ b/packages/telemetry/cli.js @@ -1,29 +1,44 @@ -const createSendEvent = require("./sendEvent"); const { globalConfig } = require("@webiny/global-config"); +const isCI = require("is-ci"); +const { WTS } = require("wts/src/node"); +const baseSendEvent = require("./sendEvent"); -const sendEvent = ({ event, user, version, properties, extraPayload }) => { +const sendEvent = async ({ event, user, version, properties }) => { const shouldSend = isEnabled(); + if (!shouldSend) { + return; + } + + const wts = new WTS(); + + const wcpProperties = {}; + const [wcpOrgId, wcpProjectId] = getWcpOrgProjectId(); + if (wcpOrgId && wcpProjectId) { + wcpProperties.wcpOrgId = wcpOrgId; + wcpProperties.wcpProjectId = wcpProjectId; + } - try { - const sendTelemetry = createSendEvent({ - event, - user: user || globalConfig.get("id"), + return baseSendEvent({ + event, + user: user || globalConfig.get("id"), + properties: { + ...properties, + ...wcpProperties, version: version || require("./package.json").version, - properties, - extraPayload - }); - - if (shouldSend) { - return sendTelemetry(); - } - } catch (err) { - // Ignore errors if telemetry is disabled. - if (!shouldSend) { - return; - } - - throw err; + ci: isCI, + newUser: Boolean(globalConfig.get("newUser")) + }, + wts + }); +}; + +const getWcpOrgProjectId = () => { + // In CLI, WCP project ID is stored in the `WCP_PROJECT_ID` environment variable. + const id = process.env.WCP_PROJECT_ID; + if (typeof id === "string") { + return id.split("/"); } + return []; }; const enable = () => { diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index 0fbb2aea0ac..3908fad2308 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -4,8 +4,10 @@ "license": "MIT", "dependencies": { "@webiny/global-config": "0.0.0", - "form-data": "3.0.0", - "node-fetch": "^2.6.13" + "is-ci": "3.0.0", + "jsesc": "^3.0.2", + "strip-ansi": "^6.0.1", + "wts": "https://github.com/webiny/wts#51fd5a89a8d12b27def57ff99a71e071e9085e6c" }, "publishConfig": { "access": "public", diff --git a/packages/telemetry/react.d.ts b/packages/telemetry/react.d.ts index aa337619f10..aabf795b774 100644 --- a/packages/telemetry/react.d.ts +++ b/packages/telemetry/react.d.ts @@ -1,2 +1 @@ -export declare function setProperties(data: Record): void; -export declare function sendEvent(ev: string, data?: Record): Promise; +export declare function sendEvent(ev: string, properties?: Record): Promise; diff --git a/packages/telemetry/react.js b/packages/telemetry/react.js index 13d71182a18..a3e772afdff 100644 --- a/packages/telemetry/react.js +++ b/packages/telemetry/react.js @@ -1,36 +1,42 @@ -const createSendEvent = require("./sendEvent"); +const baseSendEvent = require("./sendEvent"); +const { WTS } = require("wts/src/admin"); -const setProperties = data => { - return sendEvent("$identify", data); -}; -/** - * - * @param event {String} - * @param data {Record} - * @return {Promise} - */ -const sendEvent = (event, data = {}) => { - let properties = {}; - let extraPayload = {}; - if (event !== "$identify") { - properties = data; - } else { - extraPayload = { - $set: data - }; +const sendEvent = async (event, properties = {}) => { + const shouldSend = process.env.REACT_APP_WEBINY_TELEMETRY !== "false"; + if (!shouldSend) { + return; } - const shouldSend = process.env.REACT_APP_WEBINY_TELEMETRY !== "false"; + const wts = new WTS(); - const sendTelemetry = createSendEvent({ + const wcpProperties = {}; + const [wcpOrgId, wcpProjectId] = getWcpOrgProjectId(); + if (wcpOrgId && wcpProjectId) { + wcpProperties.wcpOrgId = wcpOrgId; + wcpProperties.wcpProjectId = wcpProjectId; + } + + return baseSendEvent({ event, - properties, - extraPayload, - user: process.env.REACT_APP_USER_ID, - version: process.env.REACT_APP_WEBINY_VERSION + user: process.env.REACT_APP_WEBINY_TELEMETRY_USER_ID, + properties: { + ...properties, + ...wcpProperties, + version: process.env.REACT_APP_WEBINY_VERSION, + ci: process.env.REACT_APP_IS_CI === "true", + newUser: process.env.REACT_APP_WEBINY_TELEMETRY_NEW_USER === "true" + }, + wts }); +}; - return shouldSend ? sendTelemetry() : Promise.resolve(); +const getWcpOrgProjectId = () => { + // In React applications, WCP project ID is stored in the `REACT_APP_WCP_PROJECT_ID` environment variable. + const id = process.env.REACT_APP_WCP_PROJECT_ID; + if (typeof id === "string") { + return id.split("/"); + } + return []; }; -module.exports = { setProperties, sendEvent }; +module.exports = { sendEvent }; diff --git a/packages/telemetry/sendEvent.js b/packages/telemetry/sendEvent.js index f610991854e..746e2b5902f 100644 --- a/packages/telemetry/sendEvent.js +++ b/packages/telemetry/sendEvent.js @@ -1,56 +1,60 @@ -const FormData = require("form-data"); -const fetch = require("node-fetch"); - -const API_KEY = "ZdDZgkeOt4Z_m-UWmqFsE1d6-kcCK3BH0ypYTUIFty4"; -const API_URL = "https://t.webiny.com"; - +const stripAnsi = require("strip-ansi"); +const jsesc = require("jsesc"); /** * The main `sendEvent` function. * NOTE: don't use this in your app directly. Instead, use the one from `cli.js` or `react.js` files accordingly. */ -module.exports = ({ event, user, version, properties, extraPayload } = {}) => { +module.exports = ({ event, user, properties, wts } = {}) => { + // 1. Check for existence of required base parameters. if (!event) { throw new Error(`Cannot send event - missing "event" name.`); } if (!user) { - throw new Error(`Cannot send event - missing "user" property.`); + throw new Error(`Cannot send event - missing "user" ID.`); + } + + if (!properties) { + throw new Error(`Cannot send event - missing "properties" object.`); + } + + if (!wts) { + throw new Error(`Cannot send event - missing "wts" instance.`); } - if (!version) { + // 2. Extract properties and check for existence of required properties. + if (!properties.version) { throw new Error(`Cannot send event - missing "version" property.`); } - if (!properties) { - properties = {}; + const hasCiProp = "ci" in properties; + if (!hasCiProp) { + throw new Error(`Cannot send event - missing "ci" boolean property.`); } - if (!extraPayload) { - extraPayload = {}; + const hasNewUserProp = "newUser" in properties; + if (!hasNewUserProp) { + throw new Error(`Cannot send event - missing "newUser" boolean property.`); } - const payload = { - ...extraPayload, - event, - properties: { - ...properties, - version - }, - distinct_id: user, - api_key: API_KEY, - timestamp: new Date().toISOString() + // 2. Sanitize properties. + const sanitizedProperties = { + ...properties, + newUser: properties.newUser === true ? "yes" : "no", + ci: properties.ci === true ? "yes" : "no" }; - const body = new FormData(); - body.append("data", Buffer.from(JSON.stringify(payload)).toString("base64")); - - // Return a function which will send the prepared body when invoked. - return () => { - return fetch(API_URL + "/capture/", { - body, - method: "POST" - }).catch(() => { - // Ignore errors - }); - }; + for (const key in sanitizedProperties) { + let sanitizedValue = sanitizedProperties[key]; + if (typeof sanitizedValue === "string") { + sanitizedValue = sanitizedValue.trim(); + sanitizedValue = stripAnsi(sanitizedValue); + sanitizedValue = jsesc(sanitizedValue); + } + + sanitizedProperties[key] = sanitizedValue; + } + + // 3. Send. + return wts.trackEvent(user, event, sanitizedProperties); }; diff --git a/scripts/prepublishOnly/src/prepublishOnly.ts b/scripts/prepublishOnly/src/prepublishOnly.ts index 50c46ae9de6..d691f132242 100644 --- a/scripts/prepublishOnly/src/prepublishOnly.ts +++ b/scripts/prepublishOnly/src/prepublishOnly.ts @@ -46,6 +46,10 @@ class FileLocker { continue; } + if (depVersion.startsWith("https:")) { + continue; + } + const resolvedVersion = resolvePackageVersion(key, { cwd: path.dirname(this.file) }); diff --git a/typings/commodo-fields-date/index.d.ts b/typings/commodo-fields-date/index.d.ts deleted file mode 100644 index 9b2a1c176ae..00000000000 --- a/typings/commodo-fields-date/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -declare module "@webiny/commodo/fields-date" { - export const date: any; -} diff --git a/typings/commodo-fields-float/index.d.ts b/typings/commodo-fields-float/index.d.ts deleted file mode 100644 index 79ca16573bf..00000000000 --- a/typings/commodo-fields-float/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -declare module "@webiny/commodo/fields-float" { - export const float: any; -} diff --git a/typings/commodo-fields-int/index.d.ts b/typings/commodo-fields-int/index.d.ts deleted file mode 100644 index 080cf8aee6b..00000000000 --- a/typings/commodo-fields-int/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -declare module "@webiny/commodo/fields-int" { - export const int: any; -} diff --git a/typings/commodo-fields-object/index.d.ts b/typings/commodo-fields-object/index.d.ts deleted file mode 100644 index d07596238a6..00000000000 --- a/typings/commodo-fields-object/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -declare module "@webiny/commodo/fields-object" { - export const object: any; -} diff --git a/typings/commodo-fields-storage/index.d.ts b/typings/commodo-fields-storage/index.d.ts deleted file mode 100644 index 1b090325eea..00000000000 --- a/typings/commodo-fields-storage/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ - -declare module "@webiny/commodo/fields-storage" { - export const withStorage: any; - export const withStorageName: any; -} diff --git a/typings/commodo-fields/index.d.ts b/typings/commodo-fields/index.d.ts deleted file mode 100644 index 11a14052b6b..00000000000 --- a/typings/commodo-fields/index.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare module "@webiny/commodo/fields" { - export const withFields: any; - export const boolean: any; - export const number: any; - export const string: any; - export const fields: any; - export const skipOnPopulate: any; -} diff --git a/typings/commodo-hooks/index.d.ts b/typings/commodo-hooks/index.d.ts deleted file mode 100644 index 06c8125bcd5..00000000000 --- a/typings/commodo-hooks/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -declare module "@webiny/commodo/hooks" { - export const withHooks: any; -} diff --git a/typings/commodo-name/index.d.ts b/typings/commodo-name/index.d.ts deleted file mode 100644 index 379ef8bf5f2..00000000000 --- a/typings/commodo-name/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ - -declare module "@webiny/commodo/name" { - export const withName: any; -} diff --git a/typings/commodo-repropose/index.d.ts b/typings/commodo-repropose/index.d.ts deleted file mode 100644 index 145fc8f6340..00000000000 --- a/typings/commodo-repropose/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ - - -declare module "@webiny/commodo/repropose" { - export const withProps: any; - export const withStaticProps: any; -} diff --git a/typings/commodo/index.d.ts b/typings/commodo/index.d.ts deleted file mode 100644 index f5999f44f6b..00000000000 --- a/typings/commodo/index.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -declare module "@webiny/commodo" { - export const pipe: Function; - export const compose: Function; - export const withStorage: any; - export const withStorageName: any; - export const withCrudLogs: any; - export const withSoftDelete: any; - export const withFields: any; - export const withHooks: any; - export const withName: any; - export const boolean: any; - export const string: any; - export const onSet: any; - export const onGet: any; - export const object: any; - export const number: any; - export const int: any; - export const float: any; - export const date: any; - export const ref: any; - export const skipOnPopulate: any; - export const withProps: any; - export const WithFieldsError: any; - export const setOnce: any; - export const fields: any; - export const withStaticProps: any; - export const createPaginationMeta: any; - export const createField: any; - export const Collection: any; - export const getName: any; -} diff --git a/yarn.lock b/yarn.lock index e0cff888de8..16f52513df1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -320,50 +320,50 @@ __metadata: linkType: hard "@aws-sdk/client-apigatewaymanagementapi@npm:^3.425.0": - version: 3.529.1 - resolution: "@aws-sdk/client-apigatewaymanagementapi@npm:3.529.1" + version: 3.535.0 + resolution: "@aws-sdk/client-apigatewaymanagementapi@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.529.1 - "@aws-sdk/core": 3.529.1 - "@aws-sdk/credential-provider-node": 3.529.1 - "@aws-sdk/middleware-host-header": 3.523.0 - "@aws-sdk/middleware-logger": 3.523.0 - "@aws-sdk/middleware-recursion-detection": 3.523.0 - "@aws-sdk/middleware-user-agent": 3.525.0 - "@aws-sdk/region-config-resolver": 3.525.0 - "@aws-sdk/types": 3.523.0 - "@aws-sdk/util-endpoints": 3.525.0 - "@aws-sdk/util-user-agent-browser": 3.523.0 - "@aws-sdk/util-user-agent-node": 3.525.0 - "@smithy/config-resolver": ^2.1.4 - "@smithy/core": ^1.3.5 - "@smithy/fetch-http-handler": ^2.4.3 - "@smithy/hash-node": ^2.1.3 - "@smithy/invalid-dependency": ^2.1.3 - "@smithy/middleware-content-length": ^2.1.3 - "@smithy/middleware-endpoint": ^2.4.4 - "@smithy/middleware-retry": ^2.1.4 - "@smithy/middleware-serde": ^2.1.3 - "@smithy/middleware-stack": ^2.1.3 - "@smithy/node-config-provider": ^2.2.4 - "@smithy/node-http-handler": ^2.4.1 - "@smithy/protocol-http": ^3.2.1 - "@smithy/smithy-client": ^2.4.2 - "@smithy/types": ^2.10.1 - "@smithy/url-parser": ^2.1.3 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.4 - "@smithy/util-defaults-mode-node": ^2.2.3 - "@smithy/util-endpoints": ^1.1.4 - "@smithy/util-middleware": ^2.1.3 - "@smithy/util-retry": ^2.1.3 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: 60c6dfe0fa405b1dd4bf07cfa73eb986148bb641a91aaf294d58473719d56f9bb42e35e01a76aa250cf27119c9af44a0b8f0677315b04a90157dadc85b2c0dca + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/credential-provider-node": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 0117b6253c862c3a3f62b808d2c99bdb4146f2b31917f804c2a32259cb7ab19b2bc09fc549662fa9ffccfcbfd936878974bb56ccd92664dd2e5c636939098d41 languageName: node linkType: hard @@ -1071,52 +1071,52 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sso-oidc@npm:3.529.1": - version: 3.529.1 - resolution: "@aws-sdk/client-sso-oidc@npm:3.529.1" +"@aws-sdk/client-sso-oidc@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/client-sso-oidc@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/client-sts": 3.529.1 - "@aws-sdk/core": 3.529.1 - "@aws-sdk/middleware-host-header": 3.523.0 - "@aws-sdk/middleware-logger": 3.523.0 - "@aws-sdk/middleware-recursion-detection": 3.523.0 - "@aws-sdk/middleware-user-agent": 3.525.0 - "@aws-sdk/region-config-resolver": 3.525.0 - "@aws-sdk/types": 3.523.0 - "@aws-sdk/util-endpoints": 3.525.0 - "@aws-sdk/util-user-agent-browser": 3.523.0 - "@aws-sdk/util-user-agent-node": 3.525.0 - "@smithy/config-resolver": ^2.1.4 - "@smithy/core": ^1.3.5 - "@smithy/fetch-http-handler": ^2.4.3 - "@smithy/hash-node": ^2.1.3 - "@smithy/invalid-dependency": ^2.1.3 - "@smithy/middleware-content-length": ^2.1.3 - "@smithy/middleware-endpoint": ^2.4.4 - "@smithy/middleware-retry": ^2.1.4 - "@smithy/middleware-serde": ^2.1.3 - "@smithy/middleware-stack": ^2.1.3 - "@smithy/node-config-provider": ^2.2.4 - "@smithy/node-http-handler": ^2.4.1 - "@smithy/protocol-http": ^3.2.1 - "@smithy/smithy-client": ^2.4.2 - "@smithy/types": ^2.10.1 - "@smithy/url-parser": ^2.1.3 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.4 - "@smithy/util-defaults-mode-node": ^2.2.3 - "@smithy/util-endpoints": ^1.1.4 - "@smithy/util-middleware": ^2.1.3 - "@smithy/util-retry": ^2.1.3 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - peerDependencies: - "@aws-sdk/credential-provider-node": ^3.529.1 - checksum: 16e8bac664019993aa55998327ec3a11471a707b2bfef0da3ebe0b5dab5d51b9fb9259eec7e2634b40c2b459994b5fc9ab2f5247fefc7e0ad275114127aafd7c + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + peerDependencies: + "@aws-sdk/credential-provider-node": ^3.535.0 + checksum: fb532eeda1294bcaacefbfe0dc6674189c68a530d491d4cf6685d46d7fa5115184ba0b16c9a1f15014709a78f49d3e04d7f1caaf78fe21a4f9a47b6d67f29db6 languageName: node linkType: hard @@ -1207,49 +1207,49 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.529.1": - version: 3.529.1 - resolution: "@aws-sdk/client-sso@npm:3.529.1" +"@aws-sdk/client-sso@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/client-sso@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.529.1 - "@aws-sdk/middleware-host-header": 3.523.0 - "@aws-sdk/middleware-logger": 3.523.0 - "@aws-sdk/middleware-recursion-detection": 3.523.0 - "@aws-sdk/middleware-user-agent": 3.525.0 - "@aws-sdk/region-config-resolver": 3.525.0 - "@aws-sdk/types": 3.523.0 - "@aws-sdk/util-endpoints": 3.525.0 - "@aws-sdk/util-user-agent-browser": 3.523.0 - "@aws-sdk/util-user-agent-node": 3.525.0 - "@smithy/config-resolver": ^2.1.4 - "@smithy/core": ^1.3.5 - "@smithy/fetch-http-handler": ^2.4.3 - "@smithy/hash-node": ^2.1.3 - "@smithy/invalid-dependency": ^2.1.3 - "@smithy/middleware-content-length": ^2.1.3 - "@smithy/middleware-endpoint": ^2.4.4 - "@smithy/middleware-retry": ^2.1.4 - "@smithy/middleware-serde": ^2.1.3 - "@smithy/middleware-stack": ^2.1.3 - "@smithy/node-config-provider": ^2.2.4 - "@smithy/node-http-handler": ^2.4.1 - "@smithy/protocol-http": ^3.2.1 - "@smithy/smithy-client": ^2.4.2 - "@smithy/types": ^2.10.1 - "@smithy/url-parser": ^2.1.3 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.4 - "@smithy/util-defaults-mode-node": ^2.2.3 - "@smithy/util-endpoints": ^1.1.4 - "@smithy/util-middleware": ^2.1.3 - "@smithy/util-retry": ^2.1.3 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - checksum: 236a437c748ad3a1e2f922515f70031c186c4dcd44c43a35e91ea465320da0ccad108be2c480908bf2cbd8b7bb7009fe979417e5a7bf2d661cee790a91c1a6b0 + "@aws-sdk/core": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: baed386827455e43160d4dfccacc382e348729e3b78b01f2a6fb9989c790ac8f9264513a3c963ace39ba5c3e0ffbaf3bf57ea8824ba537c4c1d5486b186d0596 languageName: node linkType: hard @@ -1347,51 +1347,51 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sts@npm:3.529.1": - version: 3.529.1 - resolution: "@aws-sdk/client-sts@npm:3.529.1" +"@aws-sdk/client-sts@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/client-sts@npm:3.535.0" dependencies: "@aws-crypto/sha256-browser": 3.0.0 "@aws-crypto/sha256-js": 3.0.0 - "@aws-sdk/core": 3.529.1 - "@aws-sdk/middleware-host-header": 3.523.0 - "@aws-sdk/middleware-logger": 3.523.0 - "@aws-sdk/middleware-recursion-detection": 3.523.0 - "@aws-sdk/middleware-user-agent": 3.525.0 - "@aws-sdk/region-config-resolver": 3.525.0 - "@aws-sdk/types": 3.523.0 - "@aws-sdk/util-endpoints": 3.525.0 - "@aws-sdk/util-user-agent-browser": 3.523.0 - "@aws-sdk/util-user-agent-node": 3.525.0 - "@smithy/config-resolver": ^2.1.4 - "@smithy/core": ^1.3.5 - "@smithy/fetch-http-handler": ^2.4.3 - "@smithy/hash-node": ^2.1.3 - "@smithy/invalid-dependency": ^2.1.3 - "@smithy/middleware-content-length": ^2.1.3 - "@smithy/middleware-endpoint": ^2.4.4 - "@smithy/middleware-retry": ^2.1.4 - "@smithy/middleware-serde": ^2.1.3 - "@smithy/middleware-stack": ^2.1.3 - "@smithy/node-config-provider": ^2.2.4 - "@smithy/node-http-handler": ^2.4.1 - "@smithy/protocol-http": ^3.2.1 - "@smithy/smithy-client": ^2.4.2 - "@smithy/types": ^2.10.1 - "@smithy/url-parser": ^2.1.3 - "@smithy/util-base64": ^2.1.1 - "@smithy/util-body-length-browser": ^2.1.1 - "@smithy/util-body-length-node": ^2.2.1 - "@smithy/util-defaults-mode-browser": ^2.1.4 - "@smithy/util-defaults-mode-node": ^2.2.3 - "@smithy/util-endpoints": ^1.1.4 - "@smithy/util-middleware": ^2.1.3 - "@smithy/util-retry": ^2.1.3 - "@smithy/util-utf8": ^2.1.1 - tslib: ^2.5.0 - peerDependencies: - "@aws-sdk/credential-provider-node": ^3.529.1 - checksum: 9f66bba6468fc3535d0d5423120582fe90a9f627cd34250b0d76c563c9a8795433d1b776e3924c873be1761161c97fe53c86ab1fa85d7d4ae12d87f9ad1ac9cc + "@aws-sdk/core": 3.535.0 + "@aws-sdk/middleware-host-header": 3.535.0 + "@aws-sdk/middleware-logger": 3.535.0 + "@aws-sdk/middleware-recursion-detection": 3.535.0 + "@aws-sdk/middleware-user-agent": 3.535.0 + "@aws-sdk/region-config-resolver": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@aws-sdk/util-user-agent-browser": 3.535.0 + "@aws-sdk/util-user-agent-node": 3.535.0 + "@smithy/config-resolver": ^2.2.0 + "@smithy/core": ^1.4.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/hash-node": ^2.2.0 + "@smithy/invalid-dependency": ^2.2.0 + "@smithy/middleware-content-length": ^2.2.0 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-body-length-browser": ^2.2.0 + "@smithy/util-body-length-node": ^2.3.0 + "@smithy/util-defaults-mode-browser": ^2.2.0 + "@smithy/util-defaults-mode-node": ^2.3.0 + "@smithy/util-endpoints": ^1.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + peerDependencies: + "@aws-sdk/credential-provider-node": ^3.535.0 + checksum: c4be32eb99dbf332a38c3d5ffa02abb3c1cd83b736e29277c309deff981e95895efb124825a44a24e8de3f34711fd018db5f984eedc92e1dc902cf29073f777a languageName: node linkType: hard @@ -1420,18 +1420,18 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/core@npm:3.529.1": - version: 3.529.1 - resolution: "@aws-sdk/core@npm:3.529.1" +"@aws-sdk/core@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/core@npm:3.535.0" dependencies: - "@smithy/core": ^1.3.5 - "@smithy/protocol-http": ^3.2.1 - "@smithy/signature-v4": ^2.1.3 - "@smithy/smithy-client": ^2.4.2 - "@smithy/types": ^2.10.1 + "@smithy/core": ^1.4.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/signature-v4": ^2.2.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 fast-xml-parser: 4.2.5 - tslib: ^2.5.0 - checksum: 26228c1cc367342616db03da63c4d58a81bae320f1b9d1d0513a49bc4a0370abc3d860d6003129e5763a4db9011ef83df9f38691ab5f887564e75749c12589d3 + tslib: ^2.6.2 + checksum: bc14b1db2bdc743c1ab16b48e5df7423d6eeef5a69400c84ea7ce6a6d01a17b940fab199bf84b7d63bbbc252969be79439b67676cccd5fc59ce0a9f89b62b376 languageName: node linkType: hard @@ -1484,15 +1484,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.523.0": - version: 3.523.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.523.0" +"@aws-sdk/credential-provider-env@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@smithy/property-provider": ^2.1.3 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: a286e8d3a5e974532542a1714d9576a2570870047a2181d38cd3a8b015b69bc972af61051db782598c74adbf8845bb9aecc8651445c16757a19b66e11e96852d + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: ec7d011051d69643efd26fe7f3767b1301c6e6bdba12640dad542b60efb2b5fe31df01f8137703d814cf857a69485cc928d0de49ab56c5d05f79815dce19bdbf languageName: node linkType: hard @@ -1522,20 +1522,20 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.525.0": - version: 3.525.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.525.0" +"@aws-sdk/credential-provider-http@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@smithy/fetch-http-handler": ^2.4.3 - "@smithy/node-http-handler": ^2.4.1 - "@smithy/property-provider": ^2.1.3 - "@smithy/protocol-http": ^3.2.1 - "@smithy/smithy-client": ^2.4.2 - "@smithy/types": ^2.10.1 - "@smithy/util-stream": ^2.1.3 - tslib: ^2.5.0 - checksum: 8de1f543e3ef36f12ce1c75addbca0255fd700f05db5e5a78a47affa01845735f37f14ab7edb45bdbac1a65d9bd7692e1c1745b683d94c405cb7a87f897afc1d + "@aws-sdk/types": 3.535.0 + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-stream": ^2.2.0 + tslib: ^2.6.2 + checksum: a0ddcdf0538aa6a80e8705e21ef0c469d3756c762a3772e8d45b8bea173d5aa0aaf14e7a0c4e963a0530687a5dbd0777dcdaa4a363861de30620c68e752cdad9 languageName: node linkType: hard @@ -1586,22 +1586,22 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.529.1": - version: 3.529.1 - resolution: "@aws-sdk/credential-provider-ini@npm:3.529.1" +"@aws-sdk/credential-provider-ini@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.535.0" dependencies: - "@aws-sdk/client-sts": 3.529.1 - "@aws-sdk/credential-provider-env": 3.523.0 - "@aws-sdk/credential-provider-process": 3.523.0 - "@aws-sdk/credential-provider-sso": 3.529.1 - "@aws-sdk/credential-provider-web-identity": 3.529.1 - "@aws-sdk/types": 3.523.0 - "@smithy/credential-provider-imds": ^2.2.3 - "@smithy/property-provider": ^2.1.3 - "@smithy/shared-ini-file-loader": ^2.3.3 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: ec091e5dc896f1cb4700e4811efe42d6a0eb9c97095c392e84405c288592f109c22fe2819f2a590a9e151d1c7a712d72608f950c4c4cc6ee9b402896f56a87fc + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/credential-provider-env": 3.535.0 + "@aws-sdk/credential-provider-process": 3.535.0 + "@aws-sdk/credential-provider-sso": 3.535.0 + "@aws-sdk/credential-provider-web-identity": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: b35d5bfe064ca24a73443976521ac1176fda534d73aea9ffba6fb5a8e879c561e0b95b4b968191ad64976738e8b1f45c9a70072af3c4ba0beff490104f14d6cc languageName: node linkType: hard @@ -1655,23 +1655,23 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.529.1": - version: 3.529.1 - resolution: "@aws-sdk/credential-provider-node@npm:3.529.1" +"@aws-sdk/credential-provider-node@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.535.0" dependencies: - "@aws-sdk/credential-provider-env": 3.523.0 - "@aws-sdk/credential-provider-http": 3.525.0 - "@aws-sdk/credential-provider-ini": 3.529.1 - "@aws-sdk/credential-provider-process": 3.523.0 - "@aws-sdk/credential-provider-sso": 3.529.1 - "@aws-sdk/credential-provider-web-identity": 3.529.1 - "@aws-sdk/types": 3.523.0 - "@smithy/credential-provider-imds": ^2.2.3 - "@smithy/property-provider": ^2.1.3 - "@smithy/shared-ini-file-loader": ^2.3.3 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: 0409cf1521f172703f91110a3ce03668ecb8b7b5f018b12bdd1094753f65ab9411ca83ebcd2335a80aeee7ae13bd6f8e59c4bb86feba8316f5d7e9a1a6fdc1d2 + "@aws-sdk/credential-provider-env": 3.535.0 + "@aws-sdk/credential-provider-http": 3.535.0 + "@aws-sdk/credential-provider-ini": 3.535.0 + "@aws-sdk/credential-provider-process": 3.535.0 + "@aws-sdk/credential-provider-sso": 3.535.0 + "@aws-sdk/credential-provider-web-identity": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 79d4cea828e69ce38b7ebc987eae9292aec33520205093289ba0d8166464fb2c7c31a4c76b4c724e100150fd23c71020dda27c6a3a794b2644dcfdc1243e8dc4 languageName: node linkType: hard @@ -1717,16 +1717,16 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.523.0": - version: 3.523.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.523.0" +"@aws-sdk/credential-provider-process@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@smithy/property-provider": ^2.1.3 - "@smithy/shared-ini-file-loader": ^2.3.3 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: f47233f8d77603eb78eba1bb1f35c772c782c7534ff372ee67ae94e76588c906c83d8d55fd3ffa75e02a09815847ec840ad15bfe5da916f536ff1e9116b81547 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: af5fad70513e8d0bc10013f220588e45e83d488e0780873d7e76bf5b7099e70c9b4e49b6409d16add64ae212c53a472b12a2178e8bafd7878fdf121d6e2fd112 languageName: node linkType: hard @@ -1773,18 +1773,18 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.529.1": - version: 3.529.1 - resolution: "@aws-sdk/credential-provider-sso@npm:3.529.1" +"@aws-sdk/credential-provider-sso@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.535.0" dependencies: - "@aws-sdk/client-sso": 3.529.1 - "@aws-sdk/token-providers": 3.529.1 - "@aws-sdk/types": 3.523.0 - "@smithy/property-provider": ^2.1.3 - "@smithy/shared-ini-file-loader": ^2.3.3 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: 2fcfb26ec360a5f88f815044c270e57cfc32ac6964d2a26911196bc56fb87edd38c63f93f2705dfd5b1d2b4e9513b9c88c69dde2b49ffd4c52e430e2505b388c + "@aws-sdk/client-sso": 3.535.0 + "@aws-sdk/token-providers": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 255d1575127b1acc1c4c4281c878a48160ac506d34cd7ff0a3b4a250684a98e1f3637f679368a4171fdf73fd0e29f95f5df21043b7d6f7d64a9f673178949e47 languageName: node linkType: hard @@ -1812,16 +1812,16 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.529.1": - version: 3.529.1 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.529.1" +"@aws-sdk/credential-provider-web-identity@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.535.0" dependencies: - "@aws-sdk/client-sts": 3.529.1 - "@aws-sdk/types": 3.523.0 - "@smithy/property-provider": ^2.1.3 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: c763b55c9a6abf25271460c422e66e180332ce5d2aca166d270437db7aa9459ead84676b066bceb7b56b4fbcba5bd7414438ec5e808241b2a695c844e0560bab + "@aws-sdk/client-sts": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 9aa0c7c14efcdf3238a53237942b40d91a3b1064e4d64ceffb988dd019f7fc94b49f8d5e0ca4271c592e5adfa92be9e54befee57a9dd5476763f174d376628ee languageName: node linkType: hard @@ -2023,15 +2023,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.523.0": - version: 3.523.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.523.0" +"@aws-sdk/middleware-host-header@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@smithy/protocol-http": ^3.2.1 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: 7f466123b220cfffaba5f6c8d8315c0d4f3b3c46e73b244548dcbed5d9b659e1f1087cdab9bb5795a16069400319d3df63b55ba154dd38ee27ddf2a6ce4a7d78 + "@aws-sdk/types": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 13a22a5b19912a86fe872c9c0f6ba9ab758ba9483ce9a2e73fa68acae498b68404e38e7fc1e3962639a6c3f80ebe19ea5c5340e1024e11ab417998696c8a5dca languageName: node linkType: hard @@ -2079,14 +2079,14 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.523.0": - version: 3.523.0 - resolution: "@aws-sdk/middleware-logger@npm:3.523.0" +"@aws-sdk/middleware-logger@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-logger@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: 8485c0fae3b7eae4c2bf09f2bd99b10fa283cc70e576622212d721748746136777fd83a989027ab008fce61e1ffb16a455eb24c8a6ea4c7a223e3d7ca6b54904 + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: e264d05aa88fadd94d17000b1df79bf1931c5fbc2c871616de9b836bab7254d8c21e0fc2ac509a07af578bd823b795efafaf48daca805bc4493986288ed0c4ab languageName: node linkType: hard @@ -2124,15 +2124,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.523.0": - version: 3.523.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.523.0" +"@aws-sdk/middleware-recursion-detection@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@smithy/protocol-http": ^3.2.1 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: 2657a454ca5b34e7db40257d901fd9977c4f25283a0af083dc9e667b3cff4ca576cd02118d7ad69650eba3bfc9046dfda762f8fb1fc7476708d7e94297dfe4f4 + "@aws-sdk/types": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: b6b518243a10dcdcea7c1fd4790cf2e1e0e3d4363ebce51ac364c9b15631a6f3d1db44d00e7c75cbdf1d558a0d868583d6e1853e571e15e23d0d2901f168e2e4 languageName: node linkType: hard @@ -2287,16 +2287,16 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.525.0": - version: 3.525.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.525.0" +"@aws-sdk/middleware-user-agent@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@aws-sdk/util-endpoints": 3.525.0 - "@smithy/protocol-http": ^3.2.1 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: cf00a62268047eeb058fafd267c3d83e52b642e2dbeb1c5dafa46a2114fd7b6e8e5ba3529581784992e078a5ae898877bce14213b7d5a04b121767c2f5b783e9 + "@aws-sdk/types": 3.535.0 + "@aws-sdk/util-endpoints": 3.535.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: a6ea7871977143aa1ba25e59d7e2b8346c0b2a5cff44d1e6f615513ef6a2da0181044278f4345b34e7ac2c00f4d8a6dc00e7b4512730701bc27db7f2bc5e3597 languageName: node linkType: hard @@ -2403,17 +2403,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/region-config-resolver@npm:3.525.0": - version: 3.525.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.525.0" +"@aws-sdk/region-config-resolver@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@smithy/node-config-provider": ^2.2.4 - "@smithy/types": ^2.10.1 - "@smithy/util-config-provider": ^2.2.1 - "@smithy/util-middleware": ^2.1.3 - tslib: ^2.5.0 - checksum: 3068fcb7bf9f00fe1884679018e44c3283ea0baeafaaeed64451464e7ef826107ff13f17eb5b65d6d1439aed5592e12f6cb0b79427f4f4efe6e00b485d9ad1ec + "@aws-sdk/types": 3.535.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-config-provider": ^2.3.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 7b556e47c721c0829ae635203a1dbcab7040e2885d2bdc37898eb3139dabb5f6da580b860202e3b7737330bfc02de5084a98ff8f8b5c36adcfe8e076b82d3487 languageName: node linkType: hard @@ -2591,17 +2591,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.529.1": - version: 3.529.1 - resolution: "@aws-sdk/token-providers@npm:3.529.1" +"@aws-sdk/token-providers@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/token-providers@npm:3.535.0" dependencies: - "@aws-sdk/client-sso-oidc": 3.529.1 - "@aws-sdk/types": 3.523.0 - "@smithy/property-provider": ^2.1.3 - "@smithy/shared-ini-file-loader": ^2.3.3 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: 7133267ed2ea35cdb769bcec40c4a7abd95b41ae5f188be629a81b41c7210b285a9fc7e92d3ab8d294fecd17d8044ad95fcf90b560fb68831d862560e3fc0772 + "@aws-sdk/client-sso-oidc": 3.535.0 + "@aws-sdk/types": 3.535.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 79548a8cd1f2aa0f44104a46d979d215f5422f851e5858e01405500c2aa923bbdddbe8467a41e38fbcef5c587bd9b3fff32587f652e4857bdc9fbf07be52291e languageName: node linkType: hard @@ -2625,13 +2625,13 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/types@npm:3.523.0": - version: 3.523.0 - resolution: "@aws-sdk/types@npm:3.523.0" +"@aws-sdk/types@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/types@npm:3.535.0" dependencies: - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 - checksum: 42a8c47bfdd37030d1cb3a15bb1cc6e1dadbc371960cf0a52c868a453ebd3128f75ab7406a993c2ff0eff634e953c2ea12e8856af0e6f6745321bde4f8f7cbc6 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 3f735c78ea3a6f37d05387286f6d18b0e5deb41442095bd2f7c27b000659962872d1c801fa8484a6ac4b7d2725b2e176dc628c3fa2a903a3141d4be76488d48f languageName: node linkType: hard @@ -2762,15 +2762,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.525.0": - version: 3.525.0 - resolution: "@aws-sdk/util-endpoints@npm:3.525.0" +"@aws-sdk/util-endpoints@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/util-endpoints@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@smithy/types": ^2.10.1 - "@smithy/util-endpoints": ^1.1.4 - tslib: ^2.5.0 - checksum: 83b3cfe5a4650b7744d26dcd2883de9ae55abbfe9343c3f3622be312783e59704e9c15e50b1c27781e8a1f0ca7292414672752b0c85155a96c48124d0857a75b + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 + "@smithy/util-endpoints": ^1.2.0 + tslib: ^2.6.2 + checksum: 26d70c540cdf2ac29148a1ce06d67511751f356f88d21422ed73a47e8bb1e75571252441e13b3f956351d837788f8ba0fe57cc0d0d0ed0fd04c4636bd3d184eb languageName: node linkType: hard @@ -2837,15 +2837,15 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.523.0": - version: 3.523.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.523.0" +"@aws-sdk/util-user-agent-browser@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@smithy/types": ^2.10.1 + "@aws-sdk/types": 3.535.0 + "@smithy/types": ^2.12.0 bowser: ^2.11.0 - tslib: ^2.5.0 - checksum: 210b34ea133ed6f7a3d517d0303bc6072a17be009dea462a0a28ffbde45cf5a7b73dd19300daa9754f9802783d7d583870ae0663d8925351b1b7e09c31b9007b + tslib: ^2.6.2 + checksum: 148b82900e4b9efd24f5fc4152a8d6010c90eb019517fa3c00c3ac42205055f7611ef3834fb63397def40e600ea20f901177a7dd5b6aefa2aef4208e994f7d90 languageName: node linkType: hard @@ -2894,20 +2894,20 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.525.0": - version: 3.525.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.525.0" +"@aws-sdk/util-user-agent-node@npm:3.535.0": + version: 3.535.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.535.0" dependencies: - "@aws-sdk/types": 3.523.0 - "@smithy/node-config-provider": ^2.2.4 - "@smithy/types": ^2.10.1 - tslib: ^2.5.0 + "@aws-sdk/types": 3.535.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: b1917c1e6a6bc3395a0306e1773d9ac8da8898d273ce37447c7f83f62e0e0d7e35985145a3b6c6cab5255f99088f7f53a989bdab050b00c1a46d69b15a76d5d5 + checksum: f214c406fccde14591d1df25fed662e573510cdf1d5829d22e7a93e517ea4a3905acd123eaaeafdb8b217400e8c8e159231d37be02b67307922023996b398f42 languageName: node linkType: hard @@ -3411,9 +3411,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.0": - version: 0.6.0 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.0" +"@babel/helper-define-polyfill-provider@npm:^0.6.1": + version: 0.6.1 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.1" dependencies: "@babel/helper-compilation-targets": ^7.22.6 "@babel/helper-plugin-utils": ^7.22.5 @@ -3422,7 +3422,7 @@ __metadata: resolve: ^1.14.2 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: a7f67480711c3c37993de322d327b1f31a3fe87a8c5160fbe1346e11d63eb5da5a56af93c2cdb1e2c3874c88a7eaf9ad7ddb83c083a2b0f48c20bf0a979ed202 + checksum: b45deb37ce1342d862422e81a3d25ff55f9c7ca52fe303405641e2add8db754091aaaa2119047a0f0b85072221fbddaa92adf53104274661d2795783b56bea2c languageName: node linkType: hard @@ -6021,16 +6021,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.14.0": - version: 7.23.9 - resolution: "@babel/runtime@npm:7.23.9" - dependencies: - regenerator-runtime: ^0.14.0 - checksum: 6bbebe8d27c0c2dd275d1ac197fc1a6c00e18dab68cc7aaff0adc3195b45862bae9c4cc58975629004b0213955b2ed91e99eccb3d9b39cabea246c657323d667 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.24.0": +"@babel/runtime@npm:^7.14.0, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.24.0": version: 7.24.0 resolution: "@babel/runtime@npm:7.24.0" dependencies: @@ -6397,15 +6388,6 @@ __metadata: languageName: node linkType: hard -"@commodo/hooks@npm:^1.2.1": - version: 1.2.1 - resolution: "@commodo/hooks@npm:1.2.1" - dependencies: - repropose: ^1.0.2 - checksum: 2d0bded62a615cd6e01e143104248c689e9c98f45d8c2816ce6ba261c9c0c25bc8a79c8b070d24bb0d88e792833aa92bd129dfc47621656d9bf41e1d2c822554 - languageName: node - linkType: hard - "@commodo/name@npm:^1.2.2-beta.20, @commodo/name@npm:^1.3.1": version: 1.3.1 resolution: "@commodo/name@npm:1.3.1" @@ -6424,13 +6406,13 @@ __metadata: languageName: node linkType: hard -"@csstools/cascade-layer-name-parser@npm:^1.0.8": - version: 1.0.8 - resolution: "@csstools/cascade-layer-name-parser@npm:1.0.8" +"@csstools/cascade-layer-name-parser@npm:^1.0.9": + version: 1.0.9 + resolution: "@csstools/cascade-layer-name-parser@npm:1.0.9" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - checksum: 7102fa11c380a08061472249d3f8690b5bc3f21d7465c4cb06802a5018044561c85cc17088799c89aad82f64028f461ee905c3bfee0f0a28fd3882672017c877 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + checksum: 75eabf9e3707085ca38ec56869d8872156b250aae81d9e76c75ecca47264531963f918787acf8cf58f6ad32967d2151939a749e601579c34d23f06e5a60fc6d4 languageName: node linkType: hard @@ -6441,52 +6423,52 @@ __metadata: languageName: node linkType: hard -"@csstools/css-calc@npm:^1.1.7": - version: 1.1.7 - resolution: "@csstools/css-calc@npm:1.1.7" +"@csstools/css-calc@npm:^1.2.0": + version: 1.2.0 + resolution: "@csstools/css-calc@npm:1.2.0" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - checksum: 23f78a2c39a73dd920f7e4a3bf67497e3fb5a8e0a344035b481bf931ca948cefcd86911382051dfc0c3ccd2826ef8ec3b66c3f0433937be65fff8d699e63d71b + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + checksum: f2d99b118693a599f2f8293631c8be2570c1bcee5175d94b1424f0b41b30f80c94a5e525725f487568de8ce9506c637e2e8eb9815b780140790fe731064d4386 languageName: node linkType: hard -"@csstools/css-color-parser@npm:^1.5.2": - version: 1.5.2 - resolution: "@csstools/css-color-parser@npm:1.5.2" +"@csstools/css-color-parser@npm:^1.6.0": + version: 1.6.0 + resolution: "@csstools/css-color-parser@npm:1.6.0" dependencies: "@csstools/color-helpers": ^4.0.0 - "@csstools/css-calc": ^1.1.7 + "@csstools/css-calc": ^1.2.0 peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - checksum: 877da2186599147829955351753c635b1f5bbe03d22d306cc916e9106fea8f1850c30c5bd40dbc77cb60e5550e14434ca3b1dbec1359822647f499b2af4f07b4 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + checksum: b428cca79f9dff8eb181cbdca1ed550d12f411b2d618eef6b8373fd0aa76908493e6a38dfc7d5dad2ae92c613f0d28ad435dbc8a998be806a238d05ce1417dbe languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:^2.6.0": - version: 2.6.0 - resolution: "@csstools/css-parser-algorithms@npm:2.6.0" +"@csstools/css-parser-algorithms@npm:^2.6.1": + version: 2.6.1 + resolution: "@csstools/css-parser-algorithms@npm:2.6.1" peerDependencies: - "@csstools/css-tokenizer": ^2.2.3 - checksum: 06b48d5e59faec36f7491a6a1c495005878869971e850545a3dd9ee98e5a7c1c28e138137137e16b772e0aa23c29b9524a33e75be584ba3adcd1ef316e1753c0 + "@csstools/css-tokenizer": ^2.2.4 + checksum: 365745c2d6b3eaf26c77d09306c66012552d2b2e4cf94fabc230e8a6a954dab57867b24ebedd8bd518c8ced844c7f988e89144b5d9c76cfbddff126cfb2f153d languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^2.2.3": - version: 2.2.3 - resolution: "@csstools/css-tokenizer@npm:2.2.3" - checksum: a2a69f0de516046f85b8f47916879780f9712bdda8166ab01dd47613515ff5a0771555c78badd220686bc1dae3cb0eea5de6896e1e326247a276cc8965520aa6 +"@csstools/css-tokenizer@npm:^2.2.4": + version: 2.2.4 + resolution: "@csstools/css-tokenizer@npm:2.2.4" + checksum: 306ce5603e1084d782e125caa86eadad2a3115e36ec824b855df7e48bb4821eec7ccf336990d37874d76cf18156586866975e46c6a75583f218c61735749af81 languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^2.1.8": - version: 2.1.8 - resolution: "@csstools/media-query-list-parser@npm:2.1.8" +"@csstools/media-query-list-parser@npm:^2.1.9": + version: 2.1.9 + resolution: "@csstools/media-query-list-parser@npm:2.1.9" peerDependencies: - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - checksum: a14d32092481743c51ac5279b4e486d4ae50c14331e01de01ea900ba51f6b79eadd36a1fd5be840ab6c8f2c5275f0bbe29f035844ba566edd84edf9ce5470a06 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + checksum: c10c39ac23c38ccf6f21cc075ecced5cf9c98f237c559818d248b7b7ac08da5d2a92f80685a2958ef5862fb8cba4f12054f2fced5a18f8392d545934f52b42ff languageName: node linkType: hard @@ -6510,45 +6492,45 @@ __metadata: linkType: hard "@csstools/postcss-color-function@npm:^3.0.10": - version: 3.0.10 - resolution: "@csstools/postcss-color-function@npm:3.0.10" + version: 3.0.11 + resolution: "@csstools/postcss-color-function@npm:3.0.11" dependencies: - "@csstools/css-color-parser": ^1.5.2 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/css-color-parser": ^1.6.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 peerDependencies: postcss: ^8.4 - checksum: a00c081901add1d50ce7e1818088cc52c501d36df2589d8e2aeff0f251eb3fc2764064a8b8f9adfdf1d14b2ebb57bf023dfa8d676f05843b6fe5a7aea8d01d46 + checksum: ebb6f8ae8f528e07b16fe4b68f4e2e790bbecd2e555c2765f4d893271bab8e08ce2825c9eac0f6356272a7b68c33255938116ce0cafa752d62e3c27f47337d98 languageName: node linkType: hard "@csstools/postcss-color-mix-function@npm:^2.0.10": - version: 2.0.10 - resolution: "@csstools/postcss-color-mix-function@npm:2.0.10" + version: 2.0.11 + resolution: "@csstools/postcss-color-mix-function@npm:2.0.11" dependencies: - "@csstools/css-color-parser": ^1.5.2 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/css-color-parser": ^1.6.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 peerDependencies: postcss: ^8.4 - checksum: 1b9330cb8fee364768f11f15d8fead9f1a067ea14a5aa41527028797e9da3f01da31f7a5e4619d42b468f0b66ee282d0dc75248b2a4c8cf00e696dd6755eba82 + checksum: c99be46799cda7f058b6721ac358a5f9986314d5a5d2fb919a83eafc46fab00d9fa1c194773a6ca1773214c19a929421423034733425a5a75e7c82abe140a284 languageName: node linkType: hard "@csstools/postcss-exponential-functions@npm:^1.0.4": - version: 1.0.4 - resolution: "@csstools/postcss-exponential-functions@npm:1.0.4" + version: 1.0.5 + resolution: "@csstools/postcss-exponential-functions@npm:1.0.5" dependencies: - "@csstools/css-calc": ^1.1.7 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/css-calc": ^1.2.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 peerDependencies: postcss: ^8.4 - checksum: 887485c69e5f2a9b0912a3f816c8a7d77d1788982b4e30cd87f906363fddbe518c532193675fc1b116426f3f8e6046e1207aa785f9004e35fb87f689f8b5dfbd + checksum: 563dcea90f06ca6c0f88e8200ac1577e5e566fe234d3c0b3b569cd27323ea491051da54f3ce1179a944145ebdb822615f678d567ea254750499937795f2a2a7d languageName: node linkType: hard @@ -6565,58 +6547,58 @@ __metadata: linkType: hard "@csstools/postcss-gamut-mapping@npm:^1.0.3": - version: 1.0.3 - resolution: "@csstools/postcss-gamut-mapping@npm:1.0.3" + version: 1.0.4 + resolution: "@csstools/postcss-gamut-mapping@npm:1.0.4" dependencies: - "@csstools/css-color-parser": ^1.5.2 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/css-color-parser": ^1.6.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 peerDependencies: postcss: ^8.4 - checksum: ad7b74ecf7463864df1164d46b882869e615384c35fe4c076b3342cce26d4194c6f05fc3d133e5595b057f91102e8481f376029b0deb2ddb028a4052f96cdd2d + checksum: f7d71ccce5f54aa1516aec1a1e7a80163f9ce03ec75592dd002ea624c6a837e564df238f1dfa5dad7c09c84f55af74f36ff3ce799e0585378ab430942835ff16 languageName: node linkType: hard "@csstools/postcss-gradients-interpolation-method@npm:^4.0.10": - version: 4.0.11 - resolution: "@csstools/postcss-gradients-interpolation-method@npm:4.0.11" + version: 4.0.12 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:4.0.12" dependencies: - "@csstools/css-color-parser": ^1.5.2 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/css-color-parser": ^1.6.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 peerDependencies: postcss: ^8.4 - checksum: 788affb86d16ef00b1aa8e239c5b6e45bb78d5b67842cbd9ab2bad0227707a35abd2cfae28dbcfd00e578279ddeb3024b325e5d2c44315f4ebf051ec17fc14be + checksum: 1750d3427b2088d93cf1de259a17305dd2c335e6ed2f8ee4ce706b630aa095f8fe925ff0342a4602ca4fc84795c8ecf4e5417e275829eed9904b681d7def8b6c languageName: node linkType: hard "@csstools/postcss-hwb-function@npm:^3.0.9": - version: 3.0.9 - resolution: "@csstools/postcss-hwb-function@npm:3.0.9" + version: 3.0.10 + resolution: "@csstools/postcss-hwb-function@npm:3.0.10" dependencies: - "@csstools/css-color-parser": ^1.5.2 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/css-color-parser": ^1.6.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 peerDependencies: postcss: ^8.4 - checksum: 0dc5aaf5217410ebe7697f677e05fc772443e44b8106db62d3e5f267559bf4254ffe96e1f30e7475d031d6821197259218cbfd5d010c6fd0b877a91213b74326 + checksum: 40307744bea776f5ededd216016735323fa509185d4210b5b539944013dfb22e141d0b08f75b9f07eeffd66fab99c02c78219a9b1c528541fc5096bc3aff6eff languageName: node linkType: hard "@csstools/postcss-ic-unit@npm:^3.0.4": - version: 3.0.4 - resolution: "@csstools/postcss-ic-unit@npm:3.0.4" + version: 3.0.5 + resolution: "@csstools/postcss-ic-unit@npm:3.0.5" dependencies: - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 postcss-value-parser: ^4.2.0 peerDependencies: postcss: ^8.4 - checksum: 55852cf5cc078bce2888b84f982d29d267ae2c399cc609f7114df8716693c41f8e92b8b68f35f9b092c02dfebd52fcdead464c82abbdabb1d3ee8868bcd36977 + checksum: 55344ab77732f6ff609424b792023f2199b0f920a62895fb4db8c896e63c78f02777db20583e10ec93a80d938f3d77ae0b56f7331f072e1bc7e4f0789e7f9533 languageName: node linkType: hard @@ -6642,16 +6624,16 @@ __metadata: linkType: hard "@csstools/postcss-light-dark-function@npm:^1.0.0": - version: 1.0.0 - resolution: "@csstools/postcss-light-dark-function@npm:1.0.0" + version: 1.0.1 + resolution: "@csstools/postcss-light-dark-function@npm:1.0.1" dependencies: - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 peerDependencies: postcss: ^8.4 - checksum: 06490504eec3b2ef787f8e1ef112d1d2e4daaf5321f105a7e45124b19f2475048067a79ff96c8a6b16e631a176e7711327c9cf6f2ac4fd38327c3b0c7b1cd1b1 + checksum: 334e742470c037a7ac20238e13e292c0435b3a66978f791501634c1fe928ec2ee40a40f2ce07e70e85e8d374e6cfbfad61514e80d1a6037294b268637d02ad2e languageName: node linkType: hard @@ -6694,41 +6676,41 @@ __metadata: linkType: hard "@csstools/postcss-logical-viewport-units@npm:^2.0.6": - version: 2.0.6 - resolution: "@csstools/postcss-logical-viewport-units@npm:2.0.6" + version: 2.0.7 + resolution: "@csstools/postcss-logical-viewport-units@npm:2.0.7" dependencies: - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/css-tokenizer": ^2.2.4 "@csstools/utilities": ^1.0.0 peerDependencies: postcss: ^8.4 - checksum: 708ec5ed295d01224d9b424817921b43039c7626a18361cda0a9e5ac3e0fed3fe2e2117d1373e1273b35b98c7d954f39c4011a04fe0ed5e352e46d08a59afa23 + checksum: 93d9b95f94fb0c3a64974e847c1262ed09fe196b4c605eb197a76820360de79b1c20e28a9b2f796137bb8febc244368e6625acd9ae99935312b595d1e46f6ed7 languageName: node linkType: hard "@csstools/postcss-media-minmax@npm:^1.1.3": - version: 1.1.3 - resolution: "@csstools/postcss-media-minmax@npm:1.1.3" + version: 1.1.4 + resolution: "@csstools/postcss-media-minmax@npm:1.1.4" dependencies: - "@csstools/css-calc": ^1.1.7 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/media-query-list-parser": ^2.1.8 + "@csstools/css-calc": ^1.2.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/media-query-list-parser": ^2.1.9 peerDependencies: postcss: ^8.4 - checksum: 1fdfb33550e2cb0df766577e5a371f3e3f56de6c71d2b883a0243710796c4218e2bba65376796ce209646819d32ebd1265442c353fb61665dade7f934641461a + checksum: 630a1b8b1ac640b54edd1e4724ecd558b43b2ca5691dda76f1c25d1da331ff6d4f3808e30661d36f4a8ca7df341b9e4d8b0684e18d1cd2c3398089be380e64ec languageName: node linkType: hard "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^2.0.6": - version: 2.0.6 - resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:2.0.6" + version: 2.0.7 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:2.0.7" dependencies: - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/media-query-list-parser": ^2.1.8 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/media-query-list-parser": ^2.1.9 peerDependencies: postcss: ^8.4 - checksum: 8ff8a925b7576364ea4f65366aaa26cf7ec9c8c834967f9cdb8eed7dde3ae9d42dee9c9f3684a039994ecac48b52586b39d6e360030ad724f52cdc1273febd10 + checksum: da0cd95f53328242578386175ea26821469e898a58b1fc1c16d1f7b7c16c5715cf4579c01e9111a8cb5ff30be50f867cd99bbc06cd46227feb69d6e74ae4cd76 languageName: node linkType: hard @@ -6756,43 +6738,43 @@ __metadata: linkType: hard "@csstools/postcss-oklab-function@npm:^3.0.10": - version: 3.0.10 - resolution: "@csstools/postcss-oklab-function@npm:3.0.10" + version: 3.0.11 + resolution: "@csstools/postcss-oklab-function@npm:3.0.11" dependencies: - "@csstools/css-color-parser": ^1.5.2 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/css-color-parser": ^1.6.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 peerDependencies: postcss: ^8.4 - checksum: ebdead8f27fd965ce9d8e81dd5d49164cc6d381203dd6016e7fb8cd4d1257d6d4dc4f47608470559d4a26c3a487cb8fbc948a0acd5149da3bfd5aae8f68de122 + checksum: 00590f728828128fd3ffb2d70e7c1c5184aa23996f786ea8c6dc8fc62c0e9fe678cd7369a3ea34f1600e6ad1b5ff72d2abf135bf99b81a5fe0b192ebc53ce3c8 languageName: node linkType: hard -"@csstools/postcss-progressive-custom-properties@npm:^3.1.0": - version: 3.1.0 - resolution: "@csstools/postcss-progressive-custom-properties@npm:3.1.0" +"@csstools/postcss-progressive-custom-properties@npm:^3.1.0, @csstools/postcss-progressive-custom-properties@npm:^3.1.1": + version: 3.1.1 + resolution: "@csstools/postcss-progressive-custom-properties@npm:3.1.1" dependencies: postcss-value-parser: ^4.2.0 peerDependencies: postcss: ^8.4 - checksum: a668e46bcdb1ceeb195c5977385450c383f1c366aaaf045fd72f78bb489260c56e610e0835816fc1b62c7eb0ece696fa4b1522aa5f5b7d7322cca7db9889db9a + checksum: 8738e5e7c01af567a0e16db13baeccc4533cb5af63a6de5561cec562940bea55484d202454f0cfd8caebfdd9fac7e495430943e7d78c3d4403f65755b1865282 languageName: node linkType: hard "@csstools/postcss-relative-color-syntax@npm:^2.0.10": - version: 2.0.10 - resolution: "@csstools/postcss-relative-color-syntax@npm:2.0.10" + version: 2.0.11 + resolution: "@csstools/postcss-relative-color-syntax@npm:2.0.11" dependencies: - "@csstools/css-color-parser": ^1.5.2 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/css-color-parser": ^1.6.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 peerDependencies: postcss: ^8.4 - checksum: e99377b88b389505febe82cbcb5689a63bf579815ccb424e6ebb5fda67b96086c3dfb6272994901848ce3efa8b839b95b678cebdb7d57a48f9c266b9ca53c65f + checksum: f789e34fbfb0e2eb8d93b7410513283bf2cccfd4c0cb92421a56611fef56a5cb2d130d87a70c4dd9acdb1a5e1b163d28790238a0fcf5944d27ffb7495b62fbbd languageName: node linkType: hard @@ -6808,15 +6790,15 @@ __metadata: linkType: hard "@csstools/postcss-stepped-value-functions@npm:^3.0.5": - version: 3.0.5 - resolution: "@csstools/postcss-stepped-value-functions@npm:3.0.5" + version: 3.0.6 + resolution: "@csstools/postcss-stepped-value-functions@npm:3.0.6" dependencies: - "@csstools/css-calc": ^1.1.7 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/css-calc": ^1.2.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 peerDependencies: postcss: ^8.4 - checksum: 2c021f1d0313e633231534ce357a53a9400cd14527755038636659555bd28a90359154721bcbe5fcde6abbb641d4cf4bd2a425c5819762ff9b7ca547c97beb48 + checksum: d83964febde62ea1336b63db8d82cfe428c05d0d8cf01fb3e33fabcf10ddd6818c8ac2045000d0b9d0610019e735daef8e84e7f8d714a0d49da2154680ae5ef9 languageName: node linkType: hard @@ -6833,15 +6815,15 @@ __metadata: linkType: hard "@csstools/postcss-trigonometric-functions@npm:^3.0.5": - version: 3.0.5 - resolution: "@csstools/postcss-trigonometric-functions@npm:3.0.5" + version: 3.0.6 + resolution: "@csstools/postcss-trigonometric-functions@npm:3.0.6" dependencies: - "@csstools/css-calc": ^1.1.7 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/css-calc": ^1.2.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 peerDependencies: postcss: ^8.4 - checksum: c33ad95276390ab76d8f4d4d2c9b7cba9fee5f82e92da78b12734b2e4379555c8f862a90aa1e13e7f8e9fb6d7c379e9dc939ecfadfca6775b23720cc47678978 + checksum: 7ee7076e517a56f4b7db4a5c286583d99f9eaca1b336c521f68439bac75b919390bcf5cc8bbffe7ca4f711017ab51ea32adae2f90aebc02a4978e05907d3c2cf languageName: node linkType: hard @@ -10967,13 +10949,13 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/abort-controller@npm:2.1.4" +"@smithy/abort-controller@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/abort-controller@npm:2.2.0" dependencies: - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: d2f3352f9facf0e60b206177d4fc1f3996cade4549d0675fe77c4af5c1c4d3bd1d7c5c4b5071536a7cf5bdb6a292d66a08e19be361383727f97fb5a5c077d9a9 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: d0d7fcaa7b67b04c9ad825017110cc294ff06af07f8054ac3b75d8de88ff5fbef1d08f5c1ae672db1839d14ce25f277c459d2b7b7263cbe9e6c3d4518a19230e languageName: node linkType: hard @@ -11022,16 +11004,16 @@ __metadata: languageName: node linkType: hard -"@smithy/config-resolver@npm:^2.1.4, @smithy/config-resolver@npm:^2.1.5": - version: 2.1.5 - resolution: "@smithy/config-resolver@npm:2.1.5" +"@smithy/config-resolver@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/config-resolver@npm:2.2.0" dependencies: - "@smithy/node-config-provider": ^2.2.5 - "@smithy/types": ^2.11.0 - "@smithy/util-config-provider": ^2.2.1 - "@smithy/util-middleware": ^2.1.4 - tslib: ^2.5.0 - checksum: fd56ec60a97fc094971593ddbb1ee8b7e0a27f2731a34a6a3d0acdc817313b0b75e76b1668f8322d2e9a296c8530b5f37e2e479bb185ff954eba86984df54493 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-config-provider": ^2.3.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: dcb15d40faf46c370cd83dfbf1e632fae29c64c500b33b53850a520cfb02c9fa6f7e239c07824793b47645462567d51cb1554c02f9ec4531bd51bc759aede2ed languageName: node linkType: hard @@ -11051,19 +11033,19 @@ __metadata: languageName: node linkType: hard -"@smithy/core@npm:^1.3.5": - version: 1.3.7 - resolution: "@smithy/core@npm:1.3.7" +"@smithy/core@npm:^1.4.0": + version: 1.4.0 + resolution: "@smithy/core@npm:1.4.0" dependencies: - "@smithy/middleware-endpoint": ^2.4.6 - "@smithy/middleware-retry": ^2.1.6 - "@smithy/middleware-serde": ^2.2.1 - "@smithy/protocol-http": ^3.2.2 - "@smithy/smithy-client": ^2.4.4 - "@smithy/types": ^2.11.0 - "@smithy/util-middleware": ^2.1.4 - tslib: ^2.5.0 - checksum: 90b8225ffebd1a1af92d905e7ca26a74ae49f6983efd23da998b60392093eef3af0bff973c5c825f273d8e510e0aa689549ac2f2d997f027c22d457ba145a300 + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-retry": ^2.2.0 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 3fbec263e4b40af33be38a7555167e30f0e1f2bec27635ae75ace8f80c53cd9c474fc9b73f856b308f7da08db9281d7d31b2b51781611278bfe4164512882a7e languageName: node linkType: hard @@ -11106,16 +11088,16 @@ __metadata: languageName: node linkType: hard -"@smithy/credential-provider-imds@npm:^2.2.3, @smithy/credential-provider-imds@npm:^2.2.6": - version: 2.2.6 - resolution: "@smithy/credential-provider-imds@npm:2.2.6" +"@smithy/credential-provider-imds@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/credential-provider-imds@npm:2.3.0" dependencies: - "@smithy/node-config-provider": ^2.2.5 - "@smithy/property-provider": ^2.1.4 - "@smithy/types": ^2.11.0 - "@smithy/url-parser": ^2.1.4 - tslib: ^2.5.0 - checksum: 4cf810affb121eccb34b0df97ebd8c6d0ead5a5238c34cead87fb15940c20c40b4fb9d91997a112b91e439c6bad3c6ebfe4bac934a30966b1215735992e18583 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + tslib: ^2.6.2 + checksum: dd57e09e60bd51ed103f7a5363a43e1373470ea3cee04ace66f5bbaafab005355ffbfa3e137e2ecac34aa28911fb5b6ecac60845846c6a4a5432f3e57a74b837 languageName: node linkType: hard @@ -11143,15 +11125,15 @@ __metadata: languageName: node linkType: hard -"@smithy/eventstream-codec@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/eventstream-codec@npm:2.1.4" +"@smithy/eventstream-codec@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/eventstream-codec@npm:2.2.0" dependencies: "@aws-crypto/crc32": 3.0.0 - "@smithy/types": ^2.11.0 - "@smithy/util-hex-encoding": ^2.1.1 - tslib: ^2.5.0 - checksum: 2dff83b78030c7ff5c76001bcb24a6a0e16f15eb6cd953b0fae7d719ed0c1b88b6310cf2179b6763e6112aa1152ad45616908f40921892fe07521435e47edc27 + "@smithy/types": ^2.12.0 + "@smithy/util-hex-encoding": ^2.2.0 + tslib: ^2.6.2 + checksum: ae59067964e19c6728b1be74a6e19793e4d3decdcbcea546bd40f77c3cc1eacc48c30272ef68927ba477c2b6450d023474f2dec516dfd93e204150ba18cab697 languageName: node linkType: hard @@ -11237,16 +11219,16 @@ __metadata: languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^2.4.3, @smithy/fetch-http-handler@npm:^2.4.4": - version: 2.4.4 - resolution: "@smithy/fetch-http-handler@npm:2.4.4" +"@smithy/fetch-http-handler@npm:^2.5.0": + version: 2.5.0 + resolution: "@smithy/fetch-http-handler@npm:2.5.0" dependencies: - "@smithy/protocol-http": ^3.2.2 - "@smithy/querystring-builder": ^2.1.4 - "@smithy/types": ^2.11.0 - "@smithy/util-base64": ^2.2.0 - tslib: ^2.5.0 - checksum: 108523b3634c9a6e503e1ee967e730cb12736a8b0f25a9dc5b3adc9b739051e521b71718577b28ca226c97c9b315dcfab9a1d3a5c71a9fbbfaf017dc2b1ca6af + "@smithy/protocol-http": ^3.3.0 + "@smithy/querystring-builder": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/util-base64": ^2.3.0 + tslib: ^2.6.2 + checksum: 91a58ac32c6b4afc6d7fb2b9ac3e3b817171f76e09b013a6506308b044455054444a92e1acbd8f98bdd159b15fdd44b1e3fb52c21cbb2e69be8e3698d2206021 languageName: node linkType: hard @@ -11286,15 +11268,15 @@ __metadata: languageName: node linkType: hard -"@smithy/hash-node@npm:^2.1.3": - version: 2.1.4 - resolution: "@smithy/hash-node@npm:2.1.4" +"@smithy/hash-node@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/hash-node@npm:2.2.0" dependencies: - "@smithy/types": ^2.11.0 - "@smithy/util-buffer-from": ^2.1.1 - "@smithy/util-utf8": ^2.2.0 - tslib: ^2.5.0 - checksum: 26336562b038f9dbbd0c26993a233b612245bf98c5af90976dc577418159136df4cded8db1606bf67030db3ed13d4c6502a9a66f59e06bdd6ef4b932f76fa6da + "@smithy/types": ^2.12.0 + "@smithy/util-buffer-from": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 3305b5778fa99558375b16629ad98fd00a1fb33ea905037977b0a7c93d92c8de1481756ef7dbc004e45210b23f983dec04bcd13d43c98f36a5f47291cbed9d89 languageName: node linkType: hard @@ -11329,13 +11311,13 @@ __metadata: languageName: node linkType: hard -"@smithy/invalid-dependency@npm:^2.1.3": - version: 2.1.4 - resolution: "@smithy/invalid-dependency@npm:2.1.4" +"@smithy/invalid-dependency@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/invalid-dependency@npm:2.2.0" dependencies: - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: de8c20feb7ae82f992c2edf6da6a77d5768d9c92e0fe983f62cbe1be418e576fceea3ae722b8349772e2654a7f8ac489785df8dcdcf416bec230ddb397c3e462 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: ed17980ccdf4c564cfcb517f3959dfeb7c7dbddd76eaf2c9e10031ebd19e78e56609df3377626215e51a6c4b98db03cfa88ad46f15ba26bb55c34351f3182a98 languageName: node linkType: hard @@ -11348,12 +11330,12 @@ __metadata: languageName: node linkType: hard -"@smithy/is-array-buffer@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/is-array-buffer@npm:2.1.1" +"@smithy/is-array-buffer@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/is-array-buffer@npm:2.2.0" dependencies: - tslib: ^2.5.0 - checksum: 5dbf9ed59715c871321d0624e3842340c1d662d2e8b78313d1658d39eb793b3ac5c379d573eba0a2ca3add9b313848d4d93fd04bb8565c75fbab749928b239a6 + tslib: ^2.6.2 + checksum: cd12c2e27884fec89ca8966d33c9dc34d3234efe89b33a9b309c61ebcde463e6f15f6a02d31d4fddbfd6e5904743524ca5b95021b517b98fe10957c2da0cd5fc languageName: node linkType: hard @@ -11390,14 +11372,14 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^2.1.3": - version: 2.1.4 - resolution: "@smithy/middleware-content-length@npm:2.1.4" +"@smithy/middleware-content-length@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/middleware-content-length@npm:2.2.0" dependencies: - "@smithy/protocol-http": ^3.2.2 - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: 06b84447bc4984ce737281fc1fde6a56c4e6e31846982bd03d889d09614c50307b7345c478a1a8cb11c13faa9eb868c38a36b0c8b204c5795b6259b1aefcb3af + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 1eae8d2b6f432ce9a849e741d4f2426baee8a51f22a5262c11802e125078ee33d9d8f4183fb142043ba9d1371adad9c835c784333a394d865fb248339f7482e6 languageName: node linkType: hard @@ -11444,18 +11426,18 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^2.4.4, @smithy/middleware-endpoint@npm:^2.4.6": - version: 2.4.6 - resolution: "@smithy/middleware-endpoint@npm:2.4.6" +"@smithy/middleware-endpoint@npm:^2.5.0": + version: 2.5.0 + resolution: "@smithy/middleware-endpoint@npm:2.5.0" dependencies: - "@smithy/middleware-serde": ^2.2.1 - "@smithy/node-config-provider": ^2.2.5 - "@smithy/shared-ini-file-loader": ^2.3.5 - "@smithy/types": ^2.11.0 - "@smithy/url-parser": ^2.1.4 - "@smithy/util-middleware": ^2.1.4 - tslib: ^2.5.0 - checksum: e4e144b8f27ad25c342138872f32d7a97887433a99f2c3a925479504695247f09aa3afef131e27aec7bf8f6fd21e9720ced56b32c916ab535a514c6043b8d837 + "@smithy/middleware-serde": ^2.3.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + "@smithy/url-parser": ^2.2.0 + "@smithy/util-middleware": ^2.2.0 + tslib: ^2.6.2 + checksum: 1243567c611d33995dcfb48b5468fbe636db7c2303abafd6a311e6350926f6960c08b58cd5d2133e58b3e13b21f765b281b78b78d14b21092b8bb7cf12de0e76 languageName: node linkType: hard @@ -11492,20 +11474,20 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-retry@npm:^2.1.4, @smithy/middleware-retry@npm:^2.1.6": - version: 2.1.6 - resolution: "@smithy/middleware-retry@npm:2.1.6" - dependencies: - "@smithy/node-config-provider": ^2.2.5 - "@smithy/protocol-http": ^3.2.2 - "@smithy/service-error-classification": ^2.1.4 - "@smithy/smithy-client": ^2.4.4 - "@smithy/types": ^2.11.0 - "@smithy/util-middleware": ^2.1.4 - "@smithy/util-retry": ^2.1.4 - tslib: ^2.5.0 +"@smithy/middleware-retry@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/middleware-retry@npm:2.2.0" + dependencies: + "@smithy/node-config-provider": ^2.3.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/service-error-classification": ^2.1.5 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-retry": ^2.2.0 + tslib: ^2.6.2 uuid: ^8.3.2 - checksum: f5d32795fd8a96817028e4174616f9f457a9c1c69806467dded124c369bb7650d93652f23b49811ba881500d33bc0b00e0b296e3fc731f042ff06298516c0ee2 + checksum: f0f0ec06b798a0323168b151caf6b1b54078a0e71da6115dfe1b6465873dcde2689216a3aa12d7eea19f651f2883a2e4ed2ee529f7fcc18979ac378b10f8b3ac languageName: node linkType: hard @@ -11539,13 +11521,13 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-serde@npm:^2.1.3, @smithy/middleware-serde@npm:^2.2.1": - version: 2.2.1 - resolution: "@smithy/middleware-serde@npm:2.2.1" +"@smithy/middleware-serde@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/middleware-serde@npm:2.3.0" dependencies: - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: af994fbc1b9bb5bfd48530948764bd1c6112aa945cb539b66b145c5e645e065ae340dc943ca8f25a4317c5c8434fc85823bb3276d5e82f25cae21c23ebbb29a2 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 5393370c0f8a820d8ca36eccecff5b6434c4f81fbaad8800088fb4c8dad5312bf3eb47f67533784de959807bbb3379c23d81a1bcbaf8824254034dd2b83fd76b languageName: node linkType: hard @@ -11579,13 +11561,13 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-stack@npm:^2.1.3, @smithy/middleware-stack@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/middleware-stack@npm:2.1.4" +"@smithy/middleware-stack@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/middleware-stack@npm:2.2.0" dependencies: - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: 71cc9c5d7ca40c00a10d3337d5dd6cb4263a45f7ba97d4fab415ced4342835561c17da9fc44f06dd7b34ee167abe8ca83a025df90f99705c29e70449130000c9 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 293d76764e327a5ada4ea7de268f451e62a6a56983ba7dcdbc63fdbb0427c01071a9a81d7807b16586977df829ce5d9587facbd9367b089841bbc9fc329ce6af languageName: node linkType: hard @@ -11637,15 +11619,15 @@ __metadata: languageName: node linkType: hard -"@smithy/node-config-provider@npm:^2.2.4, @smithy/node-config-provider@npm:^2.2.5": - version: 2.2.5 - resolution: "@smithy/node-config-provider@npm:2.2.5" +"@smithy/node-config-provider@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/node-config-provider@npm:2.3.0" dependencies: - "@smithy/property-provider": ^2.1.4 - "@smithy/shared-ini-file-loader": ^2.3.5 - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: 935955edb3f3a04aa7c55862fa531668398f2a797b20d86268d5a599bfc295588150e05e8903b462ba1c126eb0778ba2aa5e87e9785d052f6a08d68a8fbc4e3c + "@smithy/property-provider": ^2.2.0 + "@smithy/shared-ini-file-loader": ^2.4.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 9c1dc6d97e0379d947498e7d64e593ea183d5f2c89dace4561c1c613850bf264581b597105c15d64ceabdea954e57ad8e6bf9e42642ddc3f737464f350ffbb5b languageName: node linkType: hard @@ -11688,16 +11670,16 @@ __metadata: languageName: node linkType: hard -"@smithy/node-http-handler@npm:^2.4.1, @smithy/node-http-handler@npm:^2.4.2": - version: 2.4.2 - resolution: "@smithy/node-http-handler@npm:2.4.2" +"@smithy/node-http-handler@npm:^2.5.0": + version: 2.5.0 + resolution: "@smithy/node-http-handler@npm:2.5.0" dependencies: - "@smithy/abort-controller": ^2.1.4 - "@smithy/protocol-http": ^3.2.2 - "@smithy/querystring-builder": ^2.1.4 - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: 382edcd584f43309acaf4109627b9ce9e8b0d8b2fe61da85785a68fc77bb1e4b77843f70835af59ee64ce5794c1f59b37b3da4ce0a608c2d34904b377d2d45db + "@smithy/abort-controller": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/querystring-builder": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 2e63fafdac5bef62181994af2ec065b0f7f04eaed88fb2990a21a9925226fead5013cf4f232b527f3f4d9ffb68ccbe8cd263ad22a7351d36b0dc23e975929a0c languageName: node linkType: hard @@ -11741,13 +11723,13 @@ __metadata: languageName: node linkType: hard -"@smithy/property-provider@npm:^2.1.3, @smithy/property-provider@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/property-provider@npm:2.1.4" +"@smithy/property-provider@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/property-provider@npm:2.2.0" dependencies: - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: da228c4da5433b8bd682f2c1b86193bb1e2777c7cafc658cfdf0e5f07c7148e79204878887abe421387d3e8daced74bb8dbf36a9558d0bf7d2cc56c7407cbd9b + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 8d257cbc5222baf6706e288c3b51196588f135878141f8af76fcb3f0abafc027ed46cf4bb938266d1906111175082ee85f73806d5a2b1c929aee16ec8b5283e6 languageName: node linkType: hard @@ -11781,13 +11763,13 @@ __metadata: languageName: node linkType: hard -"@smithy/protocol-http@npm:^3.2.1, @smithy/protocol-http@npm:^3.2.2": - version: 3.2.2 - resolution: "@smithy/protocol-http@npm:3.2.2" +"@smithy/protocol-http@npm:^3.3.0": + version: 3.3.0 + resolution: "@smithy/protocol-http@npm:3.3.0" dependencies: - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: 8c5a6ac4d0611b955ef86c837ebaad5d8f988b78af9265656983f80fd20eb0968fb9f734e751bd6db30f6e297176c35a84e3818a7064b6de5e40e303b3f51ccd + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 6c1aaaee9f6ecfb841766938312268f30cbda253f172de7467463aae7d7bfea19a801ab570f3737334e992d2d0ee7446e6af6a6fd82b08533790c489289dff76 languageName: node linkType: hard @@ -11824,14 +11806,14 @@ __metadata: languageName: node linkType: hard -"@smithy/querystring-builder@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/querystring-builder@npm:2.1.4" +"@smithy/querystring-builder@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/querystring-builder@npm:2.2.0" dependencies: - "@smithy/types": ^2.11.0 - "@smithy/util-uri-escape": ^2.1.1 - tslib: ^2.5.0 - checksum: 58e7dd59efc59bcb88a76f3116301cd818730e5c8dea0d3adba76f0b0e2730e67e594cd882b9adb3b6c06c00980349c4dbbe578dadd6f4d96629f95493d9ac43 + "@smithy/types": ^2.12.0 + "@smithy/util-uri-escape": ^2.2.0 + tslib: ^2.6.2 + checksum: db492903302a694a0e982c37b9a74314160c5ee485742f24f8b6d0da66f121e7ff8588742a3a1964f6b983c15cacd52b883c5efa714882a754f575da7a7e014d languageName: node linkType: hard @@ -11875,13 +11857,13 @@ __metadata: languageName: node linkType: hard -"@smithy/querystring-parser@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/querystring-parser@npm:2.1.4" +"@smithy/querystring-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/querystring-parser@npm:2.2.0" dependencies: - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: 44eb148ae086a0b43f429c0478261f56132622a08ded6a5d1a685d3c80a282e78a4d38b6a4d00d8609a8e8ed81c3c7959b0e8eaf295af096df582c837d24ac2f + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 9b27751c329fecc84bdfe7f128ab766c7e5f1d4bdda6184699a0df8999e95aef21fafc6179d6c693e519c78874e738fd9afb5ac4679901cb68d092a86a612419 languageName: node linkType: hard @@ -11903,12 +11885,12 @@ __metadata: languageName: node linkType: hard -"@smithy/service-error-classification@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/service-error-classification@npm:2.1.4" +"@smithy/service-error-classification@npm:^2.1.5": + version: 2.1.5 + resolution: "@smithy/service-error-classification@npm:2.1.5" dependencies: - "@smithy/types": ^2.11.0 - checksum: f36c21b259cc07cce310451bd2ef061084471d0a21899e27e28c119f9fba7faf473860ec6017de40e3a98f8b8005147186fd464fe63f0356a2febe62198f60c6 + "@smithy/types": ^2.12.0 + checksum: 00ac54110a258c7a47c62d4f655d4998bd40e5adb47e10281b28df7a585f2f1e960dc35325eac006636280e7fb2b81dbeb32b89e08bac87acc136c4d29a4dc53 languageName: node linkType: hard @@ -11952,13 +11934,13 @@ __metadata: languageName: node linkType: hard -"@smithy/shared-ini-file-loader@npm:^2.3.3, @smithy/shared-ini-file-loader@npm:^2.3.5": - version: 2.3.5 - resolution: "@smithy/shared-ini-file-loader@npm:2.3.5" +"@smithy/shared-ini-file-loader@npm:^2.4.0": + version: 2.4.0 + resolution: "@smithy/shared-ini-file-loader@npm:2.4.0" dependencies: - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: f8079b9b11fcd076e90b282f6702e683e03c8c20e81cd90c195d984a2944223be6ed6af094117982c77be18449e37c5bef79cfed49f049d3fec2c9e51b32de08 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: b0c9e045bfe2150e07f4b31ae7d69d3646679337df9fec1e1201b845cc64ea2250c37db8e8d0e7573fc3c11188164adba43bbaf32275fa8a9f70e8bbc77146bf languageName: node linkType: hard @@ -11978,19 +11960,19 @@ __metadata: languageName: node linkType: hard -"@smithy/signature-v4@npm:^2.1.3": - version: 2.1.4 - resolution: "@smithy/signature-v4@npm:2.1.4" - dependencies: - "@smithy/eventstream-codec": ^2.1.4 - "@smithy/is-array-buffer": ^2.1.1 - "@smithy/types": ^2.11.0 - "@smithy/util-hex-encoding": ^2.1.1 - "@smithy/util-middleware": ^2.1.4 - "@smithy/util-uri-escape": ^2.1.1 - "@smithy/util-utf8": ^2.2.0 - tslib: ^2.5.0 - checksum: 1e3084b9cb29eb320e6c32b891fed6b1cdbf8bf06efa886fa73a8dcea3e1793f4bcb5ae33ba2ae3b7f43934f98455b3e4ce695f73261d67b11f628dc74068f4a +"@smithy/signature-v4@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/signature-v4@npm:2.2.0" + dependencies: + "@smithy/eventstream-codec": ^2.2.0 + "@smithy/is-array-buffer": ^2.2.0 + "@smithy/types": ^2.12.0 + "@smithy/util-hex-encoding": ^2.2.0 + "@smithy/util-middleware": ^2.2.0 + "@smithy/util-uri-escape": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: c25b35545978f507d28df6742ac6e8c703cf7c45938fd3304ce29fee11f05b05a9cf2693eeda44ba4ce1b9deaeb995c41da9dfb752f55a1ae04f247336477fdd languageName: node linkType: hard @@ -12032,26 +12014,26 @@ __metadata: languageName: node linkType: hard -"@smithy/smithy-client@npm:^2.4.2, @smithy/smithy-client@npm:^2.4.4": - version: 2.4.4 - resolution: "@smithy/smithy-client@npm:2.4.4" +"@smithy/smithy-client@npm:^2.5.0": + version: 2.5.0 + resolution: "@smithy/smithy-client@npm:2.5.0" dependencies: - "@smithy/middleware-endpoint": ^2.4.6 - "@smithy/middleware-stack": ^2.1.4 - "@smithy/protocol-http": ^3.2.2 - "@smithy/types": ^2.11.0 - "@smithy/util-stream": ^2.1.4 - tslib: ^2.5.0 - checksum: 808c42ebb7dd5be22575f49c33ae694355ed9c3767759d0a1bc160d60b84937550d903856ec9b7be4820a587fc0178fc930a6ef6dbd6f4d8ce6314b1d87fc04e + "@smithy/middleware-endpoint": ^2.5.0 + "@smithy/middleware-stack": ^2.2.0 + "@smithy/protocol-http": ^3.3.0 + "@smithy/types": ^2.12.0 + "@smithy/util-stream": ^2.2.0 + tslib: ^2.6.2 + checksum: 37a26dd19bc413cd8132c8585588031a25984c24c475db47bae02476e05f698f17511947fc47b89c4ed4f10a29046ba3542d6d338428aeff35e1178a9ecc7a47 languageName: node linkType: hard -"@smithy/types@npm:^2.10.1, @smithy/types@npm:^2.11.0": - version: 2.11.0 - resolution: "@smithy/types@npm:2.11.0" +"@smithy/types@npm:^2.12.0": + version: 2.12.0 + resolution: "@smithy/types@npm:2.12.0" dependencies: - tslib: ^2.5.0 - checksum: 37a5fcf1bccaa1ad4c51696e1d65a4b439787631633deacaa610a492cc29454b97f3957f729c0101a35f89fd316d07867b7d81434b97ea96bc0d7b3a21439170 + tslib: ^2.6.2 + checksum: 2dd93746624d87afbf51c22116fc69f82e95004b78cf681c4a283d908155c22a2b7a3afbd64a3aff7deefb6619276f186e212422ad200df3b42c32ef5330374e languageName: node linkType: hard @@ -12135,14 +12117,14 @@ __metadata: languageName: node linkType: hard -"@smithy/url-parser@npm:^2.1.3, @smithy/url-parser@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/url-parser@npm:2.1.4" +"@smithy/url-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/url-parser@npm:2.2.0" dependencies: - "@smithy/querystring-parser": ^2.1.4 - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: 70961500fceff301eb73332de5b52176420606c72efe247255c0a601c9e1027ecf26e679073486659e2d20e4b344b72da660defec3de05f884321347272efb2e + "@smithy/querystring-parser": ^2.2.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: f21f1e44bc2a4634220465990651f5ee0708cb6759b3685b8a8c00cc2cd64bbbc7807f66cd79ec6e654f7245867d4fb4ced406ad5c14612ebc47eae3f34e63c5 languageName: node linkType: hard @@ -12166,14 +12148,14 @@ __metadata: languageName: node linkType: hard -"@smithy/util-base64@npm:^2.1.1, @smithy/util-base64@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-base64@npm:2.2.0" +"@smithy/util-base64@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-base64@npm:2.3.0" dependencies: - "@smithy/util-buffer-from": ^2.1.1 - "@smithy/util-utf8": ^2.2.0 - tslib: ^2.5.0 - checksum: 6963d7f9d614c9a441c9ee07372fb8e7955cba32262a7dfc8854f1d3accc152e961695988ca751881123ac515ca9ae68befc35811bc8b0b649ddca5bd1e8f591 + "@smithy/util-buffer-from": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: 2ce995c5d12037e9518bb2732f24090bc493d48118dfd6519faa41e19cd91863895bc0b5958b790d2cdeb919a8c410790dcffa3a452d560f0eeab73dc0c92cbd languageName: node linkType: hard @@ -12195,12 +12177,12 @@ __metadata: languageName: node linkType: hard -"@smithy/util-body-length-browser@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/util-body-length-browser@npm:2.1.1" +"@smithy/util-body-length-browser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-body-length-browser@npm:2.2.0" dependencies: - tslib: ^2.5.0 - checksum: 6f7808a41b57a5ab1334f0d036ecec6809a959bcfe6a200f985f35e0c96e72f34fdcb6154873f795835d1d927098055e2dec31ebfb5e5382d1c4c612c80a37c0 + tslib: ^2.6.2 + checksum: e9c1d16b3b95d529011476e6154eaf282d3a983204b29dcf1e7ef04a9f5c2deae30167e06190f315771c813c768f19f486d3139fe9fcaf34d12c2333350f3412 languageName: node linkType: hard @@ -12213,12 +12195,12 @@ __metadata: languageName: node linkType: hard -"@smithy/util-body-length-node@npm:^2.2.1": - version: 2.2.1 - resolution: "@smithy/util-body-length-node@npm:2.2.1" +"@smithy/util-body-length-node@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-body-length-node@npm:2.3.0" dependencies: - tslib: ^2.5.0 - checksum: 6bddc6fac7c9875ae7baaf6088d91192fbe4405bc5c1b69100d52aa1bfebabcc194f5f1b159d8f6f3ade3b54e416f185781970c30a97d4b0a7cec6d02fc490c4 + tslib: ^2.6.2 + checksum: 5d5c31b071e0b3222dcfe863ea2d179253f0dfaa30d03f40ebfa352ed292e00a451053cc523e27527e61094d5ed475069d2287ef19a857c6da0364ca71cfdf3c languageName: node linkType: hard @@ -12232,13 +12214,13 @@ __metadata: languageName: node linkType: hard -"@smithy/util-buffer-from@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/util-buffer-from@npm:2.1.1" +"@smithy/util-buffer-from@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-buffer-from@npm:2.2.0" dependencies: - "@smithy/is-array-buffer": ^2.1.1 - tslib: ^2.5.0 - checksum: 8dc7f9afaa356696f14a80cd983a750cbad8eba7c46498ed74fb8ec0cb307f14df64fb10ceb30b2d4792395bb8b216c89155a93dee0f2b3e5cab94fef459a195 + "@smithy/is-array-buffer": ^2.2.0 + tslib: ^2.6.2 + checksum: 424c5b7368ae5880a8f2732e298d17879a19ca925f24ca45e1c6c005f717bb15b76eb28174d308d81631ad457ea0088aab0fd3255dd42f45a535c81944ad64d3 languageName: node linkType: hard @@ -12260,12 +12242,12 @@ __metadata: languageName: node linkType: hard -"@smithy/util-config-provider@npm:^2.2.1": - version: 2.2.1 - resolution: "@smithy/util-config-provider@npm:2.2.1" +"@smithy/util-config-provider@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-config-provider@npm:2.3.0" dependencies: - tslib: ^2.5.0 - checksum: f5b34bcf6ef944779f20d7639070e87a521e1a5620e5a91f2d2dbd764824985930a68b71b0b2bde12e1eaac947155789b73a8c09c1aa7ab923f08e42a4173ef4 + tslib: ^2.6.2 + checksum: 0f3f113c2658bd5a79f98dc28d53ca9c0adf8ec3c8c86c7dd91d2cd37149b4cf83d85cc89d5fe67ffe5cd319ec85f139ef229844eb039017193b307a4c315399 languageName: node linkType: hard @@ -12295,16 +12277,16 @@ __metadata: languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^2.1.4": - version: 2.1.6 - resolution: "@smithy/util-defaults-mode-browser@npm:2.1.6" +"@smithy/util-defaults-mode-browser@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-defaults-mode-browser@npm:2.2.0" dependencies: - "@smithy/property-provider": ^2.1.4 - "@smithy/smithy-client": ^2.4.4 - "@smithy/types": ^2.11.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 bowser: ^2.11.0 - tslib: ^2.5.0 - checksum: 50ff53be5f8a4098078a742ff17892b0719a23a2afa8bcc5d13bfe28922b509dcf33dcab8dd71a04dfa73124aca269f42a40ea90a3c6cf34003f66914ca616df + tslib: ^2.6.2 + checksum: 4e9d40de4badac66bf786ff3e5bd795e6ccd99f078da5b74881570b0d1401df07441fb9c5abc04dd0735e3efd4f30ee3355f034d42939c1d16015bd7ec65e9b7 languageName: node linkType: hard @@ -12338,18 +12320,18 @@ __metadata: languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^2.2.3": - version: 2.2.6 - resolution: "@smithy/util-defaults-mode-node@npm:2.2.6" - dependencies: - "@smithy/config-resolver": ^2.1.5 - "@smithy/credential-provider-imds": ^2.2.6 - "@smithy/node-config-provider": ^2.2.5 - "@smithy/property-provider": ^2.1.4 - "@smithy/smithy-client": ^2.4.4 - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: 3a925b24c33defa990c7f62fd8498c77d62a7acbbf70464570fa472a757dd883804d7433d14a2ca0b1601da3f2e2a2f68a3edef11707f79253b5f6aaf30585ff +"@smithy/util-defaults-mode-node@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-defaults-mode-node@npm:2.3.0" + dependencies: + "@smithy/config-resolver": ^2.2.0 + "@smithy/credential-provider-imds": ^2.3.0 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/property-provider": ^2.2.0 + "@smithy/smithy-client": ^2.5.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: d7dc243ec364b2b246dbeb096b305c4aaa8b95950c7cd716a5dcf69b70255ae06595009f944924589ae798fb4cb2638a814252daf0d843980cb3facf99086836 languageName: node linkType: hard @@ -12364,14 +12346,14 @@ __metadata: languageName: node linkType: hard -"@smithy/util-endpoints@npm:^1.1.4": - version: 1.1.5 - resolution: "@smithy/util-endpoints@npm:1.1.5" +"@smithy/util-endpoints@npm:^1.2.0": + version: 1.2.0 + resolution: "@smithy/util-endpoints@npm:1.2.0" dependencies: - "@smithy/node-config-provider": ^2.2.5 - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: a4136c7b3822589c18ef1c4c7ebaca060e7bfc1e09441126e14b56b4409658380e0c99bc1cc2fd907caf46386dc6526f40b412f978b7353efbbf3b906461e7b7 + "@smithy/node-config-provider": ^2.3.0 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 19a59b1c9b214457371d4d7109b190c237de5ebd06f5b4f3665dddc5fe0879dbb19bcdc5dec23d1825cd04388b7f9bf7fddf354e1a23e84d9c690ad21e71cb86 languageName: node linkType: hard @@ -12384,12 +12366,12 @@ __metadata: languageName: node linkType: hard -"@smithy/util-hex-encoding@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/util-hex-encoding@npm:2.1.1" +"@smithy/util-hex-encoding@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-hex-encoding@npm:2.2.0" dependencies: - tslib: ^2.5.0 - checksum: eae5c94fd4d57dccbae5ad4d7684787b1e9b1df944cf9fcb497cbefaed6aec49c0a777cc1ea4d10fa7002b82f0b73b8830ae2efe98ed35a62dcf3c4f7d08a4cd + tslib: ^2.6.2 + checksum: 7d14589bc4a44eebf878595290c53ee4d90cc6b5445b5fe130608d6dea477c292730b85e4e08190a1555ef7664214f0f00dc478ba725516787a49fff658e725e languageName: node linkType: hard @@ -12433,13 +12415,13 @@ __metadata: languageName: node linkType: hard -"@smithy/util-middleware@npm:^2.1.3, @smithy/util-middleware@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/util-middleware@npm:2.1.4" +"@smithy/util-middleware@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-middleware@npm:2.2.0" dependencies: - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: 5eb69236cde6e871ef9d15b64a6b7fdab0c506240d25bec8f131484d0b5ea38fb51c1b435b9ddedb23afff303c7aa7830dcc7d1c82b718682b136538d605cec3 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 312dc86e5415a12e2580a02311750b350aec8fb9da5a60c3010c10694990ded869b7ca5b87aa20e5facbacdd233e928e418b7765d7797019cd48177052aedd03 languageName: node linkType: hard @@ -12465,14 +12447,14 @@ __metadata: languageName: node linkType: hard -"@smithy/util-retry@npm:^2.1.3, @smithy/util-retry@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/util-retry@npm:2.1.4" +"@smithy/util-retry@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-retry@npm:2.2.0" dependencies: - "@smithy/service-error-classification": ^2.1.4 - "@smithy/types": ^2.11.0 - tslib: ^2.5.0 - checksum: e6cccc8ea29098610af703bcfad13a6abc237dfa8dae615189a6d8e92aa997e3dfed4ad162cd96e821de4d6b592f93fe41b9aec8867bb768a09217cea33f808c + "@smithy/service-error-classification": ^2.1.5 + "@smithy/types": ^2.12.0 + tslib: ^2.6.2 + checksum: 1a8071c8ac5a2646b3d3894e3bd9c36a9db045f52eadb194f32b02d2fdedd69fb267a2b02bcef9f91d0f8f3fe061754ac075d07ac166d90894acb27d68c62a41 languageName: node linkType: hard @@ -12524,19 +12506,19 @@ __metadata: languageName: node linkType: hard -"@smithy/util-stream@npm:^2.1.3, @smithy/util-stream@npm:^2.1.4": - version: 2.1.4 - resolution: "@smithy/util-stream@npm:2.1.4" - dependencies: - "@smithy/fetch-http-handler": ^2.4.4 - "@smithy/node-http-handler": ^2.4.2 - "@smithy/types": ^2.11.0 - "@smithy/util-base64": ^2.2.0 - "@smithy/util-buffer-from": ^2.1.1 - "@smithy/util-hex-encoding": ^2.1.1 - "@smithy/util-utf8": ^2.2.0 - tslib: ^2.5.0 - checksum: 2b510eb081a14b088c46773fa27e3475bbaf82587dca026c6715034b5fc086571167cd4faaffabf562c52cc7e73c07719e4a7a38a9df824d41d7b5a1dabbb8b9 +"@smithy/util-stream@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-stream@npm:2.2.0" + dependencies: + "@smithy/fetch-http-handler": ^2.5.0 + "@smithy/node-http-handler": ^2.5.0 + "@smithy/types": ^2.12.0 + "@smithy/util-base64": ^2.3.0 + "@smithy/util-buffer-from": ^2.2.0 + "@smithy/util-hex-encoding": ^2.2.0 + "@smithy/util-utf8": ^2.3.0 + tslib: ^2.6.2 + checksum: f0febd1a7558201d9178c0018478f89729800e9b8962dc735ec99f41ce01d1128373e3bd6008f0b4ff79b25ee4476db4fd5fa18d6feeb8b5b715d416da7027c3 languageName: node linkType: hard @@ -12549,12 +12531,12 @@ __metadata: languageName: node linkType: hard -"@smithy/util-uri-escape@npm:^2.1.1": - version: 2.1.1 - resolution: "@smithy/util-uri-escape@npm:2.1.1" +"@smithy/util-uri-escape@npm:^2.2.0": + version: 2.2.0 + resolution: "@smithy/util-uri-escape@npm:2.2.0" dependencies: - tslib: ^2.5.0 - checksum: 822ed7390e28d5c7b8dab5e5c5a8de998e0778220137962a71b47b2d8900289d48a3a2c9945e68e1cac921d43f61660045e7fdffe8df9e63004575fcf2aa99b2 + tslib: ^2.6.2 + checksum: bade35312d75d1c84226f2a81b70dfef91766c02ecb6c6854b6f920cddb423e01963f7d0c183d523b5991f8e7ca93bcf73f8b3c6923979152b8350c9f3c24fd6 languageName: node linkType: hard @@ -12578,13 +12560,13 @@ __metadata: languageName: node linkType: hard -"@smithy/util-utf8@npm:^2.1.1, @smithy/util-utf8@npm:^2.2.0": - version: 2.2.0 - resolution: "@smithy/util-utf8@npm:2.2.0" +"@smithy/util-utf8@npm:^2.3.0": + version: 2.3.0 + resolution: "@smithy/util-utf8@npm:2.3.0" dependencies: - "@smithy/util-buffer-from": ^2.1.1 - tslib: ^2.5.0 - checksum: f86c4cf0b9462f6c1d75d38f57ea9427e7e95cc4c7740c0b6b464a94d79cb47a7c6f729eae212dd28051133ccd7e99f679fa8c267fa1772f7834e9805ebbab69 + "@smithy/util-buffer-from": ^2.2.0 + tslib: ^2.6.2 + checksum: 00e55d4b4e37d48be0eef3599082402b933c52a1407fed7e8e8ad76d94d81a0b30b8bfaf2047c59d9c3af31e5f20e7a8c959cb7ae270f894255e05a2229964f0 languageName: node linkType: hard @@ -14365,13 +14347,13 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.11.6, @webassemblyjs/ast@npm:^1.11.5": - version: 1.11.6 - resolution: "@webassemblyjs/ast@npm:1.11.6" +"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.11.5": + version: 1.12.1 + resolution: "@webassemblyjs/ast@npm:1.12.1" dependencies: "@webassemblyjs/helper-numbers": 1.11.6 "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - checksum: 38ef1b526ca47c210f30975b06df2faf1a8170b1636ce239fc5738fc231ce28389dd61ecedd1bacfc03cbe95b16d1af848c805652080cb60982836eb4ed2c6cf + checksum: 31bcc64147236bd7b1b6d29d1f419c1f5845c785e1e42dc9e3f8ca2e05a029e9393a271b84f3a5bff2a32d35f51ff59e2181a6e5f953fe88576acd6750506202 languageName: node linkType: hard @@ -14389,10 +14371,10 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-buffer@npm:1.11.6" - checksum: b14d0573bf680d22b2522e8a341ec451fddd645d1f9c6bd9012ccb7e587a2973b86ab7b89fe91e1c79939ba96095f503af04369a3b356c8023c13a5893221644 +"@webassemblyjs/helper-buffer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" + checksum: c3ffb723024130308db608e86e2bdccd4868bbb62dffb0a9a1530606496f79c87f8565bd8e02805ce64912b71f1a70ee5fb00307258b0c082c3abf961d097eca languageName: node linkType: hard @@ -14414,15 +14396,15 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.6" +"@webassemblyjs/helper-wasm-section@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 - "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/wasm-gen": 1.11.6 - checksum: b2cf751bf4552b5b9999d27bbb7692d0aca75260140195cb58ea6374d7b9c2dc69b61e10b211a0e773f66209c3ddd612137ed66097e3684d7816f854997682e9 + "@webassemblyjs/wasm-gen": 1.12.1 + checksum: c19810cdd2c90ff574139b6d8c0dda254d42d168a9e5b3d353d1bc085f1d7164ccd1b3c05592a45a939c47f7e403dc8d03572bb686642f06a3d02932f6f0bc8f languageName: node linkType: hard @@ -14452,67 +14434,67 @@ __metadata: linkType: hard "@webassemblyjs/wasm-edit@npm:^1.11.5": - version: 1.11.6 - resolution: "@webassemblyjs/wasm-edit@npm:1.11.6" + version: 1.12.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 - "@webassemblyjs/helper-buffer": 1.11.6 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/helper-wasm-section": 1.11.6 - "@webassemblyjs/wasm-gen": 1.11.6 - "@webassemblyjs/wasm-opt": 1.11.6 - "@webassemblyjs/wasm-parser": 1.11.6 - "@webassemblyjs/wast-printer": 1.11.6 - checksum: 29ce75870496d6fad864d815ebb072395a8a3a04dc9c3f4e1ffdc63fc5fa58b1f34304a1117296d8240054cfdbc38aca88e71fb51483cf29ffab0a61ef27b481 + "@webassemblyjs/helper-wasm-section": 1.12.1 + "@webassemblyjs/wasm-gen": 1.12.1 + "@webassemblyjs/wasm-opt": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 + "@webassemblyjs/wast-printer": 1.12.1 + checksum: ae23642303f030af888d30c4ef37b08dfec7eab6851a9575a616e65d1219f880d9223913a39056dd654e49049d76e97555b285d1f7e56935047abf578cce0692 languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/wasm-gen@npm:1.11.6" +"@webassemblyjs/wasm-gen@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/ast": 1.12.1 "@webassemblyjs/helper-wasm-bytecode": 1.11.6 "@webassemblyjs/ieee754": 1.11.6 "@webassemblyjs/leb128": 1.11.6 "@webassemblyjs/utf8": 1.11.6 - checksum: a645a2eecbea24833c3260a249704a7f554ef4a94c6000984728e94bb2bc9140a68dfd6fd21d5e0bbb09f6dfc98e083a45760a83ae0417b41a0196ff6d45a23a + checksum: 5787626bb7f0b033044471ddd00ce0c9fe1ee4584e8b73e232051e3a4c99ba1a102700d75337151c8b6055bae77eefa4548960c610a5e4a504e356bd872138ff languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/wasm-opt@npm:1.11.6" +"@webassemblyjs/wasm-opt@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 - "@webassemblyjs/helper-buffer": 1.11.6 - "@webassemblyjs/wasm-gen": 1.11.6 - "@webassemblyjs/wasm-parser": 1.11.6 - checksum: b4557f195487f8e97336ddf79f7bef40d788239169aac707f6eaa2fa5fe243557c2d74e550a8e57f2788e70c7ae4e7d32f7be16101afe183d597b747a3bdd528 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 + "@webassemblyjs/wasm-gen": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 + checksum: 0e8fa8a0645304a1e18ff40d3db5a2e9233ebaa169b19fcc651d6fc9fe2cac0ce092ddee927318015ae735d9cd9c5d97c0cafb6a51dcd2932ac73587b62df991 languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.11.6, @webassemblyjs/wasm-parser@npm:^1.11.5": - version: 1.11.6 - resolution: "@webassemblyjs/wasm-parser@npm:1.11.6" +"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.11.5": + version: 1.12.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/ast": 1.12.1 "@webassemblyjs/helper-api-error": 1.11.6 "@webassemblyjs/helper-wasm-bytecode": 1.11.6 "@webassemblyjs/ieee754": 1.11.6 "@webassemblyjs/leb128": 1.11.6 "@webassemblyjs/utf8": 1.11.6 - checksum: 8200a8d77c15621724a23fdabe58d5571415cda98a7058f542e670ea965dd75499f5e34a48675184947c66f3df23adf55df060312e6d72d57908e3f049620d8a + checksum: 176015de3551ac068cd4505d837414f258d9ade7442bd71efb1232fa26c9f6d7d4e11a5c816caeed389943f409af7ebff6899289a992d7a70343cb47009d21a8 languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/wast-printer@npm:1.11.6" +"@webassemblyjs/wast-printer@npm:1.12.1": + version: 1.12.1 + resolution: "@webassemblyjs/wast-printer@npm:1.12.1" dependencies: - "@webassemblyjs/ast": 1.11.6 + "@webassemblyjs/ast": 1.12.1 "@xtuc/long": 4.2.2 - checksum: d2fa6a4c427325ec81463e9c809aa6572af6d47f619f3091bf4c4a6fc34f1da3df7caddaac50b8e7a457f8784c62cd58c6311b6cb69b0162ccd8d4c072f79cf8 + checksum: 2974b5dda8d769145ba0efd886ea94a601e61fb37114c14f9a9a7606afc23456799af652ac3052f284909bd42edc3665a76bc9b50f95f0794c053a8a1757b713 languageName: node linkType: hard @@ -14624,18 +14606,6 @@ __metadata: languageName: unknown linkType: soft -"@webiny/api-admin-users-cognito-so-ddb@workspace:packages/api-admin-users-cognito-so-ddb": - version: 0.0.0-use.local - resolution: "@webiny/api-admin-users-cognito-so-ddb@workspace:packages/api-admin-users-cognito-so-ddb" - languageName: unknown - linkType: soft - -"@webiny/api-admin-users-cognito@workspace:packages/api-admin-users-cognito": - version: 0.0.0-use.local - resolution: "@webiny/api-admin-users-cognito@workspace:packages/api-admin-users-cognito" - languageName: unknown - linkType: soft - "@webiny/api-admin-users-so-ddb@0.0.0, @webiny/api-admin-users-so-ddb@workspace:packages/api-admin-users-so-ddb": version: 0.0.0-use.local resolution: "@webiny/api-admin-users-so-ddb@workspace:packages/api-admin-users-so-ddb" @@ -17575,14 +17545,17 @@ __metadata: "@webiny/aws-sdk": 0.0.0 "@webiny/cli": 0.0.0 "@webiny/data-migration": 0.0.0 + "@webiny/plugins": 0.0.0 "@webiny/pulumi-sdk": 0.0.0 body-parser: 1.20.1 chalk: 4.1.2 execa: 5.1.1 express: 4.18.2 fast-glob: ^3.2.7 + humanize-duration: ^3.31.0 + listr: ^0.14.3 localtunnel: 2.0.2 - lodash: 4.17.21 + lodash: ^4.17.21 log-update: ^4.0.0 mime: 2.6.0 minimatch: ^5.1.0 @@ -17847,6 +17820,7 @@ __metadata: fs-extra: ^9.1.0 graphql-request: ^3.7.0 inquirer: ^7.3.3 + is-ci: ^3.0.0 ncp: 2.0.0 open: ^8.0.6 pirates: ^4.0.1 @@ -17860,28 +17834,6 @@ __metadata: languageName: unknown linkType: soft -"@webiny/commodo@workspace:packages/commodo": - version: 0.0.0-use.local - resolution: "@webiny/commodo@workspace:packages/commodo" - dependencies: - "@babel/cli": ^7.23.9 - "@babel/core": ^7.24.0 - "@commodo/fields": 1.1.2-beta.20 - "@commodo/hooks": ^1.2.1 - "@commodo/name": ^1.3.1 - "@webiny/cli": 0.0.0 - "@webiny/project-utils": 0.0.0 - commodo-fields-date: ^1.0.3 - commodo-fields-float: ^1.0.2 - commodo-fields-int: ^1.0.1 - commodo-fields-object: ^1.0.3 - ramda: ^0.26.1 - repropose: ^1.0.2 - rimraf: ^5.0.5 - typescript: 4.7.4 - languageName: unknown - linkType: soft - "@webiny/cwp-template-aws@workspace:packages/cwp-template-aws": version: 0.0.0-use.local resolution: "@webiny/cwp-template-aws@workspace:packages/cwp-template-aws" @@ -17899,7 +17851,9 @@ __metadata: load-json-file: 6.2.0 lodash: 4.17.21 open: ^8.4.0 + ora: 4.1.1 write-json-file: 4.3.0 + yesno: ^0.4.0 languageName: unknown linkType: soft @@ -18460,6 +18414,7 @@ __metadata: get-yarn-workspaces: 1.0.2 glob: ^7.1.2 html-webpack-plugin: 5.5.0 + is-ci: ^3.0.0 jest-dynalite: ^3.6.1 listr2: ^5.0.8 load-json-file: 6.2.0 @@ -18499,7 +18454,7 @@ __metadata: webpack: ^5.90.0 webpack-dev-server: ^4.6.0 webpack-manifest-plugin: ^4.0.2 - webpackbar: 5.0.2 + webpackbar: ^6.0.0 yargs: ^17.0.1 languageName: unknown linkType: soft @@ -18742,7 +18697,7 @@ __metadata: "@webiny/cli-plugin-deploy-pulumi": 0.0.0 "@webiny/data-migration": 0.0.0 "@webiny/db-dynamodb": 0.0.0 - "@webiny/feature-flags": 0.0.0 + "@webiny/global-config": 0.0.0 "@webiny/handler-aws": 0.0.0 "@webiny/handler-db": 0.0.0 "@webiny/handler-logs": 0.0.0 @@ -18806,8 +18761,10 @@ __metadata: resolution: "@webiny/telemetry@workspace:packages/telemetry" dependencies: "@webiny/global-config": 0.0.0 - form-data: 3.0.0 - node-fetch: ^2.6.13 + is-ci: 3.0.0 + jsesc: ^3.0.2 + strip-ansi: ^6.0.1 + wts: "https://github.com/webiny/wts#51fd5a89a8d12b27def57ff99a71e071e9085e6c" languageName: unknown linkType: soft @@ -19485,7 +19442,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.1.0, ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.1": +"ansi-escapes@npm:^4.1.0, ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.1, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -20018,21 +19975,7 @@ __metadata: languageName: node linkType: hard -"archiver-utils@npm:^5.0.0": - version: 5.0.1 - resolution: "archiver-utils@npm:5.0.1" - dependencies: - glob: ^10.0.0 - graceful-fs: ^4.2.0 - lazystream: ^1.0.0 - lodash: ^4.17.15 - normalize-path: ^3.0.0 - readable-stream: ^3.6.0 - checksum: a6e907cea41486ff95fdbe1b267890df96d51e2712b6604cb9b0c5f7348aea475091f41e0e6fced3a893490deddfd8d0704f66c8aa470394cff3618bbec6d4cc - languageName: node - linkType: hard - -"archiver-utils@npm:^5.0.2": +"archiver-utils@npm:^5.0.0, archiver-utils@npm:^5.0.2": version: 5.0.2 resolution: "archiver-utils@npm:5.0.2" dependencies: @@ -20488,13 +20431,13 @@ __metadata: linkType: hard "axios@npm:^1.6.0": - version: 1.6.7 - resolution: "axios@npm:1.6.7" + version: 1.6.8 + resolution: "axios@npm:1.6.8" dependencies: - follow-redirects: ^1.15.4 + follow-redirects: ^1.15.6 form-data: ^4.0.0 proxy-from-env: ^1.1.0 - checksum: 87d4d429927d09942771f3b3a6c13580c183e31d7be0ee12f09be6d5655304996bb033d85e54be81606f4e89684df43be7bf52d14becb73a12727bf33298a082 + checksum: bf007fa4b207d102459300698620b3b0873503c6d47bf5a8f6e43c0c64c90035a4f698b55027ca1958f61ab43723df2781c38a99711848d232cad7accbcdfcdd languageName: node linkType: hard @@ -20645,15 +20588,15 @@ __metadata: linkType: hard "babel-plugin-polyfill-corejs2@npm:^0.4.8": - version: 0.4.9 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.9" + version: 0.4.10 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.10" dependencies: "@babel/compat-data": ^7.22.6 - "@babel/helper-define-polyfill-provider": ^0.6.0 + "@babel/helper-define-polyfill-provider": ^0.6.1 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 3fb4ce9000e24fa6bdd604d44f3dc732f94fe611c585733026885ba4c998b0926e4611aabe96d32707abb0b9cc32c2c5fb176b18e76d3815403ed99614bd60b8 + checksum: 2c0e4868789152f50db306f4957fa7934876cefb51d5d86436595f0b091539e45ce0e9c0125b5db2d71f913b29cd48ae76b8e942ba28fcf2273e084f54664a1c languageName: node linkType: hard @@ -21735,6 +21678,13 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^3.1.1, ci-info@npm:^3.6.1": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 + languageName: node + linkType: hard + "ci-info@npm:^3.2.0": version: 3.7.1 resolution: "ci-info@npm:3.7.1" @@ -21742,13 +21692,6 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^3.6.1": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 - languageName: node - linkType: hard - "cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": version: 1.0.4 resolution: "cipher-base@npm:1.0.4" @@ -22189,37 +22132,7 @@ __metadata: languageName: node linkType: hard -"commodo-fields-date@npm:^1.0.3": - version: 1.0.7 - resolution: "commodo-fields-date@npm:1.0.7" - dependencies: - "@commodo/fields": ^1.0.0 - repropose: ^1.0.2 - checksum: 64476b6658cecc59668a0f07d6bbae99cc2d887be0112c63e13c1c784a1626bf35b612e0693b086e6c362c13adb26094a1da70e83e324095632680185e22154a - languageName: node - linkType: hard - -"commodo-fields-float@npm:^1.0.2": - version: 1.0.4 - resolution: "commodo-fields-float@npm:1.0.4" - dependencies: - "@commodo/fields": ^1.0.0 - repropose: ^1.0.2 - checksum: 7200db1eaebf85bfae1e452c6c37538eb4e245f840239e82d4570380f4f5660b841cc99407564d827504121ed94497038d328b319a765ad16ac4d093b4c7f179 - languageName: node - linkType: hard - -"commodo-fields-int@npm:^1.0.1": - version: 1.0.3 - resolution: "commodo-fields-int@npm:1.0.3" - dependencies: - "@commodo/fields": ^1.0.0 - repropose: ^1.0.2 - checksum: 62961d7bd7870b6a2ea90fe24f0bc7c768abfcf80f04790542d6cef7e4f09994b8e0deae23d76d2e544f11b711873b5f24d580b367a850aa22b17e72dadee895 - languageName: node - linkType: hard - -"commodo-fields-object@npm:^1.0.3, commodo-fields-object@npm:^1.0.6": +"commodo-fields-object@npm:^1.0.6": version: 1.0.6 resolution: "commodo-fields-object@npm:1.0.6" dependencies: @@ -22378,10 +22291,10 @@ __metadata: languageName: node linkType: hard -"consola@npm:^2.15.3": - version: 2.15.3 - resolution: "consola@npm:2.15.3" - checksum: 8ef7a09b703ec67ac5c389a372a33b6dc97eda6c9876443a60d76a3076eea0259e7f67a4e54fd5a52f97df73690822d090cf8b7e102b5761348afef7c6d03e28 +"consola@npm:^3.2.3": + version: 3.2.3 + resolution: "consola@npm:3.2.3" + checksum: 32ec70e177dd2385c42e38078958cc7397be91db21af90c6f9faa0b16168b49b1c61d689338604bbb2d64370b9347a35f42a9197663a913d3a405bb0ce728499 languageName: node linkType: hard @@ -24527,9 +24440,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.668": - version: 1.4.701 - resolution: "electron-to-chromium@npm:1.4.701" - checksum: dbecf8320a4db7c5b089c2786b32eb541ba20c5c8e71e8953476350caea097c40ccaac93962963be98d61ea09c8a88910e48704ce14838a7711ba96d87bc23a0 + version: 1.4.708 + resolution: "electron-to-chromium@npm:1.4.708" + checksum: 2d4684b785f9cd6e501a0707e16c8fba89a99a36032917523fdc04f2bf109e63c3c2854ecf6d34e243ecdfe11a77839ebcb23e3b8d466853abebea2df3a76314 languageName: node linkType: hard @@ -26344,17 +26257,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:3.0.0": - version: 3.0.0 - resolution: "form-data@npm:3.0.0" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: 60ec3fe7e23154949ab6fef31baedf5afbfb8d6441ea8d19b211b43a5d0448be2918c9bba6218cade56a7cbd43f670d6e75f41f626f8d397d56bf8c60f4a829d - languageName: node - linkType: hard - "form-data@npm:^2.5.0": version: 2.5.1 resolution: "form-data@npm:2.5.1" @@ -27797,6 +27699,13 @@ __metadata: languageName: node linkType: hard +"humanize-duration@npm:^3.31.0": + version: 3.31.0 + resolution: "humanize-duration@npm:3.31.0" + checksum: a21b1c80d43580c28fef07213846f74703c467270d41b774faeb4df6041b1da65effc554346fe6f0a70c4096b011d75f2ba6c2fd254b5a3c93231d85910533fe + languageName: node + linkType: hard + "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -28355,6 +28264,17 @@ __metadata: languageName: node linkType: hard +"is-ci@npm:3.0.0": + version: 3.0.0 + resolution: "is-ci@npm:3.0.0" + dependencies: + ci-info: ^3.1.1 + bin: + is-ci: bin.js + checksum: 4b45aef32dd42dcb1f6fb3cd4b3a7ee7e18ea47516d2129005f46c3f36983506bb471382bac890973cf48a2f60d926a24461674ca2d9dc10744d82d4a876c26b + languageName: node + linkType: hard + "is-ci@npm:3.0.1, is-ci@npm:^3.0.0": version: 3.0.1 resolution: "is-ci@npm:3.0.1" @@ -29732,6 +29652,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" + bin: + jsesc: bin/jsesc + checksum: a36d3ca40574a974d9c2063bf68c2b6141c20da8f2a36bd3279fc802563f35f0527a6c828801295bdfb2803952cf2cf387786c2c90ed564f88d5782475abfe3c + languageName: node + linkType: hard + "jsesc@npm:~0.5.0": version: 0.5.0 resolution: "jsesc@npm:0.5.0" @@ -31180,6 +31109,15 @@ __metadata: languageName: node linkType: hard +"markdown-table@npm:^2.0.0": + version: 2.0.0 + resolution: "markdown-table@npm:2.0.0" + dependencies: + repeat-string: ^1.0.0 + checksum: 9bb634a9300016cbb41216c1eab44c74b6b7083ac07872e296f900a29449cf0e260ece03fa10c3e9784ab94c61664d1d147da0315f95e1336e2bdcc025615c90 + languageName: node + linkType: hard + "matcher@npm:^4.0.0": version: 4.0.0 resolution: "matcher@npm:4.0.0" @@ -34009,17 +33947,17 @@ __metadata: linkType: hard "postcss-color-functional-notation@npm:^6.0.5": - version: 6.0.5 - resolution: "postcss-color-functional-notation@npm:6.0.5" + version: 6.0.6 + resolution: "postcss-color-functional-notation@npm:6.0.6" dependencies: - "@csstools/css-color-parser": ^1.5.2 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/css-color-parser": ^1.6.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 peerDependencies: postcss: ^8.4 - checksum: fc51914663cd4bb766eb7c5c9a532d47c409495c8f8a5b938e3b8a52f3b4d21074c2407cb2fa6282bc1ca559138e139fa1af822a6c3d359e64c303cd002cef1d + checksum: ad75fa8b7a77ba3c5c67c7e809da86218d7950756ccdc3eef6114920882ec39cf2f568c5c004674c9ec446d70d345b7b370e9aecbea59b42faa41d62ff3401e3 languageName: node linkType: hard @@ -34074,45 +34012,45 @@ __metadata: linkType: hard "postcss-custom-media@npm:^10.0.3": - version: 10.0.3 - resolution: "postcss-custom-media@npm:10.0.3" + version: 10.0.4 + resolution: "postcss-custom-media@npm:10.0.4" dependencies: - "@csstools/cascade-layer-name-parser": ^1.0.8 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/media-query-list-parser": ^2.1.8 + "@csstools/cascade-layer-name-parser": ^1.0.9 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/media-query-list-parser": ^2.1.9 peerDependencies: postcss: ^8.4 - checksum: 22f80abbce990e8ca4da5eb78e4cc0c9f689b0df58a8b55a2033faca122957814b24570417ca47e98d68e715e01610a9f19b5dcc49c645e7067b7e721bd155a7 + checksum: 3fc05340012f4529b2f0ac4c841165f694d0837f873827f7860e9ab5d1ab9a0d852eef630305266e6c20fc960c058bf866ee24dbf8af2f534c9691fb87fb5c29 languageName: node linkType: hard "postcss-custom-properties@npm:^13.3.5": - version: 13.3.5 - resolution: "postcss-custom-properties@npm:13.3.5" + version: 13.3.6 + resolution: "postcss-custom-properties@npm:13.3.6" dependencies: - "@csstools/cascade-layer-name-parser": ^1.0.8 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/cascade-layer-name-parser": ^1.0.9 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 "@csstools/utilities": ^1.0.0 postcss-value-parser: ^4.2.0 peerDependencies: postcss: ^8.4 - checksum: 802f75e3d760ac57edc9b6b90b3634bfcbe9d961c96ed98129fb9413cdc27b70fbfb261c589eacba7fc1abfce67fb43917d8d722e7a62c8dda76398c4e0ba151 + checksum: b4c1355db1652f5595b2f39dc971a0ddbd5912d4eee7a6a94e60a89bf38ec5d39fe981eae0b5b026fd6ad40025df09c3ec6d09549510ad3e46af3ad2900be8a8 languageName: node linkType: hard "postcss-custom-selectors@npm:^7.1.7": - version: 7.1.7 - resolution: "postcss-custom-selectors@npm:7.1.7" + version: 7.1.8 + resolution: "postcss-custom-selectors@npm:7.1.8" dependencies: - "@csstools/cascade-layer-name-parser": ^1.0.8 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 + "@csstools/cascade-layer-name-parser": ^1.0.9 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 postcss-selector-parser: ^6.0.13 peerDependencies: postcss: ^8.4 - checksum: 72e2b9be4ba43fe048af5b2b616699b326f00d77482665e611b1c1693cd759ea15e399025fc6a06aa3592ba44f1db534ce3105837f3bce403fba5421a5f1ae6b + checksum: aadeb161ae8a1eacf071315a477dff851a5c3fdf673acf62d1a6eee61e14d4003abda79b96d3ff912162bfb8b9e29c184832ab1e62d33533e8aeb3bb641da488 languageName: node linkType: hard @@ -34164,15 +34102,15 @@ __metadata: linkType: hard "postcss-double-position-gradients@npm:^5.0.4": - version: 5.0.4 - resolution: "postcss-double-position-gradients@npm:5.0.4" + version: 5.0.5 + resolution: "postcss-double-position-gradients@npm:5.0.5" dependencies: - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 postcss-value-parser: ^4.2.0 peerDependencies: postcss: ^8.4 - checksum: 442db316cb8eb35cc16b091dd4cdec7db13ae548f6d463ab7dc570b247773e3b8a8068fbd5bb6c46d2f5df6f902fe830f4dc80041b0c1ff9040d21ac418a925d + checksum: 8eb9c64eaa9b2edcc664f32210e30a13317f2487bcc3f655a4ddf7e539d0abb55ccdf047428be9916c9e76761cd400dc451d93557c4269d1dd587c9fa7edddb1 languageName: node linkType: hard @@ -34238,17 +34176,17 @@ __metadata: linkType: hard "postcss-lab-function@npm:^6.0.10": - version: 6.0.10 - resolution: "postcss-lab-function@npm:6.0.10" + version: 6.0.11 + resolution: "postcss-lab-function@npm:6.0.11" dependencies: - "@csstools/css-color-parser": ^1.5.2 - "@csstools/css-parser-algorithms": ^2.6.0 - "@csstools/css-tokenizer": ^2.2.3 - "@csstools/postcss-progressive-custom-properties": ^3.1.0 + "@csstools/css-color-parser": ^1.6.0 + "@csstools/css-parser-algorithms": ^2.6.1 + "@csstools/css-tokenizer": ^2.2.4 + "@csstools/postcss-progressive-custom-properties": ^3.1.1 "@csstools/utilities": ^1.0.0 peerDependencies: postcss: ^8.4 - checksum: 633a4631d302416619e52dea32b78b163700e1f1ff790abdd0fd1538683e4305f17a219f4fe3721ae9a5ec767e7d071b9fbf08b55ad96cd39e8daa3a4070d1fb + checksum: bfc6765b8096e0491bb7a285214a17aadfcdf70d2ebe7c762b2a2e422e4e7d7265a6310e77aef3fa691fa3e7f47bd85efc15a5900f6f470afee75639bfc44e68 languageName: node linkType: hard @@ -34697,12 +34635,12 @@ __metadata: linkType: hard "postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.13, postcss-selector-parser@npm:^6.0.15": - version: 6.0.15 - resolution: "postcss-selector-parser@npm:6.0.15" + version: 6.0.16 + resolution: "postcss-selector-parser@npm:6.0.16" dependencies: cssesc: ^3.0.0 util-deprecate: ^1.0.2 - checksum: 57decb94152111004f15e27b9c61131eb50ee10a3288e7fcf424cebbb4aba82c2817517ae718f8b5d704ee9e02a638d4a2acff8f47685c295a33ecee4fd31055 + checksum: e1cd68e33a39e3dc1e1e5bd8717be5bbe3cc23a4cecb466c3acb2f3a77daad7a47df4d6137a76f8db74cf160d2fb16b2cfdb4ccbebdfda844690f8d545fe281d languageName: node linkType: hard @@ -35340,13 +35278,6 @@ __metadata: languageName: node linkType: hard -"ramda@npm:^0.26.1": - version: 0.26.1 - resolution: "ramda@npm:0.26.1" - checksum: 19c2730e44c129538151ae034c89be9b2c6a4ccc7c65cff57497418bc532ce09282f98cd927c39b0b03c6bc3f1d1a12d822b7b07f96a1634f4958a6c05b7b384 - languageName: node - linkType: hard - "randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -36561,7 +36492,7 @@ __metadata: languageName: node linkType: hard -"repeat-string@npm:^1.6.1": +"repeat-string@npm:^1.0.0, repeat-string@npm:^1.6.1": version: 1.6.1 resolution: "repeat-string@npm:1.6.1" checksum: 1b809fc6db97decdc68f5b12c4d1a671c8e3f65ec4a40c238bc5200e44e85bcc52a54f78268ab9c29fcf5fe4f1343e805420056d1f30fa9a9ee4c2d93e3cc6c0 @@ -38205,10 +38136,10 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.0.1": - version: 3.3.2 - resolution: "std-env@npm:3.3.2" - checksum: c02256bb041ba1870d23f8360bc7e47a9cf1fabcd02c8b7c4246d48f2c6bb47b4f45c70964348844e6d36521df84c4a9d09d468654b51e0eb5c600e3392b4570 +"std-env@npm:^3.7.0": + version: 3.7.0 + resolution: "std-env@npm:3.7.0" + checksum: 4f489d13ff2ab838c9acd4ed6b786b51aa52ecacdfeaefe9275fcb220ff2ac80c6e95674723508fd29850a694569563a8caaaea738eb82ca16429b3a0b50e510 languageName: node linkType: hard @@ -38741,8 +38672,8 @@ __metadata: linkType: hard "systeminformation@npm:^5.7": - version: 5.22.0 - resolution: "systeminformation@npm:5.22.0" + version: 5.22.3 + resolution: "systeminformation@npm:5.22.3" bin: systeminformation: lib/cli.js conditions: (os=darwin | os=linux | os=win32 | os=freebsd | os=openbsd | os=netbsd | os=sunos | os=android) @@ -38960,8 +38891,8 @@ __metadata: linkType: hard "terser@npm:^5.26.0": - version: 5.29.1 - resolution: "terser@npm:5.29.1" + version: 5.29.2 + resolution: "terser@npm:5.29.2" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -38969,7 +38900,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: a884c81a9d6c05560309078192e0cc60cb64b76637f7ca237b350ca54e97a9d4b927a5afa08a59646ef3cbf0511728c944793cb718a3e7e48dd4a2a201737eef + checksum: 2310d04e530903ed4da6168c4c90ab65965c5f1f8919733772119ff560e9e9be2def070c9659f7d96f2e28489c4378241c4cef1917f05b9524587436fdd5a802 languageName: node linkType: hard @@ -39432,7 +39363,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.5.0": +"tslib@npm:^2.5.0, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad @@ -40523,17 +40454,21 @@ __metadata: languageName: node linkType: hard -"webpackbar@npm:5.0.2": - version: 5.0.2 - resolution: "webpackbar@npm:5.0.2" +"webpackbar@npm:^6.0.0": + version: 6.0.1 + resolution: "webpackbar@npm:6.0.1" dependencies: - chalk: ^4.1.0 - consola: ^2.15.3 + ansi-escapes: ^4.3.2 + chalk: ^4.1.2 + consola: ^3.2.3 + figures: ^3.2.0 + markdown-table: ^2.0.0 pretty-time: ^1.1.0 - std-env: ^3.0.1 + std-env: ^3.7.0 + wrap-ansi: ^7.0.0 peerDependencies: webpack: 3 || 4 || 5 - checksum: 214a734b1d4d391eb8271ed1b11085f0efe6831e93f641229b292abfd6fea871422dce121612511c17ae8047522be6d65c1a2666cabb396c79549816a3612338 + checksum: e9ba314452486230668ab34aea7c3494866dbe29e327e9201551a839000ee7e878d8a47b8977acb76ec9443b4257dfcdb05bae9bbc27ffb21793d2bed7907687 languageName: node linkType: hard @@ -41001,6 +40936,17 @@ __metadata: languageName: node linkType: hard +"wts@https://github.com/webiny/wts#51fd5a89a8d12b27def57ff99a71e071e9085e6c": + version: 2.0.0 + resolution: "wts@https://github.com/webiny/wts.git#commit=51fd5a89a8d12b27def57ff99a71e071e9085e6c" + dependencies: + btoa: ^1.2.1 + js-cookie: ^2.2.1 + node-fetch: ^2.6.1 + checksum: d807a0ad235419c93662eb3da92250677c9baf5a93b3976784f0db6aca63ada465fb1e1a6716f1cbea7e069fcf43a2f9a175d84b860b78af52f54413d0f26a8a + languageName: node + linkType: hard + "xhr2@npm:0.1.3": version: 0.1.3 resolution: "xhr2@npm:0.1.3" @@ -41140,6 +41086,13 @@ __metadata: languageName: node linkType: hard +"yesno@npm:^0.4.0": + version: 0.4.0 + resolution: "yesno@npm:0.4.0" + checksum: d5e7bc2ef8f8019f111dd82526c3d02f288e1b03ba5afa483140c1a98db9834589d0e07d9d1b14321489f727ceb0af0013d4b224b49dd10405743872e5ddd109 + languageName: node + linkType: hard + "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1"