unleash-server 4.2.0-beta.8 → 4.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/addons/addon.d.ts +2 -1
- package/dist/lib/addons/addon.js.map +1 -1
- package/dist/lib/addons/datadog.d.ts +4 -17
- package/dist/lib/addons/datadog.js +3 -109
- package/dist/lib/addons/datadog.js.map +1 -1
- package/dist/lib/addons/datadog.test.js +3 -0
- package/dist/lib/addons/datadog.test.js.map +1 -1
- package/dist/lib/addons/feature-event-formatter-md.d.ts +25 -0
- package/dist/lib/addons/feature-event-formatter-md.js +116 -0
- package/dist/lib/addons/feature-event-formatter-md.js.map +1 -0
- package/dist/lib/addons/index.d.ts +1 -0
- package/dist/lib/addons/index.js.map +1 -1
- package/dist/lib/addons/slack.d.ts +3 -12
- package/dist/lib/addons/slack.js +5 -110
- package/dist/lib/addons/slack.js.map +1 -1
- package/dist/lib/addons/slack.test.js +8 -0
- package/dist/lib/addons/slack.test.js.map +1 -1
- package/dist/lib/addons/teams.d.ts +4 -17
- package/dist/lib/addons/teams.js +7 -109
- package/dist/lib/addons/teams.js.map +1 -1
- package/dist/lib/addons/teams.test.js +3 -0
- package/dist/lib/addons/teams.test.js.map +1 -1
- package/dist/lib/addons/webhook.d.ts +8 -2
- package/dist/lib/addons/webhook.js +0 -1
- package/dist/lib/addons/webhook.js.map +1 -1
- package/dist/lib/addons/webhook.test.js +2 -0
- package/dist/lib/addons/webhook.test.js.map +1 -1
- package/dist/lib/create-config.js +6 -5
- package/dist/lib/create-config.js.map +1 -1
- package/dist/lib/db/client-instance-store.js +2 -2
- package/dist/lib/db/client-instance-store.js.map +1 -1
- package/dist/lib/db/client-metrics-db.js +2 -2
- package/dist/lib/db/client-metrics-db.js.map +1 -1
- package/dist/lib/db/client-metrics-store-v2.js +5 -1
- package/dist/lib/db/client-metrics-store-v2.js.map +1 -1
- package/dist/lib/db/client-metrics-store.js +2 -2
- package/dist/lib/db/client-metrics-store.js.map +1 -1
- package/dist/lib/db/event-store.d.ts +10 -6
- package/dist/lib/db/event-store.js +21 -1
- package/dist/lib/db/event-store.js.map +1 -1
- package/dist/lib/db/session-store.js +2 -1
- package/dist/lib/db/session-store.js.map +1 -1
- package/dist/lib/error/minimum-one-environment-error.d.ts +5 -0
- package/dist/lib/error/minimum-one-environment-error.js +24 -0
- package/dist/lib/error/minimum-one-environment-error.js.map +1 -0
- package/dist/lib/metrics.js +20 -12
- package/dist/lib/metrics.js.map +1 -1
- package/dist/lib/metrics.test.js +1 -0
- package/dist/lib/metrics.test.js.map +1 -1
- package/dist/lib/middleware/rbac-middleware.js +2 -17
- package/dist/lib/middleware/rbac-middleware.js.map +1 -1
- package/dist/lib/middleware/rbac-middleware.test.js +2 -21
- package/dist/lib/middleware/rbac-middleware.test.js.map +1 -1
- package/dist/lib/middleware/secure-headers.js +2 -1
- package/dist/lib/middleware/secure-headers.js.map +1 -1
- package/dist/lib/middleware/session-db.js +2 -3
- package/dist/lib/middleware/session-db.js.map +1 -1
- package/dist/lib/routes/admin-api/config.d.ts +5 -2
- package/dist/lib/routes/admin-api/config.js +9 -11
- package/dist/lib/routes/admin-api/config.js.map +1 -1
- package/dist/lib/routes/admin-api/event.d.ts +8 -4
- package/dist/lib/routes/admin-api/event.js +8 -10
- package/dist/lib/routes/admin-api/event.js.map +1 -1
- package/dist/lib/routes/admin-api/feature.d.ts +2 -3
- package/dist/lib/routes/admin-api/feature.js +37 -34
- package/dist/lib/routes/admin-api/feature.js.map +1 -1
- package/dist/lib/routes/admin-api/project/features.js +11 -8
- package/dist/lib/routes/admin-api/project/features.js.map +1 -1
- package/dist/lib/routes/admin-api/state.js +2 -3
- package/dist/lib/routes/admin-api/state.js.map +1 -1
- package/dist/lib/routes/admin-api/strategy.test.js +25 -38
- package/dist/lib/routes/admin-api/strategy.test.js.map +1 -1
- package/dist/lib/routes/admin-api/user-admin.d.ts +1 -0
- package/dist/lib/routes/admin-api/user-admin.js +6 -0
- package/dist/lib/routes/admin-api/user-admin.js.map +1 -1
- package/dist/lib/routes/client-api/feature.test.js +3 -2
- package/dist/lib/routes/client-api/feature.test.js.map +1 -1
- package/dist/lib/routes/health-check.test.js +1 -0
- package/dist/lib/routes/health-check.test.js.map +1 -1
- package/dist/lib/routes/util.js +2 -0
- package/dist/lib/routes/util.js.map +1 -1
- package/dist/lib/server-impl.d.ts +2 -1
- package/dist/lib/server-impl.js.map +1 -1
- package/dist/lib/services/addon-service-test-simple-addon.d.ts +1 -1
- package/dist/lib/services/addon-service-test-simple-addon.js.map +1 -1
- package/dist/lib/services/addon-service.js +2 -2
- package/dist/lib/services/addon-service.js.map +1 -1
- package/dist/lib/services/api-token-service.js +2 -2
- package/dist/lib/services/api-token-service.js.map +1 -1
- package/dist/lib/services/client-metrics/client-metrics-service-v2.js +3 -5
- package/dist/lib/services/client-metrics/client-metrics-service-v2.js.map +1 -1
- package/dist/lib/services/client-metrics/client-metrics.test.js +74 -41
- package/dist/lib/services/client-metrics/client-metrics.test.js.map +1 -1
- package/dist/lib/services/client-metrics/index.d.ts +6 -5
- package/dist/lib/services/client-metrics/index.js +13 -10
- package/dist/lib/services/client-metrics/index.js.map +1 -1
- package/dist/lib/services/client-metrics/list.d.ts +19 -16
- package/dist/lib/services/client-metrics/list.js +6 -4
- package/dist/lib/services/client-metrics/list.js.map +1 -1
- package/dist/lib/services/client-metrics/list.test.js +9 -5
- package/dist/lib/services/client-metrics/list.test.js.map +1 -1
- package/dist/lib/services/client-metrics/ttl-list.d.ts +20 -13
- package/dist/lib/services/client-metrics/ttl-list.js +26 -15
- package/dist/lib/services/client-metrics/ttl-list.js.map +1 -1
- package/dist/lib/services/client-metrics/ttl-list.test.js +33 -9
- package/dist/lib/services/client-metrics/ttl-list.test.js.map +1 -1
- package/dist/lib/services/environment-service.d.ts +2 -1
- package/dist/lib/services/environment-service.js +10 -3
- package/dist/lib/services/environment-service.js.map +1 -1
- package/dist/lib/services/event-service.d.ts +1 -1
- package/dist/lib/services/event-service.js +1 -1
- package/dist/lib/services/event-service.js.map +1 -1
- package/dist/lib/services/feature-tag-service.js +7 -11
- package/dist/lib/services/feature-tag-service.js.map +1 -1
- package/dist/lib/services/{feature-toggle-service-v2.d.ts → feature-toggle-service.d.ts} +29 -19
- package/dist/lib/services/{feature-toggle-service-v2.js → feature-toggle-service.js} +177 -145
- package/dist/lib/services/feature-toggle-service.js.map +1 -0
- package/dist/lib/services/index.js +5 -3
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/project-health-service.d.ts +2 -2
- package/dist/lib/services/project-health-service.js +3 -3
- package/dist/lib/services/project-health-service.js.map +1 -1
- package/dist/lib/services/project-service.d.ts +2 -2
- package/dist/lib/services/project-service.js +5 -3
- package/dist/lib/services/project-service.js.map +1 -1
- package/dist/lib/services/reset-token-service.js +2 -2
- package/dist/lib/services/reset-token-service.js.map +1 -1
- package/dist/lib/services/setting-service.d.ts +1 -1
- package/dist/lib/services/setting-service.js.map +1 -1
- package/dist/lib/services/state-util.js +1 -1
- package/dist/lib/services/state-util.js.map +1 -1
- package/dist/lib/services/user-service.d.ts +6 -2
- package/dist/lib/services/user-service.js +43 -21
- package/dist/lib/services/user-service.js.map +1 -1
- package/dist/lib/services/user-service.test.js +18 -0
- package/dist/lib/services/user-service.test.js.map +1 -1
- package/dist/lib/services/version-service.js +2 -2
- package/dist/lib/services/version-service.js.map +1 -1
- package/dist/lib/types/authentication-required.d.ts +3 -1
- package/dist/lib/types/authentication-required.js +2 -1
- package/dist/lib/types/authentication-required.js.map +1 -1
- package/dist/lib/types/events.d.ts +165 -2
- package/dist/lib/types/events.js +124 -4
- package/dist/lib/types/events.js.map +1 -1
- package/dist/lib/types/model.d.ts +0 -12
- package/dist/lib/types/model.js.map +1 -1
- package/dist/lib/types/services.d.ts +3 -2
- package/dist/lib/types/settings/simple-auth-settings.d.ts +4 -0
- package/dist/lib/types/settings/simple-auth-settings.js +5 -0
- package/dist/lib/types/settings/simple-auth-settings.js.map +1 -0
- package/dist/lib/types/stores/event-store.d.ts +4 -3
- package/dist/lib/types/stores/settings-store.d.ts +1 -1
- package/dist/lib/util/constants.d.ts +0 -2
- package/dist/lib/util/constants.js +1 -3
- package/dist/lib/util/constants.js.map +1 -1
- package/dist/migrations/20210928080601-add-development-and-production-environments.js +3 -3
- package/dist/migrations/20211029094324-set-sort-order-env.d.ts +2 -0
- package/dist/migrations/20211029094324-set-sort-order-env.js +11 -0
- package/dist/migrations/20211029094324-set-sort-order-env.js.map +1 -0
- package/dist/migrations/20211105104316-add-feature-name-column-to-events.d.ts +2 -0
- package/dist/migrations/20211105104316-add-feature-name-column-to-events.js +16 -0
- package/dist/migrations/20211105104316-add-feature-name-column-to-events.js.map +1 -0
- package/dist/migrations/20211105105509-add-predata-column-to-events.d.ts +2 -0
- package/dist/migrations/20211105105509-add-predata-column-to-events.js +8 -0
- package/dist/migrations/20211105105509-add-predata-column-to-events.js.map +1 -0
- package/dist/migrator.js +9 -2
- package/dist/migrator.js.map +1 -1
- package/dist/test/e2e/api/admin/client-metrics.e2e.test.js +16 -12
- package/dist/test/e2e/api/admin/client-metrics.e2e.test.js.map +1 -1
- package/dist/{lib/event-differ.test.d.ts → test/e2e/api/admin/config.e2e.test.d.ts} +0 -0
- package/dist/test/e2e/api/admin/config.e2e.test.js +36 -0
- package/dist/test/e2e/api/admin/config.e2e.test.js.map +1 -0
- package/dist/test/e2e/api/admin/feature-archive.e2e.test.js +1 -2
- package/dist/test/e2e/api/admin/feature-archive.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/feature.e2e.test.js +19 -2
- package/dist/test/e2e/api/admin/feature.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/metrics.e2e.test.js +5 -3
- package/dist/test/e2e/api/admin/metrics.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/environments.e2e.test.js +10 -0
- package/dist/test/e2e/api/admin/project/environments.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/project/features.e2e.test.js +120 -8
- package/dist/test/e2e/api/admin/project/features.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/state.e2e.test.js +17 -13
- package/dist/test/e2e/api/admin/state.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/admin/user-admin.e2e.test.js +18 -17
- package/dist/test/e2e/api/admin/user-admin.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js +4 -0
- package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.js +8 -4
- package/dist/test/e2e/api/client/feature.env.disabled.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/feature.token.access.e2e.test.js +4 -4
- package/dist/test/e2e/api/client/feature.token.access.e2e.test.js.map +1 -1
- package/dist/test/e2e/api/client/register.e2e.test.js +1 -1
- package/dist/test/e2e/api/client/register.e2e.test.js.map +1 -1
- package/dist/test/e2e/custom-auth.test.js +1 -1
- package/dist/test/e2e/custom-auth.test.js.map +1 -1
- package/dist/test/e2e/services/addon-service.e2e.test.js +1 -1
- package/dist/test/e2e/services/addon-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/api-token-service.e2e.test.js +5 -3
- package/dist/test/e2e/services/api-token-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/client-metrics-service.e2e.test.js +5 -2
- package/dist/test/e2e/services/client-metrics-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/environment-service.test.js +1 -1
- package/dist/test/e2e/services/environment-service.test.js.map +1 -1
- package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js +14 -11
- package/dist/test/e2e/services/feature-toggle-service-v2.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/project-health-service.e2e.test.js +2 -2
- package/dist/test/e2e/services/project-health-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/project-service.e2e.test.js +2 -2
- package/dist/test/e2e/services/project-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/reset-token-service.e2e.test.js +4 -0
- package/dist/test/e2e/services/reset-token-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/session-service.e2e.test.js +5 -4
- package/dist/test/e2e/services/session-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/services/user-service.e2e.test.js +18 -2
- package/dist/test/e2e/services/user-service.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/client-metrics-store-v2.e2e.test.js +4 -6
- package/dist/test/e2e/stores/client-metrics-store-v2.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/event-store.e2e.test.js +1 -1
- package/dist/test/e2e/stores/event-store.e2e.test.js.map +1 -1
- package/dist/test/e2e/stores/feature-toggle-store.e2e.test.js +1 -0
- package/dist/test/e2e/stores/feature-toggle-store.e2e.test.js.map +1 -1
- package/dist/test/fixtures/fake-event-store.d.ts +2 -1
- package/dist/test/fixtures/fake-event-store.js +3 -0
- package/dist/test/fixtures/fake-event-store.js.map +1 -1
- package/dist/test/fixtures/fake-setting-store.js +1 -5
- package/dist/test/fixtures/fake-setting-store.js.map +1 -1
- package/docs/api/oas/openapi.yaml +35 -55
- package/package.json +11 -12
- package/dist/lib/event-differ.d.ts +0 -1
- package/dist/lib/event-differ.js +0 -117
- package/dist/lib/event-differ.js.map +0 -1
- package/dist/lib/event-differ.test.js +0 -142
- package/dist/lib/event-differ.test.js.map +0 -1
- package/dist/lib/services/feature-toggle-service-v2.js.map +0 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Response } from 'node-fetch';
|
|
2
2
|
import { IUnleashConfig } from '../types/option';
|
|
3
3
|
import { Logger } from '../logger';
|
|
4
|
-
import { IAddonDefinition
|
|
4
|
+
import { IAddonDefinition } from '../types/model';
|
|
5
|
+
import { IEvent } from '../types/events';
|
|
5
6
|
export default abstract class Addon {
|
|
6
7
|
logger: Logger;
|
|
7
8
|
_name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addon.js","sourceRoot":"","sources":["../../../src/lib/addons/addon.ts"],"names":[],"mappings":";;;;;AAAA,4DAA6C;AAC7C,iDAAuD;
|
|
1
|
+
{"version":3,"file":"addon.js","sourceRoot":"","sources":["../../../src/lib/addons/addon.ts"],"names":[],"mappings":";;;;;AAAA,4DAA6C;AAC7C,iDAAuD;AAMvD,MAA8B,KAAK;IAO/B,YACI,UAA4B,EAC5B,EAAE,SAAS,EAAqC;QAEhD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,SAAS,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,EAAE,KAAK,EAAE,GAAG,oCAAqB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,iCAAiC,UAAU,CAAC,IAAI,EAAE,EAClD,KAAK,CACR,CAAC;YACF,MAAM,KAAK,CAAC;SACf;QACD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAClC,CAAC;IAED,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU,CACZ,GAAW,EACX,OAAO,GAAG,EAAE,EACZ,UAAkB,CAAC,EACnB,UAAkB,GAAG;QAErB,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,GAAG,CAAC;QACR,IAAI;YACA,GAAG,GAAG,MAAM,IAAA,oBAAK,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;SACnC;QAAC,OAAO,KAAK,EAAE;YACZ,GAAG,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;SACpC;QACD,IAAI,GAAG,CAAC,EAAE,EAAE;YACR,OAAO,GAAG,CAAC;SACd;QACD,IAAI,OAAO,GAAG,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAChD,UAAU,CACN,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,EAC7D,OAAO,CACV,CAAC;SACL;QACD,OAAO,GAAG,CAAC;IACf,CAAC;CAIJ;AA3DD,wBA2DC"}
|
|
@@ -1,21 +1,8 @@
|
|
|
1
1
|
import Addon from './addon';
|
|
2
|
-
import {
|
|
3
|
-
import { IEvent } from '../types/
|
|
2
|
+
import { IAddonConfig } from '../types/model';
|
|
3
|
+
import { IEvent } from '../types/events';
|
|
4
4
|
export default class DatadogAddon extends Addon {
|
|
5
|
-
|
|
6
|
-
constructor(config:
|
|
7
|
-
unleashUrl: string;
|
|
8
|
-
getLogger: LogProvider;
|
|
9
|
-
});
|
|
5
|
+
private msgFormatter;
|
|
6
|
+
constructor(config: IAddonConfig);
|
|
10
7
|
handleEvent(event: IEvent, parameters: any): Promise<void>;
|
|
11
|
-
generateEnvironmentToggleText(event: IEvent): string;
|
|
12
|
-
generateStrategyChangeText(event: IEvent): string;
|
|
13
|
-
generateMetadataText(event: IEvent): string;
|
|
14
|
-
generateProjectChangeText(event: IEvent): string;
|
|
15
|
-
strategiesLink(event: IEvent): string;
|
|
16
|
-
featureLink(event: IEvent): string;
|
|
17
|
-
generateStaleText(event: IEvent): string;
|
|
18
|
-
generateArchivedText(event: IEvent): string;
|
|
19
|
-
generateText(event: IEvent): string;
|
|
20
|
-
getAction(type: string): string;
|
|
21
8
|
}
|
|
@@ -3,47 +3,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
7
6
|
const addon_1 = __importDefault(require("./addon"));
|
|
8
|
-
const events_1 = require("../types/events");
|
|
9
7
|
const datadog_definition_1 = __importDefault(require("./datadog-definition"));
|
|
8
|
+
const feature_event_formatter_md_1 = require("./feature-event-formatter-md");
|
|
10
9
|
class DatadogAddon extends addon_1.default {
|
|
11
10
|
constructor(config) {
|
|
12
11
|
super(datadog_definition_1.default, config);
|
|
13
|
-
this.
|
|
12
|
+
this.msgFormatter = new feature_event_formatter_md_1.FeatureEventFormatterMd(config.unleashUrl, feature_event_formatter_md_1.LinkStyle.MD);
|
|
14
13
|
}
|
|
15
14
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
16
15
|
async handleEvent(event, parameters) {
|
|
17
16
|
const { url = 'https://api.datadoghq.com/api/v1/events', apiKey } = parameters;
|
|
18
|
-
|
|
19
|
-
if ([events_1.FEATURE_ARCHIVED, events_1.FEATURE_REVIVED].includes(event.type)) {
|
|
20
|
-
text = this.generateArchivedText(event);
|
|
21
|
-
}
|
|
22
|
-
else if ([events_1.FEATURE_STALE_ON, events_1.FEATURE_STALE_OFF].includes(event.type)) {
|
|
23
|
-
text = this.generateStaleText(event);
|
|
24
|
-
}
|
|
25
|
-
else if ([
|
|
26
|
-
events_1.FEATURE_ENVIRONMENT_DISABLED,
|
|
27
|
-
events_1.FEATURE_ENVIRONMENT_ENABLED,
|
|
28
|
-
].includes(event.type)) {
|
|
29
|
-
text = this.generateEnvironmentToggleText(event);
|
|
30
|
-
}
|
|
31
|
-
else if ([
|
|
32
|
-
events_1.FEATURE_STRATEGY_ADD,
|
|
33
|
-
events_1.FEATURE_STRATEGY_REMOVE,
|
|
34
|
-
events_1.FEATURE_STRATEGY_UPDATE,
|
|
35
|
-
].includes(event.type)) {
|
|
36
|
-
text = this.generateStrategyChangeText(event);
|
|
37
|
-
}
|
|
38
|
-
else if (events_1.FEATURE_METADATA_UPDATED === event.type) {
|
|
39
|
-
text = this.generateMetadataText(event);
|
|
40
|
-
}
|
|
41
|
-
else if (events_1.FEATURE_PROJECT_CHANGE === event.type) {
|
|
42
|
-
text = this.generateProjectChangeText(event);
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
text = this.generateText(event);
|
|
46
|
-
}
|
|
17
|
+
const text = this.msgFormatter.format(event);
|
|
47
18
|
const { tags: eventTags } = event;
|
|
48
19
|
const tags = eventTags && eventTags.map((tag) => `${tag.value}:${tag.type}`);
|
|
49
20
|
const body = {
|
|
@@ -62,83 +33,6 @@ class DatadogAddon extends addon_1.default {
|
|
|
62
33
|
const res = await this.fetchRetry(url, requestOpts);
|
|
63
34
|
this.logger.info(`Handled event ${event.type}. Status codes=${res.status}`);
|
|
64
35
|
}
|
|
65
|
-
generateEnvironmentToggleText(event) {
|
|
66
|
-
const { environment, project, data, type } = event;
|
|
67
|
-
const toggleStatus = type === events_1.FEATURE_ENVIRONMENT_ENABLED ? 'enabled' : 'disabled';
|
|
68
|
-
const feature = `<${this.featureLink(event)}|${data.name}>`;
|
|
69
|
-
return `The feature toggle *${feature}* in the ${project} project was ${toggleStatus} in environment *${environment}*`;
|
|
70
|
-
}
|
|
71
|
-
generateStrategyChangeText(event) {
|
|
72
|
-
const { environment, project, data, type } = event;
|
|
73
|
-
const feature = `<${this.strategiesLink(event)}|${data.featureName}>`;
|
|
74
|
-
let action;
|
|
75
|
-
if (events_1.FEATURE_STRATEGY_UPDATE === type) {
|
|
76
|
-
action = 'updated in';
|
|
77
|
-
}
|
|
78
|
-
else if (events_1.FEATURE_STRATEGY_ADD) {
|
|
79
|
-
action = 'added to';
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
action = 'removed from';
|
|
83
|
-
}
|
|
84
|
-
const strategyText = `a ${data.name} strategy ${action} the *${environment}* environment`;
|
|
85
|
-
return `The feature toggle *${feature}* in project: ${project} had ${strategyText}`;
|
|
86
|
-
}
|
|
87
|
-
generateMetadataText(event) {
|
|
88
|
-
const { createdBy, project, data } = event;
|
|
89
|
-
const feature = `<${this.featureLink(event)}|${data.name}>`;
|
|
90
|
-
return `${createdBy} updated the metadata for ${feature} in project ${project}`;
|
|
91
|
-
}
|
|
92
|
-
generateProjectChangeText(event) {
|
|
93
|
-
const { createdBy, project, data } = event;
|
|
94
|
-
return `${createdBy} moved ${data.name} to ${project}`;
|
|
95
|
-
}
|
|
96
|
-
strategiesLink(event) {
|
|
97
|
-
return `${this.unleashUrl}/projects/${event.project}/features2/${event.data.featureName}/strategies?environment=${event.environment}`;
|
|
98
|
-
}
|
|
99
|
-
featureLink(event) {
|
|
100
|
-
const path = event.type === events_1.FEATURE_ARCHIVED ? 'archive' : 'features';
|
|
101
|
-
return `${this.unleashUrl}/${path}/strategies/${event.data.name}`;
|
|
102
|
-
}
|
|
103
|
-
generateStaleText(event) {
|
|
104
|
-
const { createdBy, data, type } = event;
|
|
105
|
-
const isStale = type === events_1.FEATURE_STALE_ON;
|
|
106
|
-
const feature = `[${data.name}](${this.featureLink(event)})`;
|
|
107
|
-
if (isStale) {
|
|
108
|
-
return `The feature toggle *${feature}* is now *ready to be removed* from the code.
|
|
109
|
-
This was changed by ${createdBy}.`;
|
|
110
|
-
}
|
|
111
|
-
return `The feature toggle *${feature}* was *unmarked as stale* by ${createdBy}.`;
|
|
112
|
-
}
|
|
113
|
-
generateArchivedText(event) {
|
|
114
|
-
const { createdBy, data, type } = event;
|
|
115
|
-
const action = type === events_1.FEATURE_ARCHIVED ? 'archived' : 'revived';
|
|
116
|
-
const feature = `[${data.name}](${this.featureLink(event)})`;
|
|
117
|
-
return `The feature toggle *${feature}* was *${action}* by ${createdBy}.`;
|
|
118
|
-
}
|
|
119
|
-
generateText(event) {
|
|
120
|
-
const { createdBy, data, type } = event;
|
|
121
|
-
const action = this.getAction(type);
|
|
122
|
-
const feature = `[${data.name}](${this.featureLink(event)})`;
|
|
123
|
-
const enabled = `**Enabled**: ${data.enabled ? 'yes' : 'no'}`;
|
|
124
|
-
const stale = data.stale ? '("stale")' : '';
|
|
125
|
-
const typeStr = `**Type**: ${data.type}`;
|
|
126
|
-
const project = `**Project**: ${data.project}`;
|
|
127
|
-
const strategies = `**Activation strategies**: \`\`\`${js_yaml_1.default.dump(data.strategies, { skipInvalid: true })}\`\`\``;
|
|
128
|
-
return `${createdBy} ${action} feature toggle ${feature}
|
|
129
|
-
${enabled}${stale} | ${typeStr} | ${project}
|
|
130
|
-
${data.strategies ? strategies : ''}`;
|
|
131
|
-
}
|
|
132
|
-
getAction(type) {
|
|
133
|
-
switch (type) {
|
|
134
|
-
case events_1.FEATURE_CREATED:
|
|
135
|
-
return 'created';
|
|
136
|
-
case events_1.FEATURE_UPDATED:
|
|
137
|
-
return 'updated';
|
|
138
|
-
default:
|
|
139
|
-
return type;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
36
|
}
|
|
143
37
|
exports.default = DatadogAddon;
|
|
144
38
|
//# sourceMappingURL=datadog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datadog.js","sourceRoot":"","sources":["../../../src/lib/addons/datadog.ts"],"names":[],"mappings":";;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"datadog.js","sourceRoot":"","sources":["../../../src/lib/addons/datadog.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAE5B,8EAA8C;AAE9C,6EAIsC;AAGtC,MAAqB,YAAa,SAAQ,eAAK;IAG3C,YAAY,MAAoB;QAC5B,KAAK,CAAC,4BAAU,EAAE,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,oDAAuB,CAC3C,MAAM,CAAC,UAAU,EACjB,sCAAS,CAAC,EAAE,CACf,CAAC;IACN,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,UAAe;QAC5C,MAAM,EAAE,GAAG,GAAG,yCAAyC,EAAE,MAAM,EAAE,GAC7D,UAAU,CAAC;QAEf,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE7C,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;QAClC,MAAM,IAAI,GACN,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,GAAG;YACT,IAAI,EAAE,UAAU,IAAI,UAAU;YAC9B,KAAK,EAAE,6BAA6B;YACpC,IAAI;SACP,CAAC;QAEF,MAAM,WAAW,GAAG;YAChB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACL,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,MAAM;aACvB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC7B,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ,iBAAiB,KAAK,CAAC,IAAI,kBAAkB,GAAG,CAAC,MAAM,EAAE,CAC5D,CAAC;IACN,CAAC;CACJ;AAxCD,+BAwCC"}
|
|
@@ -32,6 +32,7 @@ test('Should call datadog webhook', async () => {
|
|
|
32
32
|
createdAt: new Date(),
|
|
33
33
|
type: events_1.FEATURE_CREATED,
|
|
34
34
|
createdBy: 'some@user.com',
|
|
35
|
+
featureName: 'some-toggle',
|
|
35
36
|
data: {
|
|
36
37
|
name: 'some-toggle',
|
|
37
38
|
enabled: false,
|
|
@@ -56,6 +57,7 @@ test('Should call datadog webhook for archived toggle', async () => {
|
|
|
56
57
|
createdAt: new Date(),
|
|
57
58
|
type: events_1.FEATURE_ARCHIVED,
|
|
58
59
|
createdBy: 'some@user.com',
|
|
60
|
+
featureName: 'some-toggle',
|
|
59
61
|
data: {
|
|
60
62
|
name: 'some-toggle',
|
|
61
63
|
},
|
|
@@ -80,6 +82,7 @@ test(`Should call datadog webhook for toggled environment`, async () => {
|
|
|
80
82
|
createdBy: 'some@user.com',
|
|
81
83
|
environment: 'development',
|
|
82
84
|
project: 'default',
|
|
85
|
+
featureName: 'some-toggle',
|
|
83
86
|
data: {
|
|
84
87
|
name: 'some-toggle',
|
|
85
88
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datadog.test.js","sourceRoot":"","sources":["../../../src/lib/addons/datadog.test.ts"],"names":[],"mappings":";;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"datadog.test.js","sourceRoot":"","sources":["../../../src/lib/addons/datadog.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IEvent } from '../types/events';
|
|
2
|
+
export interface FeatureEventFormatter {
|
|
3
|
+
format: (event: IEvent) => string;
|
|
4
|
+
featureLink: (event: IEvent) => string;
|
|
5
|
+
}
|
|
6
|
+
export declare enum LinkStyle {
|
|
7
|
+
SLACK = 0,
|
|
8
|
+
MD = 1
|
|
9
|
+
}
|
|
10
|
+
export declare class FeatureEventFormatterMd implements FeatureEventFormatter {
|
|
11
|
+
private unleashUrl;
|
|
12
|
+
private linkStyle;
|
|
13
|
+
constructor(unleashUrl: string, linkStyle?: LinkStyle);
|
|
14
|
+
generateArchivedText(event: IEvent): string;
|
|
15
|
+
generateFeatureLink(event: IEvent): string;
|
|
16
|
+
generateStaleText(event: IEvent): string;
|
|
17
|
+
generateEnvironmentToggleText(event: IEvent): string;
|
|
18
|
+
generateStrategyChangeText(event: IEvent): string;
|
|
19
|
+
generateMetadataText(event: IEvent): string;
|
|
20
|
+
generateProjectChangeText(event: IEvent): string;
|
|
21
|
+
featureLink(event: IEvent): string;
|
|
22
|
+
getAction(type: string): string;
|
|
23
|
+
defaultText(event: IEvent): string;
|
|
24
|
+
format(event: IEvent): string;
|
|
25
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeatureEventFormatterMd = exports.LinkStyle = void 0;
|
|
4
|
+
const events_1 = require("../types/events");
|
|
5
|
+
var LinkStyle;
|
|
6
|
+
(function (LinkStyle) {
|
|
7
|
+
LinkStyle[LinkStyle["SLACK"] = 0] = "SLACK";
|
|
8
|
+
LinkStyle[LinkStyle["MD"] = 1] = "MD";
|
|
9
|
+
})(LinkStyle = exports.LinkStyle || (exports.LinkStyle = {}));
|
|
10
|
+
class FeatureEventFormatterMd {
|
|
11
|
+
constructor(unleashUrl, linkStyle = LinkStyle.MD) {
|
|
12
|
+
this.unleashUrl = unleashUrl;
|
|
13
|
+
this.linkStyle = linkStyle;
|
|
14
|
+
}
|
|
15
|
+
generateArchivedText(event) {
|
|
16
|
+
const { createdBy, type } = event;
|
|
17
|
+
const action = type === events_1.FEATURE_ARCHIVED ? 'archived' : 'revived';
|
|
18
|
+
const feature = this.generateFeatureLink(event);
|
|
19
|
+
return ` ${createdBy} just ${action} feature toggle *${feature}*`;
|
|
20
|
+
}
|
|
21
|
+
generateFeatureLink(event) {
|
|
22
|
+
if (this.linkStyle === LinkStyle.SLACK) {
|
|
23
|
+
return `<${this.featureLink(event)}|${event.featureName}>`;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
return `[${event.featureName}](${this.featureLink(event)})`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
generateStaleText(event) {
|
|
30
|
+
const { createdBy, type } = event;
|
|
31
|
+
const isStale = type === events_1.FEATURE_STALE_ON;
|
|
32
|
+
const feature = this.generateFeatureLink(event);
|
|
33
|
+
if (isStale) {
|
|
34
|
+
return `${createdBy} marked ${feature} as stale and this feature toggle is now *ready to be removed* from the code.`;
|
|
35
|
+
}
|
|
36
|
+
return `${createdBy} removed the stale marking on *${feature}*.`;
|
|
37
|
+
}
|
|
38
|
+
generateEnvironmentToggleText(event) {
|
|
39
|
+
const { createdBy, environment, type, project } = event;
|
|
40
|
+
const toggleStatus = type === events_1.FEATURE_ENVIRONMENT_ENABLED ? 'enabled' : 'disabled';
|
|
41
|
+
const feature = this.generateFeatureLink(event);
|
|
42
|
+
return `${createdBy} *${toggleStatus}* ${feature} in *${environment}* environment in project *${project}*`;
|
|
43
|
+
}
|
|
44
|
+
generateStrategyChangeText(event) {
|
|
45
|
+
const { createdBy, environment, project, data, preData, type } = event;
|
|
46
|
+
const feature = this.generateFeatureLink(event);
|
|
47
|
+
let strategyText = '';
|
|
48
|
+
if (events_1.FEATURE_STRATEGY_UPDATE === type) {
|
|
49
|
+
strategyText = `by updating strategy ${data?.name} in *${environment}*`;
|
|
50
|
+
}
|
|
51
|
+
else if (events_1.FEATURE_STRATEGY_ADD === type) {
|
|
52
|
+
strategyText = `by adding strategy ${data?.name} in *${environment}*`;
|
|
53
|
+
}
|
|
54
|
+
else if (events_1.FEATURE_STRATEGY_REMOVE === type) {
|
|
55
|
+
strategyText = `by removing strategy ${preData?.name} in *${environment}*`;
|
|
56
|
+
}
|
|
57
|
+
return `${createdBy} updated *${feature}* in project *${project}* ${strategyText}`;
|
|
58
|
+
}
|
|
59
|
+
generateMetadataText(event) {
|
|
60
|
+
const { createdBy, project } = event;
|
|
61
|
+
const feature = this.generateFeatureLink(event);
|
|
62
|
+
return `${createdBy} updated the metadata for ${feature} in project *${project}*`;
|
|
63
|
+
}
|
|
64
|
+
generateProjectChangeText(event) {
|
|
65
|
+
const { createdBy, project, featureName } = event;
|
|
66
|
+
return `${createdBy} moved ${featureName} to ${project}`;
|
|
67
|
+
}
|
|
68
|
+
featureLink(event) {
|
|
69
|
+
const { type, project = '', featureName } = event;
|
|
70
|
+
if (type === events_1.FEATURE_ARCHIVED) {
|
|
71
|
+
return `${this.unleashUrl}/archive`;
|
|
72
|
+
}
|
|
73
|
+
return `${this.unleashUrl}/projects/${project}/${featureName}`;
|
|
74
|
+
}
|
|
75
|
+
getAction(type) {
|
|
76
|
+
switch (type) {
|
|
77
|
+
case events_1.FEATURE_CREATED:
|
|
78
|
+
return 'created';
|
|
79
|
+
case events_1.FEATURE_UPDATED:
|
|
80
|
+
return 'updated';
|
|
81
|
+
default:
|
|
82
|
+
return type;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
defaultText(event) {
|
|
86
|
+
const { createdBy, project, type } = event;
|
|
87
|
+
const action = this.getAction(type);
|
|
88
|
+
const feature = this.generateFeatureLink(event);
|
|
89
|
+
return `${createdBy} ${action} feature toggle ${feature} in project *${project}*`;
|
|
90
|
+
}
|
|
91
|
+
format(event) {
|
|
92
|
+
switch (event.type) {
|
|
93
|
+
case events_1.FEATURE_ARCHIVED:
|
|
94
|
+
case events_1.FEATURE_REVIVED:
|
|
95
|
+
return this.generateArchivedText(event);
|
|
96
|
+
case events_1.FEATURE_STALE_ON:
|
|
97
|
+
case events_1.FEATURE_STALE_OFF:
|
|
98
|
+
return this.generateStaleText(event);
|
|
99
|
+
case events_1.FEATURE_ENVIRONMENT_DISABLED:
|
|
100
|
+
case events_1.FEATURE_ENVIRONMENT_ENABLED:
|
|
101
|
+
return this.generateEnvironmentToggleText(event);
|
|
102
|
+
case events_1.FEATURE_STRATEGY_ADD:
|
|
103
|
+
case events_1.FEATURE_STRATEGY_REMOVE:
|
|
104
|
+
case events_1.FEATURE_STRATEGY_UPDATE:
|
|
105
|
+
return this.generateStrategyChangeText(event);
|
|
106
|
+
case events_1.FEATURE_METADATA_UPDATED:
|
|
107
|
+
return this.generateMetadataText(event);
|
|
108
|
+
case events_1.FEATURE_PROJECT_CHANGE:
|
|
109
|
+
return this.generateProjectChangeText(event);
|
|
110
|
+
default:
|
|
111
|
+
return this.defaultText(event);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.FeatureEventFormatterMd = FeatureEventFormatterMd;
|
|
116
|
+
//# sourceMappingURL=feature-event-formatter-md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-event-formatter-md.js","sourceRoot":"","sources":["../../../src/lib/addons/feature-event-formatter-md.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/addons/index.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAgC;AAChC,oDAAiC;AACjC,oDAAiC;AACjC,wDAAqC;AAQ9B,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/addons/index.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAgC;AAChC,oDAAiC;AACjC,oDAAiC;AACjC,wDAAqC;AAQ9B,MAAM,SAAS,GAIE,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,EAAE;IAClD,MAAM,MAAM,GAAG;QACX,IAAI,iBAAO,CAAC,EAAE,SAAS,EAAE,CAAC;QAC1B,IAAI,eAAU,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;QACzC,IAAI,eAAU,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;QACzC,IAAI,iBAAY,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;KAC9C,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAChC,6CAA6C;QAC7C,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACxB,OAAO,GAAG,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;AACX,CAAC,CAAC;AAhBW,QAAA,SAAS,aAgBpB"}
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import Addon from './addon';
|
|
2
|
-
import { IAddonConfig
|
|
2
|
+
import { IAddonConfig } from '../types/model';
|
|
3
|
+
import { IEvent } from '../types/events';
|
|
3
4
|
export default class SlackAddon extends Addon {
|
|
4
|
-
|
|
5
|
+
private msgFormatter;
|
|
5
6
|
constructor(args: IAddonConfig);
|
|
6
7
|
handleEvent(event: IEvent, parameters: any): Promise<void>;
|
|
7
|
-
generateEnvironmentToggleText(event: IEvent): string;
|
|
8
|
-
generateStrategyChangeText(event: IEvent): string;
|
|
9
|
-
generateMetadataText(event: IEvent): string;
|
|
10
|
-
generateProjectChangeText(event: IEvent): string;
|
|
11
|
-
strategiesLink(event: IEvent): string;
|
|
12
|
-
featureLink(event: IEvent): string;
|
|
13
8
|
findSlackChannels({ tags }: Pick<IEvent, 'tags'>): string[];
|
|
14
|
-
generateStaleText(event: IEvent): string;
|
|
15
|
-
generateArchivedText(event: IEvent): string;
|
|
16
|
-
generateText(event: IEvent): string;
|
|
17
|
-
getAction(type: string): string;
|
|
18
9
|
}
|
package/dist/lib/addons/slack.js
CHANGED
|
@@ -3,14 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
7
6
|
const addon_1 = __importDefault(require("./addon"));
|
|
8
7
|
const slack_definition_1 = __importDefault(require("./slack-definition"));
|
|
9
|
-
const
|
|
8
|
+
const feature_event_formatter_md_1 = require("./feature-event-formatter-md");
|
|
10
9
|
class SlackAddon extends addon_1.default {
|
|
11
10
|
constructor(args) {
|
|
12
11
|
super(slack_definition_1.default, args);
|
|
13
|
-
this.
|
|
12
|
+
this.msgFormatter = new feature_event_formatter_md_1.FeatureEventFormatterMd(args.unleashUrl, feature_event_formatter_md_1.LinkStyle.SLACK);
|
|
14
13
|
}
|
|
15
14
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
|
16
15
|
async handleEvent(event, parameters) {
|
|
@@ -19,35 +18,8 @@ class SlackAddon extends addon_1.default {
|
|
|
19
18
|
if (slackChannels.length === 0) {
|
|
20
19
|
slackChannels.push(defaultChannel);
|
|
21
20
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
text = this.generateArchivedText(event);
|
|
25
|
-
}
|
|
26
|
-
else if ([events_1.FEATURE_STALE_ON, events_1.FEATURE_STALE_OFF].includes(event.type)) {
|
|
27
|
-
text = this.generateStaleText(event);
|
|
28
|
-
}
|
|
29
|
-
else if ([
|
|
30
|
-
events_1.FEATURE_ENVIRONMENT_DISABLED,
|
|
31
|
-
events_1.FEATURE_ENVIRONMENT_ENABLED,
|
|
32
|
-
].includes(event.type)) {
|
|
33
|
-
text = this.generateEnvironmentToggleText(event);
|
|
34
|
-
}
|
|
35
|
-
else if ([
|
|
36
|
-
events_1.FEATURE_STRATEGY_ADD,
|
|
37
|
-
events_1.FEATURE_STRATEGY_REMOVE,
|
|
38
|
-
events_1.FEATURE_STRATEGY_UPDATE,
|
|
39
|
-
].includes(event.type)) {
|
|
40
|
-
text = this.generateStrategyChangeText(event);
|
|
41
|
-
}
|
|
42
|
-
else if (events_1.FEATURE_METADATA_UPDATED === event.type) {
|
|
43
|
-
text = this.generateMetadataText(event);
|
|
44
|
-
}
|
|
45
|
-
else if (events_1.FEATURE_PROJECT_CHANGE === event.type) {
|
|
46
|
-
text = this.generateProjectChangeText(event);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
text = this.generateText(event);
|
|
50
|
-
}
|
|
21
|
+
const text = this.msgFormatter.format(event);
|
|
22
|
+
const featureLink = this.msgFormatter.featureLink(event);
|
|
51
23
|
const requests = slackChannels.map((channel) => {
|
|
52
24
|
const body = {
|
|
53
25
|
username,
|
|
@@ -63,7 +35,7 @@ class SlackAddon extends addon_1.default {
|
|
|
63
35
|
type: 'button',
|
|
64
36
|
value: 'featureToggle',
|
|
65
37
|
style: 'primary',
|
|
66
|
-
url:
|
|
38
|
+
url: featureLink,
|
|
67
39
|
},
|
|
68
40
|
],
|
|
69
41
|
},
|
|
@@ -80,44 +52,6 @@ class SlackAddon extends addon_1.default {
|
|
|
80
52
|
const codes = results.map((res) => res.status).join(', ');
|
|
81
53
|
this.logger.info(`Handled event ${event.type}. Status codes=${codes}`);
|
|
82
54
|
}
|
|
83
|
-
generateEnvironmentToggleText(event) {
|
|
84
|
-
const { environment, project, data, type } = event;
|
|
85
|
-
const toggleStatus = type === events_1.FEATURE_ENVIRONMENT_ENABLED ? 'enabled' : 'disabled';
|
|
86
|
-
const feature = `<${this.featureLink(event)}|${data.name}>`;
|
|
87
|
-
return `The feature toggle *${feature}* in the ${project} project was ${toggleStatus} in environment *${environment}*`;
|
|
88
|
-
}
|
|
89
|
-
generateStrategyChangeText(event) {
|
|
90
|
-
const { environment, project, data, type } = event;
|
|
91
|
-
const feature = `<${this.strategiesLink(event)}|${data.featureName}>`;
|
|
92
|
-
let action;
|
|
93
|
-
if (events_1.FEATURE_STRATEGY_UPDATE === type) {
|
|
94
|
-
action = 'updated in';
|
|
95
|
-
}
|
|
96
|
-
else if (events_1.FEATURE_STRATEGY_ADD) {
|
|
97
|
-
action = 'added to';
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
action = 'removed from';
|
|
101
|
-
}
|
|
102
|
-
const strategyText = `a ${data.name} strategy ${action} the *${environment}* environment`;
|
|
103
|
-
return `The feature toggle *${feature}* in project: ${project} had ${strategyText}`;
|
|
104
|
-
}
|
|
105
|
-
generateMetadataText(event) {
|
|
106
|
-
const { createdBy, project, data } = event;
|
|
107
|
-
const feature = `<${this.featureLink(event)}|${data.name}>`;
|
|
108
|
-
return `${createdBy} updated the metadata for ${feature} in project ${project}`;
|
|
109
|
-
}
|
|
110
|
-
generateProjectChangeText(event) {
|
|
111
|
-
const { createdBy, project, data } = event;
|
|
112
|
-
return `${createdBy} moved ${data.name} to ${project}`;
|
|
113
|
-
}
|
|
114
|
-
strategiesLink(event) {
|
|
115
|
-
return `${this.unleashUrl}/projects/${event.project}/features2/${event.data.featureName}/strategies?environment=${event.environment}`;
|
|
116
|
-
}
|
|
117
|
-
featureLink(event) {
|
|
118
|
-
const path = event.type === events_1.FEATURE_ARCHIVED ? 'archive' : 'features';
|
|
119
|
-
return `${this.unleashUrl}/${path}/strategies/${event.data.name}`;
|
|
120
|
-
}
|
|
121
55
|
findSlackChannels({ tags }) {
|
|
122
56
|
if (tags) {
|
|
123
57
|
return tags
|
|
@@ -126,45 +60,6 @@ class SlackAddon extends addon_1.default {
|
|
|
126
60
|
}
|
|
127
61
|
return [];
|
|
128
62
|
}
|
|
129
|
-
generateStaleText(event) {
|
|
130
|
-
const { createdBy, data, type } = event;
|
|
131
|
-
const isStale = type === events_1.FEATURE_STALE_ON;
|
|
132
|
-
const feature = `<${this.featureLink(event)}|${data.name}>`;
|
|
133
|
-
if (isStale) {
|
|
134
|
-
return `The feature toggle *${feature}* is now *ready to be removed* from the code. :technologist:
|
|
135
|
-
This was changed by ${createdBy}.`;
|
|
136
|
-
}
|
|
137
|
-
return `The feature toggle *${feature}* was *unmarked as stale* by ${createdBy}.`;
|
|
138
|
-
}
|
|
139
|
-
generateArchivedText(event) {
|
|
140
|
-
const { createdBy, data, type } = event;
|
|
141
|
-
const action = type === events_1.FEATURE_ARCHIVED ? 'archived' : 'revived';
|
|
142
|
-
const feature = `<${this.featureLink(event)}|${data.name}>`;
|
|
143
|
-
return `The feature toggle *${feature}* was *${action}* by ${createdBy}.`;
|
|
144
|
-
}
|
|
145
|
-
generateText(event) {
|
|
146
|
-
const { createdBy, data, type } = event;
|
|
147
|
-
const action = this.getAction(type);
|
|
148
|
-
const feature = `<${this.featureLink(event)}|${data.name}>`;
|
|
149
|
-
const enabled = `*Enabled*: ${data.enabled ? 'yes' : 'no'}`;
|
|
150
|
-
const stale = data.stale ? '("stale")' : '';
|
|
151
|
-
const typeStr = `*Type*: ${data.type}`;
|
|
152
|
-
const project = `*Project*: ${data.project}`;
|
|
153
|
-
const strategies = `*Activation strategies*: \`\`\`${js_yaml_1.default.dump(data.strategies, { skipInvalid: true })}\`\`\``;
|
|
154
|
-
return `${createdBy} ${action} feature toggle ${feature}
|
|
155
|
-
${enabled}${stale} | ${typeStr} | ${project}
|
|
156
|
-
${data.strategies ? strategies : ''}`;
|
|
157
|
-
}
|
|
158
|
-
getAction(type) {
|
|
159
|
-
switch (type) {
|
|
160
|
-
case events_1.FEATURE_CREATED:
|
|
161
|
-
return 'created';
|
|
162
|
-
case events_1.FEATURE_UPDATED:
|
|
163
|
-
return 'updated';
|
|
164
|
-
default:
|
|
165
|
-
return type;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
63
|
}
|
|
169
64
|
exports.default = SlackAddon;
|
|
170
65
|
module.exports = SlackAddon;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/lib/addons/slack.ts"],"names":[],"mappings":";;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/lib/addons/slack.ts"],"names":[],"mappings":";;;;;AAAA,oDAA4B;AAE5B,0EAAiD;AAGjD,6EAIsC;AAGtC,MAAqB,UAAW,SAAQ,eAAK;IAGzC,YAAY,IAAkB;QAC1B,KAAK,CAAC,0BAAe,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,oDAAuB,CAC3C,IAAI,CAAC,UAAU,EACf,sCAAS,CAAC,KAAK,CAClB,CAAC;IACN,CAAC;IAED,6EAA6E;IAC7E,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,UAAe;QAC5C,MAAM,EACF,GAAG,EACH,cAAc,EACd,QAAQ,GAAG,SAAS,EACpB,SAAS,GAAG,WAAW,GAC1B,GAAG,UAAU,CAAC;QAEf,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEpD,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YAC5B,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACtC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAEzD,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG;gBACT,QAAQ;gBACR,UAAU,EAAE,SAAS;gBACrB,IAAI;gBACJ,OAAO,EAAE,IAAI,OAAO,EAAE;gBACtB,WAAW,EAAE;oBACT;wBACI,OAAO,EAAE;4BACL;gCACI,IAAI,EAAE,eAAe;gCACrB,IAAI,EAAE,iBAAiB;gCACvB,IAAI,EAAE,QAAQ;gCACd,KAAK,EAAE,eAAe;gCACtB,KAAK,EAAE,SAAS;gCAChB,GAAG,EAAE,WAAW;6BACnB;yBACJ;qBACJ;iBACJ;aACJ,CAAC;YAEF,MAAM,WAAW,GAAG;gBAChB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC7B,CAAC;YAEF,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,kBAAkB,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,iBAAiB,CAAC,EAAE,IAAI,EAAwB;QAC5C,IAAI,IAAI,EAAE;YACN,OAAO,IAAI;iBACN,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC;iBACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SAC5B;QACD,OAAO,EAAE,CAAC;IACd,CAAC;CACJ;AAzED,6BAyEC;AAED,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC"}
|