Skip to content

Commit 5d2ab89

Browse files
committed
@types/node on types package + add more helper functions to types/utils
1 parent f181c8c commit 5d2ab89

5 files changed

Lines changed: 111 additions & 4 deletions

File tree

packages/types/CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,22 @@ For prereleases:
1919
- Pre-release versions (x.x.x-pre.x) are unstable releases for the designated API version. These contain work-in-progress types and annotations. Pre-release versions are not meant to be used except for trying out new API interfaces and giving feedback, and may change without prior programmatic or verbal notice. Pre-release versions are meant to be used with new builds from the `dev` branch of the base extension repo.
2020
- Release candidates (x.x.x-rc.x) are stable previews for the designated API version. These contain types that are more or less finalized for the designated release. Breaking changes should not be expected, both in type signature and functionality, but will always be highlighted in the changelog if necessary. This is also meant for feedback, but only for more subtle feedback before releasing that version such that it simply just contains bug fixes and very minor changes.
2121

22+
## 1.0.0-pre.15
23+
24+
### Added
25+
26+
- There are now some new helper functions exported from `./utils`, similar the `defineAction` helper:
27+
- `defineValidator` for defining a validator (sync or async).
28+
- `defineHandler` for defining a handler.
29+
- `defineCancelEvent` for defining a cancel event generator.
30+
- `defineCancelEventInitializer` for defining an object with arguments to construct a cancel event class.
31+
- `defineEventInfoArray` for defining an array where the first element is a `vscode.Event` interface, and the second element is a predicate.
32+
- `defineEventPredicate` for defining a predicate for a cancel event (sync and async).
33+
- `definePromptGenerator` for defining a Copilot prompt generator.
34+
- `defineReasonGenerator` for defining a cancel event reason generator.
35+
- `defineSetupHook` for defining a context setup hook.
36+
- Note that these are meant to be used standalone, so you can get type hints if you want to reuse these components across actions. If you're already defining an action via `defineAction` and don't need to reuse those components across actions, you shouldn't need to use these helper functions (and is discouraged since it can overcomplicate type checking).
37+
2238
## 1.0.0-pre.14
2339

2440
### Breaking changes

