@crowdstrike/foundry-js 0.19.0 → 0.21.0

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.
@@ -39,8 +39,7 @@ export interface PostEntitiesSavedSearchesDynamicExecuteV1QueryParams extends Ba
39
39
  includeTestData?: QueryParam;
40
40
  }
41
41
  export type PostEntitiesSavedSearchesDynamicExecuteV1ApiResponse = ApiResponsePayload;
42
- export interface PostEntitiesSavedSearchesDynamicExecuteV1PostData {
43
- }
42
+ export type PostEntitiesSavedSearchesDynamicExecuteV1PostData = Record<string, never>;
44
43
  export type PostEntitiesSavedSearchesDynamicExecuteV1ResponseMessage = BaseApiResponseMessage<PostEntitiesSavedSearchesDynamicExecuteV1ApiResponse>;
45
44
  export interface PostEntitiesSavedSearchesDynamicExecuteV1RequestMessage extends BaseApiRequestMessage<PostEntitiesSavedSearchesDynamicExecuteV1QueryParams, PostEntitiesSavedSearchesDynamicExecuteV1PostData> {
46
45
  api: LoggingapiRequestApi;
@@ -54,8 +53,7 @@ export interface PostEntitiesSavedSearchesExecuteV1QueryParams extends BaseUrlPa
54
53
  detailed?: QueryParam;
55
54
  }
56
55
  export type PostEntitiesSavedSearchesExecuteV1ApiResponse = ApiResponsePayload;
57
- export interface PostEntitiesSavedSearchesExecuteV1PostData {
58
- }
56
+ export type PostEntitiesSavedSearchesExecuteV1PostData = Record<string, never>;
59
57
  export type PostEntitiesSavedSearchesExecuteV1ResponseMessage = BaseApiResponseMessage<PostEntitiesSavedSearchesExecuteV1ApiResponse>;
60
58
  export interface PostEntitiesSavedSearchesExecuteV1RequestMessage extends BaseApiRequestMessage<PostEntitiesSavedSearchesExecuteV1QueryParams, PostEntitiesSavedSearchesExecuteV1PostData> {
61
59
  api: LoggingapiRequestApi;
@@ -63,8 +61,7 @@ export interface PostEntitiesSavedSearchesExecuteV1RequestMessage extends BaseAp
63
61
  }
64
62
  export type PostEntitiesSavedSearchesIngestV1QueryParams = BaseUrlParams;
65
63
  export type PostEntitiesSavedSearchesIngestV1ApiResponse = ApiResponsePayload;
66
- export interface PostEntitiesSavedSearchesIngestV1PostData {
67
- }
64
+ export type PostEntitiesSavedSearchesIngestV1PostData = Record<string, never>;
68
65
  export type PostEntitiesSavedSearchesIngestV1ResponseMessage = BaseApiResponseMessage<PostEntitiesSavedSearchesIngestV1ApiResponse>;
69
66
  export interface PostEntitiesSavedSearchesIngestV1RequestMessage extends BaseApiRequestMessage<PostEntitiesSavedSearchesIngestV1QueryParams, PostEntitiesSavedSearchesIngestV1PostData> {
70
67
  api: LoggingapiRequestApi;
@@ -33,8 +33,7 @@ export interface GetEntitiesDefinitionsV1RequestMessage extends BaseApiRequestMe
33
33
  }
34
34
  export type PostEntitiesExecuteDraftV1QueryParams = BaseUrlParams;
35
35
  export type PostEntitiesExecuteDraftV1ApiResponse = ApiResponsePayload;
36
- export interface PostEntitiesExecuteDraftV1PostData {
37
- }
36
+ export type PostEntitiesExecuteDraftV1PostData = Record<string, never>;
38
37
  export type PostEntitiesExecuteDraftV1ResponseMessage = BaseApiResponseMessage<PostEntitiesExecuteDraftV1ApiResponse>;
