@db-lyon/flowkit 0.17.3 → 0.18.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.
Files changed (59) hide show
  1. package/README.md +53 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/config/index.d.ts +4 -2
  4. package/dist/config/index.d.ts.map +1 -1
  5. package/dist/config/index.js +2 -1
  6. package/dist/config/index.js.map +1 -1
  7. package/dist/config/loader.d.ts +11 -0
  8. package/dist/config/loader.d.ts.map +1 -1
  9. package/dist/config/loader.js +4 -0
  10. package/dist/config/loader.js.map +1 -1
  11. package/dist/config/schema.d.ts +1486 -79
  12. package/dist/config/schema.d.ts.map +1 -1
  13. package/dist/config/schema.js +125 -8
  14. package/dist/config/schema.js.map +1 -1
  15. package/dist/config/strict.d.ts +40 -0
  16. package/dist/config/strict.d.ts.map +1 -0
  17. package/dist/config/strict.js +146 -0
  18. package/dist/config/strict.js.map +1 -0
  19. package/dist/flow/index.d.ts +2 -2
  20. package/dist/flow/index.d.ts.map +1 -1
  21. package/dist/flow/index.js +1 -1
  22. package/dist/flow/index.js.map +1 -1
  23. package/dist/flow/runner.d.ts +279 -6
  24. package/dist/flow/runner.d.ts.map +1 -1
  25. package/dist/flow/runner.js +845 -40
  26. package/dist/flow/runner.js.map +1 -1
  27. package/dist/index.d.ts +13 -5
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +6 -2
  30. package/dist/index.js.map +1 -1
  31. package/dist/task/base-task.d.ts +50 -1
  32. package/dist/task/base-task.d.ts.map +1 -1
  33. package/dist/task/base-task.js +23 -0
  34. package/dist/task/base-task.js.map +1 -1
  35. package/dist/task/composite.d.ts +66 -0
  36. package/dist/task/composite.d.ts.map +1 -0
  37. package/dist/task/composite.js +21 -0
  38. package/dist/task/composite.js.map +1 -0
  39. package/dist/task/index.d.ts +7 -1
  40. package/dist/task/index.d.ts.map +1 -1
  41. package/dist/task/index.js +3 -0
  42. package/dist/task/index.js.map +1 -1
  43. package/dist/task/options-schema.d.ts +51 -0
  44. package/dist/task/options-schema.d.ts.map +1 -0
  45. package/dist/task/options-schema.js +102 -0
  46. package/dist/task/options-schema.js.map +1 -0
  47. package/dist/task/registry.d.ts +38 -0
  48. package/dist/task/registry.d.ts.map +1 -1
  49. package/dist/task/registry.js +42 -0
  50. package/dist/task/registry.js.map +1 -1
  51. package/dist/task/warnings.d.ts +25 -0
  52. package/dist/task/warnings.d.ts.map +1 -0
  53. package/dist/task/warnings.js +30 -0
  54. package/dist/task/warnings.js.map +1 -0
  55. package/docs/api-reference.md +273 -0
  56. package/docs/configuration.md +262 -1
  57. package/docs/custom-tasks.md +155 -0
  58. package/docs/releases.md +47 -0
  59. package/package.json +1 -1
