@smthrs/triggers 0.0.0-stage → 1.0.0-rc.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/CHANGELOG.md +219 -0
- package/LICENSE +21 -0
- package/README.md +109 -2
- package/dist/cjs/CatchUp.d.ts +25 -0
- package/dist/cjs/CatchUp.d.ts.map +1 -0
- package/dist/cjs/CatchUp.js +72 -0
- package/dist/cjs/CatchUp.js.map +7 -0
- package/dist/cjs/Channel.d.ts +108 -0
- package/dist/cjs/Channel.d.ts.map +1 -0
- package/dist/cjs/Channel.js +25 -0
- package/dist/cjs/Channel.js.map +7 -0
- package/dist/cjs/ClaimDecision.d.ts +183 -0
- package/dist/cjs/ClaimDecision.d.ts.map +1 -0
- package/dist/cjs/ClaimDecision.js +144 -0
- package/dist/cjs/ClaimDecision.js.map +7 -0
- package/dist/cjs/Cron.d.ts +91 -0
- package/dist/cjs/Cron.d.ts.map +1 -0
- package/dist/cjs/Cron.js +108 -0
- package/dist/cjs/Cron.js.map +7 -0
- package/dist/cjs/DispatchReader.d.ts +77 -0
- package/dist/cjs/DispatchReader.d.ts.map +1 -0
- package/dist/cjs/DispatchReader.js +121 -0
- package/dist/cjs/DispatchReader.js.map +7 -0
- package/dist/cjs/Overlap.d.ts +40 -0
- package/dist/cjs/Overlap.d.ts.map +1 -0
- package/dist/cjs/Overlap.js +37 -0
- package/dist/cjs/Overlap.js.map +7 -0
- package/dist/cjs/Schedule.d.ts +96 -0
- package/dist/cjs/Schedule.d.ts.map +1 -0
- package/dist/cjs/Schedule.js +61 -0
- package/dist/cjs/Schedule.js.map +7 -0
- package/dist/cjs/Scheduler.d.ts +248 -0
- package/dist/cjs/Scheduler.d.ts.map +1 -0
- package/dist/cjs/Scheduler.js +647 -0
- package/dist/cjs/Scheduler.js.map +7 -0
- package/dist/cjs/SqlTriggerStore.d.ts +29 -0
- package/dist/cjs/SqlTriggerStore.d.ts.map +1 -0
- package/dist/cjs/SqlTriggerStore.js +483 -0
- package/dist/cjs/SqlTriggerStore.js.map +7 -0
- package/dist/cjs/Trigger.d.ts +81 -0
- package/dist/cjs/Trigger.d.ts.map +1 -0
- package/dist/cjs/Trigger.js +54 -0
- package/dist/cjs/Trigger.js.map +7 -0
- package/dist/cjs/TriggerError.d.ts +58 -0
- package/dist/cjs/TriggerError.d.ts.map +1 -0
- package/dist/cjs/TriggerError.js +83 -0
- package/dist/cjs/TriggerError.js.map +7 -0
- package/dist/cjs/TriggerStore.d.ts +411 -0
- package/dist/cjs/TriggerStore.d.ts.map +1 -0
- package/dist/cjs/TriggerStore.js +127 -0
- package/dist/cjs/TriggerStore.js.map +7 -0
- package/dist/cjs/Webhook.d.ts +118 -0
- package/dist/cjs/Webhook.d.ts.map +1 -0
- package/dist/cjs/Webhook.js +153 -0
- package/dist/cjs/Webhook.js.map +7 -0
- package/dist/cjs/index.d.ts +30 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +57 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/internal/ActiveRuns.d.ts +51 -0
- package/dist/cjs/internal/ActiveRuns.d.ts.map +1 -0
- package/dist/cjs/internal/ActiveRuns.js +56 -0
- package/dist/cjs/internal/ActiveRuns.js.map +7 -0
- package/dist/cjs/internal/DueOccurrences.d.ts +32 -0
- package/dist/cjs/internal/DueOccurrences.d.ts.map +1 -0
- package/dist/cjs/internal/DueOccurrences.js +80 -0
- package/dist/cjs/internal/DueOccurrences.js.map +7 -0
- package/dist/cjs/internal/WallClock.d.ts +59 -0
- package/dist/cjs/internal/WallClock.d.ts.map +1 -0
- package/dist/cjs/internal/WallClock.js +132 -0
- package/dist/cjs/internal/WallClock.js.map +7 -0
- package/dist/cjs/migrations/0001_triggers.d.ts +15 -0
- package/dist/cjs/migrations/0001_triggers.d.ts.map +1 -0
- package/dist/cjs/migrations/0001_triggers.js +64 -0
- package/dist/cjs/migrations/0001_triggers.js.map +7 -0
- package/dist/cjs/migrations/0002_reservation_lease.d.ts +15 -0
- package/dist/cjs/migrations/0002_reservation_lease.d.ts.map +1 -0
- package/dist/cjs/migrations/0002_reservation_lease.js +41 -0
- package/dist/cjs/migrations/0002_reservation_lease.js.map +7 -0
- package/dist/cjs/migrations/0003_heartbeat.d.ts +16 -0
- package/dist/cjs/migrations/0003_heartbeat.d.ts.map +1 -0
- package/dist/cjs/migrations/0003_heartbeat.js +44 -0
- package/dist/cjs/migrations/0003_heartbeat.js.map +7 -0
- package/dist/cjs/migrations/0004_fire_run_index.d.ts +17 -0
- package/dist/cjs/migrations/0004_fire_run_index.d.ts.map +1 -0
- package/dist/cjs/migrations/0004_fire_run_index.js +40 -0
- package/dist/cjs/migrations/0004_fire_run_index.js.map +7 -0
- package/dist/cjs/migrations/index.d.ts +33 -0
- package/dist/cjs/migrations/index.d.ts.map +1 -0
- package/dist/cjs/migrations/index.js +50 -0
- package/dist/cjs/migrations/index.js.map +7 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/test/TestTriggers.d.ts +12 -0
- package/dist/cjs/test/TestTriggers.d.ts.map +1 -0
- package/dist/cjs/test/TestTriggers.js +421 -0
- package/dist/cjs/test/TestTriggers.js.map +7 -0
- package/dist/esm/CatchUp.d.ts +25 -0
- package/dist/esm/CatchUp.d.ts.map +1 -0
- package/dist/esm/CatchUp.js +52 -0
- package/dist/esm/CatchUp.js.map +1 -0
- package/dist/esm/Channel.d.ts +108 -0
- package/dist/esm/Channel.d.ts.map +1 -0
- package/dist/esm/Channel.js +19 -0
- package/dist/esm/Channel.js.map +1 -0
- package/dist/esm/ClaimDecision.d.ts +183 -0
- package/dist/esm/ClaimDecision.d.ts.map +1 -0
- package/dist/esm/ClaimDecision.js +172 -0
- package/dist/esm/ClaimDecision.js.map +1 -0
- package/dist/esm/Cron.d.ts +91 -0
- package/dist/esm/Cron.d.ts.map +1 -0
- package/dist/esm/Cron.js +132 -0
- package/dist/esm/Cron.js.map +1 -0
- package/dist/esm/DispatchReader.d.ts +77 -0
- package/dist/esm/DispatchReader.d.ts.map +1 -0
- package/dist/esm/DispatchReader.js +152 -0
- package/dist/esm/DispatchReader.js.map +1 -0
- package/dist/esm/Overlap.d.ts +40 -0
- package/dist/esm/Overlap.d.ts.map +1 -0
- package/dist/esm/Overlap.js +31 -0
- package/dist/esm/Overlap.js.map +1 -0
- package/dist/esm/Schedule.d.ts +96 -0
- package/dist/esm/Schedule.d.ts.map +1 -0
- package/dist/esm/Schedule.js +73 -0
- package/dist/esm/Schedule.js.map +1 -0
- package/dist/esm/Scheduler.d.ts +248 -0
- package/dist/esm/Scheduler.d.ts.map +1 -0
- package/dist/esm/Scheduler.js +734 -0
- package/dist/esm/Scheduler.js.map +1 -0
- package/dist/esm/SqlTriggerStore.d.ts +29 -0
- package/dist/esm/SqlTriggerStore.d.ts.map +1 -0
- package/dist/esm/SqlTriggerStore.js +483 -0
- package/dist/esm/SqlTriggerStore.js.map +1 -0
- package/dist/esm/Trigger.d.ts +81 -0
- package/dist/esm/Trigger.d.ts.map +1 -0
- package/dist/esm/Trigger.js +56 -0
- package/dist/esm/Trigger.js.map +1 -0
- package/dist/esm/TriggerError.d.ts +58 -0
- package/dist/esm/TriggerError.d.ts.map +1 -0
- package/dist/esm/TriggerError.js +110 -0
- package/dist/esm/TriggerError.js.map +1 -0
- package/dist/esm/TriggerStore.d.ts +411 -0
- package/dist/esm/TriggerStore.d.ts.map +1 -0
- package/dist/esm/TriggerStore.js +209 -0
- package/dist/esm/TriggerStore.js.map +1 -0
- package/dist/esm/Webhook.d.ts +118 -0
- package/dist/esm/Webhook.d.ts.map +1 -0
- package/dist/esm/Webhook.js +186 -0
- package/dist/esm/Webhook.js.map +1 -0
- package/dist/esm/index.d.ts +30 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +30 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/internal/ActiveRuns.d.ts +51 -0
- package/dist/esm/internal/ActiveRuns.d.ts.map +1 -0
- package/dist/esm/internal/ActiveRuns.js +34 -0
- package/dist/esm/internal/ActiveRuns.js.map +1 -0
- package/dist/esm/internal/DueOccurrences.d.ts +32 -0
- package/dist/esm/internal/DueOccurrences.d.ts.map +1 -0
- package/dist/esm/internal/DueOccurrences.js +55 -0
- package/dist/esm/internal/DueOccurrences.js.map +1 -0
- package/dist/esm/internal/WallClock.d.ts +59 -0
- package/dist/esm/internal/WallClock.d.ts.map +1 -0
- package/dist/esm/internal/WallClock.js +155 -0
- package/dist/esm/internal/WallClock.js.map +1 -0
- package/dist/esm/migrations/0001_triggers.d.ts +15 -0
- package/dist/esm/migrations/0001_triggers.d.ts.map +1 -0
- package/dist/esm/migrations/0001_triggers.js +42 -0
- package/dist/esm/migrations/0001_triggers.js.map +1 -0
- package/dist/esm/migrations/0002_reservation_lease.d.ts +15 -0
- package/dist/esm/migrations/0002_reservation_lease.d.ts.map +1 -0
- package/dist/esm/migrations/0002_reservation_lease.js +19 -0
- package/dist/esm/migrations/0002_reservation_lease.js.map +1 -0
- package/dist/esm/migrations/0003_heartbeat.d.ts +16 -0
- package/dist/esm/migrations/0003_heartbeat.d.ts.map +1 -0
- package/dist/esm/migrations/0003_heartbeat.js +23 -0
- package/dist/esm/migrations/0003_heartbeat.js.map +1 -0
- package/dist/esm/migrations/0004_fire_run_index.d.ts +17 -0
- package/dist/esm/migrations/0004_fire_run_index.d.ts.map +1 -0
- package/dist/esm/migrations/0004_fire_run_index.js +20 -0
- package/dist/esm/migrations/0004_fire_run_index.js.map +1 -0
- package/dist/esm/migrations/index.d.ts +33 -0
- package/dist/esm/migrations/index.d.ts.map +1 -0
- package/dist/esm/migrations/index.js +37 -0
- package/dist/esm/migrations/index.js.map +1 -0
- package/dist/esm/test/TestTriggers.d.ts +12 -0
- package/dist/esm/test/TestTriggers.d.ts.map +1 -0
- package/dist/esm/test/TestTriggers.js +439 -0
- package/dist/esm/test/TestTriggers.js.map +1 -0
- package/docs/README.md +140 -0
- package/docs/api.md +1186 -0
- package/docs/concepts/channels.md +103 -0
- package/docs/concepts/claim-protocol.md +229 -0
- package/docs/concepts/policies.md +124 -0
- package/docs/concepts/schedules.md +134 -0
- package/docs/guides/choose-a-policy.md +113 -0
- package/docs/guides/declare-a-trigger.md +136 -0
- package/docs/guides/ingest-a-webhook.md +164 -0
- package/docs/guides/run-the-scheduler.md +173 -0
- package/docs/guides/testing.md +157 -0
- package/docs/installation.md +81 -0
- package/docs/quickstart.md +163 -0
- package/docs/troubleshooting.md +281 -0
- package/package.json +241 -3
- package/src/CatchUp.ts +73 -0
- package/src/Channel.ts +121 -0
- package/src/ClaimDecision.ts +303 -0
- package/src/Cron.ts +173 -0
- package/src/DispatchReader.ts +179 -0
- package/src/Overlap.ts +53 -0
- package/src/Schedule.ts +112 -0
- package/src/Scheduler.ts +1154 -0
- package/src/SqlTriggerStore.ts +638 -0
- package/src/Trigger.ts +84 -0
- package/src/TriggerError.ts +129 -0
- package/src/TriggerStore.ts +514 -0
- package/src/Webhook.ts +270 -0
- package/src/index.ts +30 -0
- package/src/internal/ActiveRuns.ts +83 -0
- package/src/internal/DueOccurrences.ts +101 -0
- package/src/internal/WallClock.ts +172 -0
- package/src/migrations/0001_triggers.ts +43 -0
- package/src/migrations/0002_reservation_lease.ts +20 -0
- package/src/migrations/0003_heartbeat.ts +24 -0
- package/src/migrations/0004_fire_run_index.ts +21 -0
- package/src/migrations/index.ts +40 -0
- package/src/test/TestTriggers.ts +563 -0
package/src/Trigger.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable trigger declarations.
|
|
3
|
+
*
|
|
4
|
+
* @see packages/smithers/agent/triggers/docs/api.md
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import * as Effect from "effect/Effect"
|
|
10
|
+
import * as Schema from "effect/Schema"
|
|
11
|
+
import * as Schedule from "./Schedule.ts"
|
|
12
|
+
import { fromSchemaError, type TriggerError } from "./TriggerError.ts"
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* How a trigger behaves when an occurrence arrives while its previous run
|
|
16
|
+
* is still going.
|
|
17
|
+
*
|
|
18
|
+
* @category schemas
|
|
19
|
+
* @since 0.1.0
|
|
20
|
+
*/
|
|
21
|
+
export const Overlap = Schedule.Overlap
|
|
22
|
+
/**
|
|
23
|
+
* The decoded form of {@link Overlap}.
|
|
24
|
+
*
|
|
25
|
+
* @category models
|
|
26
|
+
* @since 0.1.0
|
|
27
|
+
*/
|
|
28
|
+
export type Overlap = Schedule.Overlap
|
|
29
|
+
/**
|
|
30
|
+
* How many missed occurrences a trigger owes after downtime.
|
|
31
|
+
*
|
|
32
|
+
* @category schemas
|
|
33
|
+
* @since 0.1.0
|
|
34
|
+
*/
|
|
35
|
+
export const CatchUp = Schedule.CatchUp
|
|
36
|
+
/**
|
|
37
|
+
* The decoded form of {@link CatchUp}.
|
|
38
|
+
*
|
|
39
|
+
* @category models
|
|
40
|
+
* @since 0.1.0
|
|
41
|
+
*/
|
|
42
|
+
export type CatchUp = Schedule.CatchUp
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* A trigger declaration: which flow to run, with what input, on what
|
|
46
|
+
* schedule.
|
|
47
|
+
*
|
|
48
|
+
* `input` is JSON rather than `unknown` because the store persists it with
|
|
49
|
+
* `JSON.stringify` into a `NOT NULL` column. The schema refuses `undefined`,
|
|
50
|
+
* `NaN`, a `Date`, and functions at the declaration boundary.
|
|
51
|
+
* Enumerable getters are accepted when their values are JSON. They are
|
|
52
|
+
* evaluated during decoding and again during SQL serialization. Every store
|
|
53
|
+
* takes an eager serialized snapshot before returning its Effect; use plain
|
|
54
|
+
* JSON values for stable input across reads.
|
|
55
|
+
*
|
|
56
|
+
* @category schemas
|
|
57
|
+
* @since 0.1.0
|
|
58
|
+
*/
|
|
59
|
+
export const Trigger = Schema.Struct({
|
|
60
|
+
id: Schema.NonEmptyString,
|
|
61
|
+
flowId: Schema.NonEmptyString,
|
|
62
|
+
input: Schema.Json,
|
|
63
|
+
...Schedule.Schedule.fields,
|
|
64
|
+
enabled: Schema.Boolean
|
|
65
|
+
})
|
|
66
|
+
/**
|
|
67
|
+
* The decoded form of {@link Trigger}.
|
|
68
|
+
*
|
|
69
|
+
* @category models
|
|
70
|
+
* @since 0.1.0
|
|
71
|
+
*/
|
|
72
|
+
export type Trigger = typeof Trigger.Type
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Decodes and validates a trigger declaration.
|
|
76
|
+
*
|
|
77
|
+
* @category constructors
|
|
78
|
+
* @since 0.1.0
|
|
79
|
+
*/
|
|
80
|
+
export const make = (input: unknown): Effect.Effect<Trigger, TriggerError> =>
|
|
81
|
+
Schema.decodeUnknownEffect(Trigger)(input).pipe(
|
|
82
|
+
Effect.mapError((cause) => fromSchemaError("invalid_trigger", "Trigger declaration is invalid", cause)),
|
|
83
|
+
Effect.flatMap(Schedule.validate)
|
|
84
|
+
)
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stable trigger failures.
|
|
3
|
+
*
|
|
4
|
+
* @see packages/smithers/agent/triggers/docs/api.md
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import * as Schema from "effect/Schema"
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Stable trigger failure codes.
|
|
13
|
+
*
|
|
14
|
+
* Each code names one refusal a caller can branch on. `store` covers only a
|
|
15
|
+
* persistence failure the store itself raised; a Control or runner failure is
|
|
16
|
+
* `runner`, a malformed scheduler option is `invalid_options`, and a claim
|
|
17
|
+
* refused by the durable declaration is `unknown_trigger`, `trigger_disabled`,
|
|
18
|
+
* or `revision_mismatch`.
|
|
19
|
+
*
|
|
20
|
+
* @category models
|
|
21
|
+
* @since 0.1.0
|
|
22
|
+
*/
|
|
23
|
+
export const TriggerErrorCode = Schema.Literals([
|
|
24
|
+
"unknown_trigger",
|
|
25
|
+
"trigger_disabled",
|
|
26
|
+
"revision_mismatch",
|
|
27
|
+
"stale_owner",
|
|
28
|
+
"invalid_schedule",
|
|
29
|
+
"invalid_trigger",
|
|
30
|
+
"invalid_options",
|
|
31
|
+
"invalid_cron",
|
|
32
|
+
"unsatisfiable_cron",
|
|
33
|
+
"verification_failed",
|
|
34
|
+
"catch_up_bound_exceeded",
|
|
35
|
+
"runner",
|
|
36
|
+
"runner_timeout",
|
|
37
|
+
"store"
|
|
38
|
+
])
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Stable trigger failure code.
|
|
42
|
+
*
|
|
43
|
+
* @category models
|
|
44
|
+
* @since 0.1.0
|
|
45
|
+
*/
|
|
46
|
+
export type TriggerErrorCode = typeof TriggerErrorCode.Type
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* A typed schedule, verification, or persistence failure.
|
|
50
|
+
*
|
|
51
|
+
* `path` is the dotted field path a declaration failure belongs to, so a
|
|
52
|
+
* caller reads the offending field structurally instead of parsing `message`.
|
|
53
|
+
*
|
|
54
|
+
* @category errors
|
|
55
|
+
* @since 0.1.0
|
|
56
|
+
*/
|
|
57
|
+
export class TriggerError extends Schema.TaggedError<TriggerError>()("flows/triggers/TriggerError", {
|
|
58
|
+
code: TriggerErrorCode,
|
|
59
|
+
message: Schema.String,
|
|
60
|
+
path: Schema.optional(Schema.String),
|
|
61
|
+
cause: Schema.optional(Schema.Defect())
|
|
62
|
+
}) {}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Walks a schema issue tree for the path of the first offending value.
|
|
66
|
+
*
|
|
67
|
+
* The tree is read defensively: only `path`, `issue`, and `issues` are
|
|
68
|
+
* consulted, so an issue shape this function does not recognize degrades to
|
|
69
|
+
* "no path" rather than throwing inside an error constructor.
|
|
70
|
+
*/
|
|
71
|
+
const issuePath = (issue: unknown): ReadonlyArray<string> | undefined => {
|
|
72
|
+
if (typeof issue !== "object" || issue === null) return undefined
|
|
73
|
+
const node = issue as {
|
|
74
|
+
readonly path?: unknown
|
|
75
|
+
readonly issue?: unknown
|
|
76
|
+
readonly issues?: unknown
|
|
77
|
+
}
|
|
78
|
+
const segments = Array.isArray(node.path) ? node.path.map((segment) => String(segment)) : []
|
|
79
|
+
const children = Array.isArray(node.issues)
|
|
80
|
+
? node.issues
|
|
81
|
+
: node.issue === undefined
|
|
82
|
+
? []
|
|
83
|
+
: [node.issue]
|
|
84
|
+
for (const child of children) {
|
|
85
|
+
const nested = issuePath(child)
|
|
86
|
+
if (nested !== undefined) return [...segments, ...nested]
|
|
87
|
+
}
|
|
88
|
+
return segments.length === 0 ? undefined : segments
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Renders a schema decode failure as one line, without the offending value.
|
|
93
|
+
*
|
|
94
|
+
* The rendered issue tree names the expectation and the path only, which is
|
|
95
|
+
* what makes it safe to keep in `message` and in `cause`: a secret submitted
|
|
96
|
+
* in the declaration never reaches either.
|
|
97
|
+
*/
|
|
98
|
+
const summarize = (error: unknown): string =>
|
|
99
|
+
String(error)
|
|
100
|
+
.replace(/^SchemaError\(/, "")
|
|
101
|
+
.replace(/\)$/, "")
|
|
102
|
+
.replace(/\s*\n\s*/g, " ")
|
|
103
|
+
.trim()
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Builds a declaration failure that names the offending field.
|
|
107
|
+
*
|
|
108
|
+
* The whole `SchemaError` is deliberately not kept as the cause: serializing
|
|
109
|
+
* one costs about five kilobytes of schema AST per failure, and every byte of
|
|
110
|
+
* it past the rendered issue tree repeats what the tree already says.
|
|
111
|
+
*
|
|
112
|
+
* @category constructors
|
|
113
|
+
* @since 0.1.0
|
|
114
|
+
*/
|
|
115
|
+
export const fromSchemaError = (
|
|
116
|
+
code: TriggerErrorCode,
|
|
117
|
+
summary: string,
|
|
118
|
+
error: unknown
|
|
119
|
+
): TriggerError => {
|
|
120
|
+
const path = issuePath((error as { readonly issue?: unknown } | null)?.issue)
|
|
121
|
+
const detail = summarize(error)
|
|
122
|
+
const field = path === undefined ? undefined : path.join(".")
|
|
123
|
+
return new TriggerError({
|
|
124
|
+
code,
|
|
125
|
+
message: field === undefined ? `${summary}: ${detail}` : `${summary} at ${field}: ${detail}`,
|
|
126
|
+
...(field === undefined ? {} : { path: field }),
|
|
127
|
+
cause: detail
|
|
128
|
+
})
|
|
129
|
+
}
|