39
38
  export interface PostEntitiesExecuteDraftV1RequestMessage extends BaseApiRequestMessage<PostEntitiesExecuteDraftV1QueryParams, PostEntitiesExecuteDraftV1PostData> {
40
39
  api: PluginsRequestApi;
@@ -42,8 +41,13 @@ export interface PostEntitiesExecuteDraftV1RequestMessage extends BaseApiRequest
42
41
  }
43
42
  export type PostEntitiesExecuteV1QueryParams = BaseUrlParams;
44
43
  export type PostEntitiesExecuteV1ApiResponse = ApiResponsePayload;
45
- export interface PostEntitiesExecuteV1PostData {
46
- }
44
+ export type PostEntitiesExecuteV1PostData = {
45
+ resources?: Array<{
46
+ definition_id?: string;
47
+ operation_id?: string;
48
+ request?: Record<string, unknown>;
49
+ }>;
50
+ };
47
51
  export type PostEntitiesExecuteV1ResponseMessage = BaseApiResponseMessage<PostEntitiesExecuteV1ApiResponse>;
48
52
  export interface PostEntitiesExecuteV1RequestMessage extends BaseApiRequestMessage<PostEntitiesExecuteV1QueryParams, PostEntitiesExecuteV1PostData> {
49
53
  api: PluginsRequestApi;
@@ -26,7 +26,7 @@ import { WorkflowsApiBridge } from './workflows';
26
26
  import type FalconApi from '../api';
27
27
  export default class FalconPublicApis {
28
28
  private api;
29
- constructor(api: FalconApi<any>);
29
+ constructor(api: FalconApi);
30
30
  get alerts(): AlertsApiBridge;
31
31
  get detects(): DetectsApiBridge;
32
32
  get devices(): DevicesApiBridge;
@@ -56,8 +56,7 @@ export interface PostEntitiesAppCommandV1QueryParams extends BaseUrlParams {
56
56
  appScriptVersion?: QueryParam;
57
57
  }
58
58
  export type PostEntitiesAppCommandV1ApiResponse = ApiResponsePayload;
59
- export interface PostEntitiesAppCommandV1PostData {
60
- }
59
+ export type PostEntitiesAppCommandV1PostData = Record<string, never>;
61
60
  export type PostEntitiesAppCommandV1ResponseMessage = BaseApiResponseMessage<PostEntitiesAppCommandV1ApiResponse>;
62
61
  export interface PostEntitiesAppCommandV1RequestMessage extends BaseApiRequestMessage<PostEntitiesAppCommandV1QueryParams, PostEntitiesAppCommandV1PostData> {
63
62
  api: RemoteResponseRequestApi;
@@ -68,8 +67,7 @@ export interface PostEntitiesAppSessionsV1QueryParams extends BaseUrlParams {
68
67
  timeoutDuration?: QueryParam;
69
68
  }
70
69
  export type PostEntitiesAppSessionsV1ApiResponse = ApiResponsePayload;
71
- export interface PostEntitiesAppSessionsV1PostData {
72
- }
70
+ export type PostEntitiesAppSessionsV1PostData = Record<string, never>;
73
71
  export type PostEntitiesAppSessionsV1ResponseMessage = BaseApiResponseMessage<PostEntitiesAppSessionsV1ApiResponse>;
74
72
  export interface PostEntitiesAppSessionsV1RequestMessage extends BaseApiRequestMessage<PostEntitiesAppSessionsV1QueryParams, PostEntitiesAppSessionsV1PostData> {
75
73
  api: RemoteResponseRequestApi;
@@ -77,8 +75,7 @@ export interface PostEntitiesAppSessionsV1RequestMessage extends BaseApiRequestM
77
75
  }
78
76
  export type PostEntitiesPutFilesV1QueryParams = BaseUrlParams;
79
77
  export type PostEntitiesPutFilesV1ApiResponse = ApiResponsePayload;
80
- export interface PostEntitiesPutFilesV1PostData {
81
- }
78
+ export type PostEntitiesPutFilesV1PostData = Record<string, never>;
82
79
  export type PostEntitiesPutFilesV1ResponseMessage = BaseApiResponseMessage<PostEntitiesPutFilesV1ApiResponse>;
83
80
  export interface PostEntitiesPutFilesV1RequestMessage extends BaseApiRequestMessage<PostEntitiesPutFilesV1QueryParams, PostEntitiesPutFilesV1PostData> {
84
81
  api: RemoteResponseRequestApi;
@@ -26,8 +26,7 @@ export interface GetQueriesUsersV1RequestMessage extends BaseApiRequestMessage<G
26
26
  }
27
27
  export type PostEntitiesUsersGetV1QueryParams = BaseUrlParams;
28
28
  export type PostEntitiesUsersGetV1ApiResponse = ApiResponsePayload;
29
- export interface PostEntitiesUsersGetV1PostData {
30
- }
29
+ export type PostEntitiesUsersGetV1PostData = Record<string, never>;
31
30
  export type PostEntitiesUsersGetV1ResponseMessage = BaseApiResponseMessage<PostEntitiesUsersGetV1ApiResponse>;
32
31
  export interface PostEntitiesUsersGetV1RequestMessage extends BaseApiRequestMessage<PostEntitiesUsersGetV1QueryParams, PostEntitiesUsersGetV1PostData> {
33
32
  api: UserManagementRequestApi;
@@ -28,8 +28,7 @@ export interface PostEntitiesExecuteV1QueryParams extends BaseUrlParams {
28
28
  depth?: QueryParam;
29
29
  }
30
30
  export type PostEntitiesExecuteV1ApiResponse = ApiResponsePayload;
31
- export interface PostEntitiesExecuteV1PostData {
32
- }
31
+ export type PostEntitiesExecuteV1PostData = Record<string, never>;
33
32
  export type PostEntitiesExecuteV1ResponseMessage = BaseApiResponseMessage<PostEntitiesExecuteV1ApiResponse>;
34
33
  export interface PostEntitiesExecuteV1RequestMessage extends BaseApiRequestMessage<PostEntitiesExecuteV1QueryParams, PostEntitiesExecuteV1PostData> {
35
34
  api: WorkflowsRequestApi;
@@ -39,8 +38,7 @@ export interface PostEntitiesExecutionActionsV1QueryParams extends BaseUrlParams
39
38
  actionName: QueryParam;
40
39
  }
41
40
  export type PostEntitiesExecutionActionsV1ApiResponse = ApiResponsePayload;
42
- export interface PostEntitiesExecutionActionsV1PostData {
43
- }
41
+ export type PostEntitiesExecutionActionsV1PostData = Record<string, never>;
44
42
  export type PostEntitiesExecutionActionsV1ResponseMessage = BaseApiResponseMessage<PostEntitiesExecutionActionsV1ApiResponse>;
45
43
  export interface PostEntitiesExecutionActionsV1RequestMessage extends BaseApiRequestMessage<PostEntitiesExecutionActionsV1QueryParams, PostEntitiesExecutionActionsV1PostData> {
46
44
  api: WorkflowsRequestApi;
package/dist/index.js CHANGED
@@ -1,3 +1,9 @@
1
+ var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;
2
+
3
+ function validate(uuid) {
4
+ return typeof uuid === 'string' && REGEX.test(uuid);
5
+ }
6
+
1
7
  const byteToHex = [];
2
8
  for (let i = 0; i < 256; ++i) {
3
9
  byteToHex.push((i + 0x100).toString(16).slice(1));
@@ -40,10 +46,7 @@ function rng() {
40
46
  const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);
41
47
  var native = { randomUUID };
42
48
 
43
- function v4(options, buf, offset) {
44
- if (native.randomUUID && true && !options) {
45
- return native.randomUUID();
46
- }
49
+ function _v4(options, buf, offset) {
47
50
  options = options || {};
48
51
  const rnds = options.random ?? options.rng?.() ?? rng();
49
52
  if (rnds.length < 16) {
@@ -53,6 +56,12 @@ function v4(options, buf, offset) {
53
56
  rnds[8] = (rnds[8] & 0x3f) | 0x80;
54
57
  return unsafeStringify(rnds);
55
58
  }
59
+ function v4(options, buf, offset) {
60
+ if (native.randomUUID && true && !options) {
61
+ return native.randomUUID();
62
+ }
63
+ return _v4(options);
64
+ }
56
65
 
57
66
  const VERSION = 'current';
58
67
 
@@ -70,6 +79,13 @@ event) {
70
79
  const CONNECTION_TIMEOUT = 5_000;
71
80
  const API_TIMEOUT = 30_000;
72
81
  const NAVIGATION_TIMEOUT = 5_000;
82
+ function sanitizeMessageId(messageId) {
83
+ // Only allow valid UUID strings
84
+ if (typeof messageId !== 'string' || !validate(messageId)) {
85
+ return null;
86
+ }
87
+ return messageId;
88
+ }
73
89
  function timeoutForMessage(message) {
74
90
  const timeout = message.type === 'connect'
75
91
  ? CONNECTION_TIMEOUT
@@ -161,12 +177,18 @@ class Bridge {
161
177
  return;
162
178
  }
163
179
  const { messageId } = event.data.meta;
164
- const callback = this.pendingMessages.get(messageId);
165
- if (!callback) {
180
+ // Sanitize messageId to prevent unvalidated dynamic method calls
181
+ const sanitizedMessageId = sanitizeMessageId(messageId);
182
+ if (!sanitizedMessageId) {
183
+ this.throwError(`Received message with invalid messageId format`);
184
+ return;
185
+ }
186
+ const callback = this.pendingMessages.get(sanitizedMessageId);
187
+ if (!callback || typeof callback !== 'function') {
166
188
  this.throwError(`Received unexpected message`);
167
189
  return;
168
190
  }
169
- this.pendingMessages.delete(messageId);
191
+ this.pendingMessages.delete(sanitizedMessageId);
170
192
  callback(message.payload);
171
193
  };
172
194
  throwError(message) {
@@ -3243,6 +3265,9 @@ class Navigation {
3243
3265
  },
3244
3266
  });
3245
3267
  }
3268
+ /**
3269
+ * @deprecated Use navigateTo directly
3270
+ */
3246
3271
  async onClick(event, defaultTarget = '_self', defaultType = 'falcon') {
3247
3272
  if (!(event instanceof Event)) {
3248
3273
  throw Error('"event" property should be subclass of Event');
@@ -3543,4 +3568,3 @@ __decorate([
3543
3568
  ], FalconApi.prototype, "logscale", null);
3544
3569
 
3545
3570
  export { Bridge, FalconApi as default };
3546
- //# sourceMappingURL=index.js.map
@@ -13,6 +13,9 @@ export declare class Navigation<DATA extends LocalData = LocalData> {
13
13
  ctrlKey?: boolean;
14
14
  shiftKey?: boolean;
15
15
  }): Promise<void>;
16
+ /**
17
+ * @deprecated Use navigateTo directly
18
+ */
16
19
  onClick(event: MouseEvent | KeyboardEvent, defaultTarget?: (typeof ALLOWED_TARGETS)[number], defaultType?: NavigateToRequestMessage['payload']['type']): Promise<void>;
17
20
  }
18
21
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crowdstrike/foundry-js",
3
- "version": "0.19.0",
3
+ "version": "0.21.0",
4
4
  "description": "foundry-js is the JavaScript SDK for authoring UI Extensions for CrowdStrike's Foundry platform.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -29,54 +29,42 @@
29
29
  "files": [
30
30
  "dist"
31
31
  ],
32
- "scripts": {
33
- "_build": "concurrently 'npm:build:*'",
34
- "_start": "concurrently 'npm:watch:*'",
35
- "build": "rollup -c ./config/rollup.config.ts --configPlugin typescript",
36
- "api-docs": "typedoc",
37
- "lint": "concurrently 'npm:lint:*(!fix)' --names 'lint:'",
38
- "lint:fix": "concurrently 'npm:lint:*:fix' --names 'fix:'",
39
- "lint:js": "eslint . --cache",
40
- "lint:js:fix": "eslint . --fix",
41
- "lint:types": "tsc --noEmit",
42
- "prepublishOnly": "yarn build",
43
- "release": "changeset publish",
44
- "start": "yarn build --watch",
45
- "test": "vitest"
46
- },
47
32
  "dependencies": {
48
- "emittery": "^1.0.3",
49
- "typescript-memoize": "^1.1.1",
50
- "uuid": "^11.1.0"
33
+ "emittery": "1.2.0",
34
+ "typescript-memoize": "1.1.1",
35
+ "uuid": "13.0.0"
51
36
  },
52
37
  "devDependencies": {
53
- "@changesets/changelog-github": "^0.5.0",
54
- "@changesets/cli": "^2.27.3",
38
+ "@changesets/changelog-github": "0.5.1",
39
+ "@changesets/cli": "2.29.7",
40
+ "@eslint/js": "9.36.0",
55
41
  "@rollup/plugin-node-resolve": "16.0.1",
56
- "@rollup/plugin-replace": "^6.0.2",
42
+ "@rollup/plugin-replace": "6.0.2",
57
43
  "@rollup/plugin-typescript": "12.1.4",
58
- "@types/uuid": "10.0.0",
59
- "@typescript-eslint/eslint-plugin": "^5.59.2",
60
- "@typescript-eslint/parser": "^8.34.0",
61
- "concurrently": "^9.1.2",
62
- "eslint": "^8.40.0",
63
- "eslint-config-prettier": "^10.1.5",
64
- "eslint-plugin-import": "^2.28.1",
65
- "eslint-plugin-prettier": "^5.0.0",
66
- "eslint-plugin-sort-imports-es6-autofix": "^0.6.0",
67
- "happy-dom": "^18.0.1",
68
- "jsdom": "^26.1.0",
69
- "p-event": "^6.0.1",
70
- "prettier": "^3.2.5",
71
- "rollup": "4.45.1",
44
+ "@types/node": "25.0.3",
45
+ "@typescript-eslint/eslint-plugin": "8.45.0",
46
+ "@typescript-eslint/parser": "8.45.0",
47
+ "concurrently": "9.2.1",
48
+ "eslint": "9.39.1",
49
+ "happy-dom": "20.0.2",
50
+ "p-event": "7.0.0",
51
+ "rollup": "4.54.0",
72
52
  "tslib": "2.8.1",
73
- "typedoc": "^0.28.5",
74
- "typedoc-plugin-missing-exports": "^4.0.0",
75
- "typedoc-plugin-rename-defaults": "^0.7.0",
76
- "typescript": "5.8.3",
77
- "vitest": "^3.1.4"
53
+ "typescript": "5.9.3",
54
+ "vitest": "4.0.13"
78
55
  },
79
56
  "engines": {
80
57
  "node": ">=22"
58
+ },
59
+ "scripts": {
60
+ "build": "rollup -c ./config/rollup.config.ts --configPlugin typescript",
61
+ "lint": "concurrently 'npm:lint:*(!fix)' --names 'lint:'",
62
+ "lint:fix": "concurrently 'npm:lint:*:fix' --names 'fix:'",
63
+ "lint:js": "eslint . --cache",
64
+ "lint:js:fix": "eslint . --fix",
65
+ "lint:types": "tsc --noEmit",
66
+ "release": "changeset publish",
67
+ "start": "pnpm build --watch",
68
+ "test": "vitest"
81
69
  }
82
- }
70
+ }