@@ -0,0 +1,51 @@
1
+ import type { OptionSpecs, OutputSpecs } from '../config/schema.js';
2
+ /**
3
+ * Metadata a task class may declare statically, the way a CumulusCI task
4
+ * declares `task_options` on the class. A task definition in config refines it.
5
+ *
6
+ * ```ts
7
+ * class Deploy extends BaseTask<DeployOptions> {
8
+ * static optionsSchema = {
9
+ * environment: { type: 'string', enum: ['staging', 'prod'], required: true },
10
+ * } satisfies OptionSpecs;
11
+ * }
12
+ * ```
13
+ */
14
+ export interface TaskClassMetadata {
15
+ description?: string;
16
+ optionsSchema?: OptionSpecs;
17
+ outputs?: OutputSpecs;
18
+ deprecated?: boolean | string;
19
+ replacedBy?: string;
20
+ }
21
+ /** Read a task class's static metadata. Tolerates any value. */
22
+ export declare function taskClassMetadata(ctor: unknown): TaskClassMetadata;
23
+ /**
24
+ * Layer a definition's option specs over a class's, option by option and field
25
+ * by field: a definition can tighten one constraint, change a default or add an
26
+ * option without restating the rest.
27
+ */
28
+ export declare function mergeOptionSpecs(base: OptionSpecs | undefined, override: OptionSpecs | undefined): OptionSpecs | undefined;
29
+ /** Fill every option the schema gives a `default` for and `options` leaves undefined. */
30
+ export declare function applyOptionDefaults(specs: OptionSpecs | undefined, options: Record<string, unknown>): Record<string, unknown>;
31
+ export interface TaskOptionIssue {
32
+ option: string;
33
+ message: string;
34
+ }
35
+ /** A step's options failed the task's declared `options_schema`. */
36
+ export declare class TaskOptionsError extends Error {
37
+ readonly taskName: string;
38
+ readonly issues: TaskOptionIssue[];
39
+ constructor(taskName: string, issues: TaskOptionIssue[]);
40
+ }
41
+ /**
42
+ * Check `options` against declared specs. Undeclared options are allowed:
43
+ * the schema describes what a task reads, not everything a host may pass.
44
+ */
45
+ export declare function validateTaskOptions(specs: OptionSpecs | undefined, options: Record<string, unknown>): TaskOptionIssue[];
46
+ /**
47
+ * Validate and throw. Returns `options` with schema defaults applied, so a
48
+ * caller can use the result directly.
49
+ */
50
+ export declare function assertTaskOptions(taskName: string, specs: OptionSpecs | undefined, options: Record<string, unknown>): Record<string, unknown>;
51
+ //# sourceMappingURL=options-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options-schema.d.ts","sourceRoot":"","sources":["../../src/task/options-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGhF;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gEAAgE;AAChE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAUlE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,QAAQ,EAAE,WAAW,GAAG,SAAS,GAChC,WAAW,GAAG,SAAS,CAQzB;AAED,yFAAyF;AACzF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,GAAG,SAAS,EAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oEAAoE;AACpE,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC;gBAEvB,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE;CAOxD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,GAAG,SAAS,EAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,eAAe,EAAE,CAenB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,GAAG,SAAS,EAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB"}
@@ -0,0 +1,102 @@
1
+ import { validateJson } from './json-schema.js';
2
+ /** Read a task class's static metadata. Tolerates any value. */
3
+ export function taskClassMetadata(ctor) {
4
+ if (typeof ctor !== 'function')
5
+ return {};
6
+ const c = ctor;
7
+ const out = {};
8
+ if (typeof c.description === 'string')
9
+ out.description = c.description;
10
+ if (isRecord(c.optionsSchema))
11
+ out.optionsSchema = c.optionsSchema;
12
+ if (isRecord(c.outputs))
13
+ out.outputs = c.outputs;
14
+ if (typeof c.deprecated === 'boolean' || typeof c.deprecated === 'string')
15
+ out.deprecated = c.deprecated;
16
+ if (typeof c.replacedBy === 'string')
17
+ out.replacedBy = c.replacedBy;
18
+ return out;
19
+ }
20
+ /**
21
+ * Layer a definition's option specs over a class's, option by option and field
22
+ * by field: a definition can tighten one constraint, change a default or add an
23
+ * option without restating the rest.
24
+ */
25
+ export function mergeOptionSpecs(base, override) {
26
+ if (!base)
27
+ return override;
28
+ if (!override)
29
+ return base;
30
+ const out = { ...base };
31
+ for (const [name, spec] of Object.entries(override)) {
32
+ out[name] = { ...(base[name] ?? {}), ...spec };
33
+ }
34
+ return out;
35
+ }
36
+ /** Fill every option the schema gives a `default` for and `options` leaves undefined. */
37
+ export function applyOptionDefaults(specs, options) {
38
+ if (!specs)
39
+ return options;
40
+ let out = options;
41
+ for (const [name, spec] of Object.entries(specs)) {
42
+ if (spec.default !== undefined && out[name] === undefined) {
43
+ if (out === options)
44
+ out = { ...options };
45
+ out[name] = spec.default;
46
+ }
47
+ }
48
+ return out;
49
+ }
50
+ /** A step's options failed the task's declared `options_schema`. */
51
+ export class TaskOptionsError extends Error {
52
+ taskName;
53
+ issues;
54
+ constructor(taskName, issues) {
55
+ const detail = issues.map((i) => `option "${i.option}" ${i.message}`).join('; ');
56
+ super(`Task "${taskName}": ${detail}`);
57
+ this.name = 'TaskOptionsError';
58
+ this.taskName = taskName;
59
+ this.issues = issues;
60
+ }
61
+ }
62
+ /**
63
+ * Check `options` against declared specs. Undeclared options are allowed:
64
+ * the schema describes what a task reads, not everything a host may pass.
65
+ */
66
+ export function validateTaskOptions(specs, options) {
67
+ if (!specs)
68
+ return [];
69
+ const issues = [];
70
+ for (const [name, spec] of Object.entries(specs)) {
71
+ const value = options[name];
72
+ if (value === undefined) {
73
+ if (spec.required)
74
+ issues.push({ option: name, message: 'is required' });
75
+ continue;
76
+ }
77
+ const result = validateJson(value, toJsonSchema(spec));
78
+ for (const e of result.errors) {
79
+ issues.push({ option: e.path ? `${name}${e.path.replace(/\//g, '.')}` : name, message: e.message });
80
+ }
81
+ }
82
+ return issues;
83
+ }
84
+ /**
85
+ * Validate and throw. Returns `options` with schema defaults applied, so a
86
+ * caller can use the result directly.
87
+ */
88
+ export function assertTaskOptions(taskName, specs, options) {
89
+ const withDefaults = applyOptionDefaults(specs, options);
90
+ const issues = validateTaskOptions(specs, withDefaults);
91
+ if (issues.length > 0)
92
+ throw new TaskOptionsError(taskName, issues);
93
+ return withDefaults;
94
+ }
95
+ function toJsonSchema(spec) {
96
+ const { description: _d, required: _r, default: _def, ...rest } = spec;
97
+ return rest;
98
+ }
99
+ function isRecord(v) {
100
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
101
+ }
102
+ //# sourceMappingURL=options-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options-schema.js","sourceRoot":"","sources":["../../src/task/options-schema.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,34 @@
1
1
  import { type BaseTask, type TaskContext, type TaskContextInput } from './base-task.js';