packages/types/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"license": "MIT",
2929
"devDependencies": {
3030
"@arethetypeswrong/core": "^0.18.4",
31+
"@types/node": "^24.12.0",
3132
"@types/vscode": "^1.95.0",
3233
"@typescript/native-preview": "7.0.0-dev.20260418.1",
3334
"tsdown": "^0.22.3"

packages/types/src/utils/index.ts

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as vscode from 'vscode';
2-
import type { SchemaTypes, InferDataFromSchema, RCEAction } from '../actions/types';
2+
import type { SchemaTypes, InferDataFromSchema, RCEAction, ActionValidationResult, ActionHandlerResult } from '../actions/types';
3+
import { RCECancelEvent, RCECancelEventInitializer, RCEContext } from '../actions';
34

45
//#region Context consistency
56

@@ -226,7 +227,6 @@ export function getRequiredFence(text: string): string {
226227
* @param action The action definition
227228
* @returns The same action with full type inference
228229
* @example
229-
* // Event type is inferred from cancelEvents
230230
* defineAction({
231231
* name: 'my_action',
232232
* schema: z.object({ file: z.string() }),
@@ -240,7 +240,94 @@ export function defineAction<
240240
const TData extends object | undefined,
241241
const TSchema extends SchemaTypes,
242242
const TInput extends InferDataFromSchema<TSchema>,
243-
>(action: RCEAction<TData, TSchema, TInput>): RCEAction<TData, TSchema, TInput> {
243+
>(action: RCEAction<TData, TSchema, TInput>): typeof action {
244244
return action;
245+
};
246+
247+
/* @__NO_SIDE_EFFECTS__ */
248+
export function defineValidator<
249+
const TData extends object | undefined,
250+
const TSchema extends SchemaTypes,
251+
const TInput extends InferDataFromSchema<TSchema>,
252+
const TReturn extends ActionValidationResult | Thenable<ActionValidationResult>,
253+
>(validator: (ctx: RCEContext<TData, TSchema, TInput>) => TReturn): typeof validator {
254+
return validator;
255+
};
256+
257+
/* @__NO_SIDE_EFFECTS__ */
258+
export function defineHandler<
259+
const TData extends object | undefined,
260+
const TSchema extends SchemaTypes,
261+
const TInput extends InferDataFromSchema<TSchema>,
262+
const TReturn extends ActionHandlerResult | Thenable<ActionHandlerResult>,
263+
>(handler: (ctx: RCEContext<TData, TSchema, TInput>) => TReturn): typeof handler {
264+
return handler;
265+
};
266+
267+
/* @__NO_SIDE_EFFECTS__ */
268+
export function definePreviewEffect<
269+
const TData extends object | undefined,
270+
const TSchema extends SchemaTypes,
271+
const TInput extends InferDataFromSchema<TSchema>,
272+
const TReturn extends { disopse: () => unknown },
273+
>(preview: (ctx: RCEContext<TData, TSchema, TInput>) => TReturn): typeof preview {
274+
return preview;
275+
};
276+
277+
/* @__NO_SIDE_EFFECTS__ */
278+
export function defineCancelEvent<
279+
const TData extends object | undefined,
280+
const TSchema extends SchemaTypes,
281+
const TInput extends InferDataFromSchema<TSchema>,
282+
const TEventData extends unknown | undefined,
283+
const TReturn extends RCECancelEvent<TEventData> | null,
284+
>(event: (ctx: RCEContext<TData, TSchema, TInput>) => TReturn): typeof event {
285+
return event;
286+
};
287+
288+
/* @__NO_SIDE_EFFECTS__ */
289+
export function defineCancelEventInitializer<const T extends unknown | undefined>(init: RCECancelEventInitializer<T>): typeof init {
290+
return init;
245291
}
246292

293+
/* @__NO_SIDE_EFFECTS__ */
294+
export function defineEventInfoArray<const T extends unknown | undefined>(eventInfo: [vscode.Event<T>, ((event: T) => boolean | Promise<boolean>) | null]): typeof eventInfo {
295+
return eventInfo;
296+
};
297+
298+
/* @__NO_SIDE_EFFECTS__ */
299+
export function defineEventPredicate<
300+
const T extends unknown | undefined,
301+
const TReturn extends boolean | Promise<boolean>,
302+
>(predicate: (event: T) => TReturn): typeof predicate {
303+
return predicate;
304+
};
305+
306+
/* @__NO_SIDE_EFFECTS__ */
307+
export function definePromptGenerator<
308+
const TData extends object | undefined,
309+
const TSchema extends SchemaTypes,
310+
const TInput extends InferDataFromSchema<TSchema>,
311+
>(generator: (ctx: RCEContext<TData, TSchema, TInput>) => string): typeof generator {
312+
return generator;
313+
};
314+
315+
/* @__NO_SIDE_EFFECTS__ */
316+
export function defineReasonGenerator<
317+
const TEventData extends unknown | undefined,
318+
const TData extends object | undefined,
319+
const TSchema extends SchemaTypes,
320+
const TInput extends InferDataFromSchema<TSchema>,
321+
>(generator: (ctx: RCEContext<TData, TSchema, TInput>, event: TEventData) => string): typeof generator {
322+
return generator;
323+
};
324+
325+
/* @__NO_SIDE_EFFECTS__ */
326+
export function defineSetupHook<
327+
const TData extends object | undefined,
328+
const TSchema extends SchemaTypes,
329+
const TInput extends InferDataFromSchema<TSchema>,
330+
const TReturn extends void | Thenable<void>,
331+
>(hook: (ctx: RCEContext<TData, TSchema, TInput>) => TReturn): typeof hook {
332+
return hook;
333+
};

packages/types/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"module": "preserve",
1212
"moduleResolution": "bundler",
1313
"target": "esnext",
14-
"types": [],
14+
"types": ["node"],
1515
// For nodejs:
1616
// "lib": ["esnext"],
1717
// "types": ["node"],

pnpm-lock.yaml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)