2
+ import type { TaskDefinition, OptionSpecs, OutputSpecs } from '../config/schema.js';
2
3
  export type TaskConstructor = new (ctx: TaskContext, options: Record<string, unknown>) => BaseTask;
4
+ /**
5
+ * Everything known about one task, for a host's `describe`, `list` or docs.
6
+ * Field names follow the YAML keys so a description can be printed as config.
7
+ */
8
+ export interface TaskDescription {
9
+ /** The name asked about: a configured task name, a registered name or a class path. */
10
+ name: string;
11
+ /** What the name resolves to in the registry. */
12
+ class_path: string;
13
+ /** The definition's description, else the class's static `description`. */
14
+ description?: string;
15
+ group?: string;
16
+ /**
17
+ * Default options a run starts from: schema defaults, then the definition's
18
+ * `options`. Uninterpolated, so `${...}` references show as written.
19
+ */
20
+ options: Record<string, unknown>;
21
+ /** The class's static `optionsSchema` refined by the definition's `options_schema`. */
22
+ options_schema?: OptionSpecs;
23
+ /** The class's static `outputs` refined by the definition's `outputs`. */
24
+ outputs?: OutputSpecs;
25
+ idempotent?: boolean;
26
+ reversible?: boolean;
27
+ /** The definition's `deprecated`, else the class's static one. */
28
+ deprecated?: boolean | string;
29
+ /** The definition's `replaced_by`, else the class's static `replacedBy`. */
30
+ replaced_by?: string;
31
+ }
3
32
  export declare class TaskRegistry {
4
33
  private classPathMap;
5
34
  private nameMap;
@@ -49,6 +78,15 @@ export declare class TaskRegistry {
49
78
  * ```
50
79
  */
51
80
  wrap(name: string, wrapper: (Original: TaskConstructor) => TaskConstructor): this;
81
+ /**
82
+ * Describe a task: resolve its class (loading it if needed) and fold the
83
+ * class's static metadata together with its configured definition.
84
+ *
85
+ * Pass the configured task definitions (`config.tasks`) to include them;
86
+ * without, only the class is described. `FlowRunner.describeTask` passes the
87
+ * runner's own.
88
+ */
89
+ describe(name: string, taskDefinitions?: Record<string, TaskDefinition>): Promise<TaskDescription>;
52
90
  /** Return all registered names and class paths. */
53
91
  listRegistered(): string[];
54
92
  private loadDynamic;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,QAAQ,EAGb,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG,KAC5B,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,QAAQ,CAAC;AAEd,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,YAAY,CAAsC;IAE1D,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKnD,gEAAgE;IAChE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKjE,mCAAmC;IACnC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAO3D,mCAAmC;IACnC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAOlE;;;OAGG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQhE;;;;;;;;OAQG;IACG,MAAM,CACV,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,QAAQ,CAAC;IAKpB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,eAAe,GAAG,IAAI;IAcjF,mDAAmD;IACnD,cAAc,IAAI,MAAM,EAAE;YAQZ,WAAW;IA0CzB,OAAO,CAAC,qBAAqB;CAW9B"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,QAAQ,EAGb,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIpF,MAAM,MAAM,eAAe,GAAG,KAC5B,GAAG,EAAE,WAAW,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,QAAQ,CAAC;AAEd;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,uFAAuF;IACvF,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9B,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,YAAY,CAAsC;IAE1D,uDAAuD;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKnD,gEAAgE;IAChE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI;IAKjE,mCAAmC;IACnC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAO3D,mCAAmC;IACnC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAOlE;;;OAGG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQhE;;;;;;;;OAQG;IACG,MAAM,CACV,eAAe,EAAE,MAAM,EACvB,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,QAAQ,CAAC;IAKpB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,eAAe,KAAK,eAAe,GAAG,IAAI;IAcjF;;;;;;;OAOG;IACG,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAC/C,OAAO,CAAC,eAAe,CAAC;IA0B3B,mDAAmD;IACnD,cAAc,IAAI,MAAM,EAAE;YAQZ,WAAW;IA0CzB,OAAO,CAAC,qBAAqB;CAW9B"}
@@ -1,6 +1,8 @@
1
1
  import * as path from 'node:path';
2
2
  import * as fs from 'node:fs';
3
3
  import { extendsBaseTask, resolveTaskContext, } from './base-task.js';
4
+ import { resolveTaskDefinition } from './task-resolution.js';
5
+ import { applyOptionDefaults, mergeOptionSpecs, taskClassMetadata } from './options-schema.js';
4
6
  export class TaskRegistry {
5
7
  classPathMap = new Map();
6
8
  nameMap = new Map();
@@ -84,6 +86,46 @@ export class TaskRegistry {
84
86
  this.nameMap.set(name, wrapped);
85
87
  return this;
86
88
  }
89
+ /**
90
+ * Describe a task: resolve its class (loading it if needed) and fold the
91
+ * class's static metadata together with its configured definition.
92
+ *
93
+ * Pass the configured task definitions (`config.tasks`) to include them;
94
+ * without, only the class is described. `FlowRunner.describeTask` passes the
95
+ * runner's own.
96
+ */
97
+ async describe(name, taskDefinitions) {
98
+ const def = taskDefinitions?.[name];
99
+ const { classPath, options } = resolveTaskDefinition(name, taskDefinitions);
100
+ const meta = taskClassMetadata(await this.resolve(classPath));
101
+ const optionsSchema = mergeOptionSpecs(meta.optionsSchema, def?.options_schema);
102
+ const outputs = meta.outputs || def?.outputs ? { ...(meta.outputs ?? {}), ...(def?.outputs ?? {}) } : undefined;
103
+ const out = {
104
+ name,
105
+ class_path: classPath,
106
+ options: applyOptionDefaults(optionsSchema, { ...options }),
107
+ };
108
+ const description = def?.description ?? meta.description;
109
+ if (description !== undefined)
110
+ out.description = description;
111
+ if (def?.group !== undefined)
112
+ out.group = def.group;
113
+ if (optionsSchema)
114
+ out.options_schema = optionsSchema;
115
+ if (outputs)
116
+ out.outputs = outputs;
117
+ if (def?.idempotent !== undefined)
118
+ out.idempotent = def.idempotent;
119
+ if (def?.reversible !== undefined)
120
+ out.reversible = def.reversible;
121
+ const deprecated = def?.deprecated ?? meta.deprecated;
122
+ if (deprecated)
123
+ out.deprecated = deprecated;
124
+ const replacedBy = def?.replaced_by ?? meta.replacedBy;
125
+ if (replacedBy !== undefined)
126
+ out.replaced_by = replacedBy;
127
+ return out;
128
+ }
87
129
  /** Return all registered names and class paths. */
88
130
  listRegistered() {
89
131
  return [...new Set([...this.nameMap.keys(), ...this.classPathMap.keys()])];
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/task/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Structured, non-fatal notices a run or a plan reports alongside its verdict.
3
+ *
4
+ * `deprecated`: a task or flow marked `deprecated:` (in config or on the task
5
+ * class) was run or planned. `check`: a declared check with `action: warn`
6
+ * fired. Hosts surface these to the caller; nothing in the runner acts on them.
7
+ */
8
+ export interface RunWarning {
9
+ code: 'deprecated' | 'check';
10
+ message: string;
11
+ /** The task or flow the warning is about. */
12
+ name: string;
13
+ kind?: 'task' | 'flow';
14
+ /** For `deprecated`: the declared replacement, when there is one. */
15
+ replacedBy?: string;
16
+ /** For `check`: the step the check belongs to; absent for a flow-level check. */
17
+ stepNumber?: number;
18
+ }
19
+ /** Deprecation as declared: `true`, or a string saying why or what to do. */
20
+ export type Deprecation = boolean | string;
21
+ /** Build the warning for a deprecated task or flow, or `undefined` when it is not deprecated. */
22
+ export declare function deprecationWarning(kind: 'task' | 'flow', name: string, deprecated: Deprecation | undefined, replacedBy: string | undefined): RunWarning | undefined;
23
+ /** Concatenate warning lists, dropping repeats of the same notice about the same target. */
24
+ export declare function mergeWarnings(...lists: (RunWarning[] | undefined)[]): RunWarning[];
25
+ //# sourceMappingURL=warnings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warnings.d.ts","sourceRoot":"","sources":["../../src/task/warnings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3C,iGAAiG;AACjG,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,UAAU,GAAG,SAAS,CAQxB;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,GAAG,KAAK,EAAE,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,UAAU,EAAE,CAYlF"}
@@ -0,0 +1,30 @@
1
+ /** Build the warning for a deprecated task or flow, or `undefined` when it is not deprecated. */
2
+ export function deprecationWarning(kind, name, deprecated, replacedBy) {
3
+ if (!deprecated)
4
+ return undefined;
5
+ let message = `${kind === 'task' ? 'Task' : 'Flow'} "${name}" is deprecated`;
6
+ if (typeof deprecated === 'string' && deprecated.trim())
7
+ message += `: ${deprecated.trim()}`;
8
+ if (replacedBy)
9
+ message += `${/[.!?]$/.test(message) ? '' : '.'} Use "${replacedBy}" instead.`;
10
+ const w = { code: 'deprecated', kind, name, message };
11
+ if (replacedBy)
12
+ w.replacedBy = replacedBy;
13
+ return w;
14
+ }
15
+ /** Concatenate warning lists, dropping repeats of the same notice about the same target. */
16
+ export function mergeWarnings(...lists) {
17
+ const out = [];
18
+ const seen = new Set();
19
+ for (const list of lists) {
20
+ for (const w of list ?? []) {
21
+ const key = `${w.code}\u0000${w.kind ?? ''}\u0000${w.name}\u0000${w.stepNumber ?? ''}\u0000${w.message}`;
22
+ if (seen.has(key))
23
+ continue;
24
+ seen.add(key);
25
+ out.push(w);
26
+ }
27
+ }
28
+ return out;
29
+ }
30
+ //# sourceMappingURL=warnings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warnings.js","sourceRoot":"","sources":["../../src/task/warnings.ts"],"names":[],"mappings":"AAsBA,iGAAiG;AACjG,MAAM,UAAU,kBAAkB,CAChC,IAAqB,EACrB,IAAY,EACZ,UAAmC,EACnC,UAA8B;IAE9B,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,OAAO,GAAG,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,iBAAiB,CAAC;IAC7E,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,EAAE;QAAE,OAAO,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7F,IAAI,UAAU;QAAE,OAAO,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,UAAU,YAAY,CAAC;IAC/F,MAAM,CAAC,GAAe,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAClE,IAAI,UAAU;QAAE,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC;IAC1C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,aAAa,CAAC,GAAG,KAAmC;IAClE,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,UAAU,IAAI,EAAE,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YACzG,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}