@smthrs/plugin 1.0.0-rc.8 → 1.0.0-rc.9
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/cjs/Plugins.d.ts.map +1 -1
- package/dist/cjs/Plugins.js +17 -8
- package/dist/cjs/Plugins.js.map +2 -2
- package/dist/cjs/Resolve.d.ts.map +1 -1
- package/dist/cjs/Resolve.js +11 -9
- package/dist/cjs/Resolve.js.map +2 -2
- package/dist/esm/Plugins.d.ts.map +1 -1
- package/dist/esm/Plugins.js +21 -9
- package/dist/esm/Plugins.js.map +1 -1
- package/dist/esm/Resolve.d.ts.map +1 -1
- package/dist/esm/Resolve.js +11 -10
- package/dist/esm/Resolve.js.map +1 -1
- package/docs/api.md +6 -4
- package/docs/troubleshooting.md +2 -1
- package/package.json +4 -4
- package/src/Plugins.ts +25 -8
- package/src/Resolve.ts +12 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plugins.d.ts","sourceRoot":"","sources":["../../src/Plugins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAY,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAA8B,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"Plugins.d.ts","sourceRoot":"","sources":["../../src/Plugins.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/Plugins.js
CHANGED
|
@@ -44,8 +44,15 @@ var import_Hooks = require("./Hooks.js");
|
|
|
44
44
|
var import_PluginError = require("./PluginError.js");
|
|
45
45
|
var import_Resolve = require("./Resolve.js");
|
|
46
46
|
const empty = Object.freeze([]);
|
|
47
|
-
const kindMismatch = (resolved, hook, kind) => {
|
|
48
|
-
if (!Object.hasOwn(resolved.kinds, hook))
|
|
47
|
+
const kindMismatch = (resolved, hook, kind, handlers) => {
|
|
48
|
+
if (!Object.hasOwn(resolved.kinds, hook)) {
|
|
49
|
+
if (handlers.length === 0) return void 0;
|
|
50
|
+
return new import_PluginError.PluginError({
|
|
51
|
+
code: "hook_kind_mismatch",
|
|
52
|
+
message: `hook "${hook}" has handlers but is not declared in the runtime catalog`,
|
|
53
|
+
hook
|
|
54
|
+
});
|
|
55
|
+
}
|
|
49
56
|
const declared = resolved.kinds[hook];
|
|
50
57
|
if (declared === kind) return void 0;
|
|
51
58
|
return new import_PluginError.PluginError({
|
|
@@ -81,7 +88,7 @@ const runHandler = (record, args) => {
|
|
|
81
88
|
const make = (resolved) => {
|
|
82
89
|
const handlers = (hook) => resolved.handlers.get(hook) ?? empty;
|
|
83
90
|
const sequential = ((hook, ...args) => Effect.gen(function* () {
|
|
84
|
-
const mismatch = kindMismatch(resolved, hook, "sequential");
|
|
91
|
+
const mismatch = kindMismatch(resolved, hook, "sequential", handlers(hook));
|
|
85
92
|
if (mismatch !== void 0) return yield* Effect.fail(mismatch);
|
|
86
93
|
const results = [];
|
|
87
94
|
for (const record of handlers(hook)) {
|
|
@@ -90,7 +97,7 @@ const make = (resolved) => {
|
|
|
90
97
|
return results;
|
|
91
98
|
}));
|
|
92
99
|
const parallel = ((hook, ...args) => {
|
|
93
|
-
const mismatch = kindMismatch(resolved, hook, "parallel");
|
|
100
|
+
const mismatch = kindMismatch(resolved, hook, "parallel", handlers(hook));
|
|
94
101
|
if (mismatch !== void 0) return Effect.succeed([mismatch]);
|
|
95
102
|
return Effect.forEach(
|
|
96
103
|
handlers(hook),
|
|
@@ -101,7 +108,7 @@ const make = (resolved) => {
|
|
|
101
108
|
).pipe(Effect.map((chunks) => chunks.flat()));
|
|
102
109
|
});
|
|
103
110
|
const first = ((hook, ...args) => Effect.gen(function* () {
|
|
104
|
-
const mismatch = kindMismatch(resolved, hook, "first");
|
|
111
|
+
const mismatch = kindMismatch(resolved, hook, "first", handlers(hook));
|
|
105
112
|
if (mismatch !== void 0) return yield* Effect.fail(mismatch);
|
|
106
113
|
for (const record of handlers(hook)) {
|
|
107
114
|
const result = yield* runHandler(record, args);
|
|
@@ -120,7 +127,7 @@ const make = (resolved) => {
|
|
|
120
127
|
return Option.none();
|
|
121
128
|
}));
|
|
122
129
|
const waterfall = ((hook, initial, merge) => Effect.gen(function* () {
|
|
123
|
-
const mismatch = kindMismatch(resolved, hook, "waterfall");
|
|
130
|
+
const mismatch = kindMismatch(resolved, hook, "waterfall", handlers(hook));
|
|
124
131
|
if (mismatch !== void 0) return yield* Effect.fail(mismatch);
|
|
125
132
|
let value = initial;
|
|
126
133
|
for (const record of handlers(hook)) {
|
|
@@ -133,12 +140,14 @@ const make = (resolved) => {
|
|
|
133
140
|
message: cause.message,
|
|
134
141
|
plugin: record.plugin,
|
|
135
142
|
hook: record.hook,
|
|
136
|
-
path: cause.path
|
|
143
|
+
path: cause.path,
|
|
144
|
+
cause
|
|
137
145
|
}) : new import_PluginError.PluginError({
|
|
138
146
|
code: "config_invalid",
|
|
139
147
|
message: `waterfall hook "${record.hook}" in plugin "${record.plugin}" returned an invalid patch`,
|
|
140
148
|
plugin: record.plugin,
|
|
141
|
-
hook: record.hook
|
|
149
|
+
hook: record.hook,
|
|
150
|
+
cause
|
|
142
151
|
})
|
|
143
152
|
});
|
|
144
153
|
}
|
package/dist/cjs/Plugins.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/Plugins.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * The dispatcher: a plain service over a resolved plugin list, generic over the\n * hook interface.\n *\n * The public package contract is documented at\n * {@link https://smithers.sh/docs/reference/api/plugin}. Each host holds an instance over its\n * augmented `FlowsHooks` and may dispatch only the runtime catalog it supplied.\n * The shipped cell host owns the three\n * waterfalls declared in `packages/smithers/agent/src/CellPlugin.ts`; there is\n * no engine-wide lifecycle dispatcher.\n *\n * Cancellation is fiber interruption via scope closure; nothing here threads an\n * `AbortSignal`.\n *\n * @since 1.0.0-rc.0\n */\n\nimport * as ImmutableMap from \"@smthrs/canonical/ReadonlyMap\"\nimport type * as Cause from \"effect/Cause\"\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Option from \"effect/Option\"\nimport type { ArgsOf, ContextOf, HookKind, KeysOfKind, SuccessOf } from \"./Hooks.ts\"\nimport { engineHooks } from \"./Hooks.ts\"\nimport type { FlowsHooks } from \"./index.ts\"\nimport { PluginError } from \"./PluginError.ts\"\nimport { defaultParallelConcurrency, type HandlerRecord, type Resolved } from \"./Resolve.ts\"\n\nconst empty: ReadonlyArray<HandlerRecord> = Object.freeze([])\n\n// The typed catalog and the runtime catalog can only drift when a host casts\n// around `KeysOfKind`; refuse before any handler runs rather than execute a\n// hook under semantics its declaration never promised.\nconst kindMismatch = (resolved: Resolved<unknown>, hook: string, kind: HookKind): PluginError | undefined => {\n if (!Object.hasOwn(resolved.kinds, hook)) return undefined\n const declared = resolved.kinds[hook]\n if (declared === kind) return undefined\n return new PluginError({\n code: \"hook_kind_mismatch\",\n message: `hook \"${hook}\" is declared ${JSON.stringify(declared)} in the runtime catalog but was dispatched as ${\n JSON.stringify(kind)\n }`,\n hook\n })\n}\n\nconst runHandler = (\n record: HandlerRecord,\n args: ReadonlyArray<unknown>\n): Effect.Effect<unknown, PluginError, any> => {\n const onCause = (cause: Cause.Cause<unknown>) =>\n Effect.fail(\n new PluginError({\n code: \"hook_failed\",\n message: `hook \"${record.hook}\" failed in plugin \"${record.plugin}\"`,\n plugin: record.plugin,\n hook: record.hook,\n cause\n })\n )\n\n return Effect.sync(() => record.handler(...args)).pipe(\n Effect.catchCause(onCause),\n Effect.flatMap((result) =>\n Effect.isEffect(result)\n ? result.pipe(Effect.catchCause(onCause))\n : Effect.fail(\n new PluginError({\n code: \"hook_failed\",\n message: `hook \"${record.hook}\" in plugin \"${record.plugin}\" returned a non-Effect (${typeof result})`,\n plugin: record.plugin,\n hook: record.hook\n })\n )\n )\n )\n}\n\n/**\n * The dispatch surface.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Service<H = FlowsHooks> {\n /** The resolved list this dispatcher walks. */\n readonly resolved: Resolved<H>\n /** Frozen, ordered handler records for a hook. */\n readonly handlers: (hook: string) => ReadonlyArray<HandlerRecord>\n /** Runs every handler in resolved order, one at a time. */\n readonly sequential: <K extends KeysOfKind<H, \"sequential\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<ReadonlyArray<SuccessOf<H[K]>>, PluginError, ContextOf<H[K]>>\n /**\n * Runs every handler concurrently, ignoring results. Never fails: handler\n * failures are returned so the caller can report them at its own boundary.\n */\n readonly parallel: <K extends KeysOfKind<H, \"parallel\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<ReadonlyArray<PluginError>, never, ContextOf<H[K]>>\n /** Runs handlers in order until one returns `Option.some`. */\n readonly first: <K extends KeysOfKind<H, \"first\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<SuccessOf<H[K]>, PluginError, ContextOf<H[K]>>\n /** Threads a value through every handler, merging each returned patch. */\n readonly waterfall: <K extends KeysOfKind<H, \"waterfall\">>(\n hook: K,\n initial: ArgsOf<H[K]>[0],\n merge: (previous: ArgsOf<H[K]>[0], patch: Exclude<SuccessOf<H[K]>, void>) => ArgsOf<H[K]>[0]\n ) => Effect.Effect<ArgsOf<H[K]>[0], PluginError, ContextOf<H[K]>>\n}\n\n/**\n * Builds a dispatcher over an already resolved plugin list.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const make = <H = FlowsHooks>(resolved: Resolved<H>): Service<H> => {\n const handlers = (hook: string): ReadonlyArray<HandlerRecord> => resolved.handlers.get(hook) ?? empty\n\n const sequential = ((hook: string, ...args: Array<unknown>) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"sequential\")\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n const results: Array<unknown> = []\n for (const record of handlers(hook)) {\n results.push(yield* runHandler(record, args))\n }\n return results\n })) as Service<H>[\"sequential\"]\n\n const parallel = ((hook: string, ...args: Array<unknown>) => {\n const mismatch = kindMismatch(resolved, hook, \"parallel\")\n if (mismatch !== undefined) return Effect.succeed([mismatch])\n return Effect.forEach(\n handlers(hook),\n (record) =>\n runHandler(record, args).pipe(\n Effect.match({ onFailure: (error) => [error], onSuccess: () => [] as Array<PluginError> })\n ),\n { concurrency: resolved.parallelConcurrency }\n ).pipe(Effect.map((chunks) => chunks.flat()))\n }) as Service<H>[\"parallel\"]\n\n const first = ((hook: string, ...args: Array<unknown>) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"first\")\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n for (const record of handlers(hook)) {\n const result = yield* runHandler(record, args)\n if (!Option.isOption(result)) {\n return yield* Effect.fail(\n new PluginError({\n code: \"invalid_hook_result\",\n message: `first hook \"${record.hook}\" in plugin \"${record.plugin}\" did not return an Option`,\n plugin: record.plugin,\n hook: record.hook\n })\n )\n }\n if (Option.isSome(result)) return result\n }\n return Option.none()\n })) as unknown as Service<H>[\"first\"]\n\n const waterfall =\n ((hook: string, initial: unknown, merge: (previous: unknown, patch: unknown) => unknown) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"waterfall\")\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n let value = initial\n for (const record of handlers(hook)) {\n const patch = yield* runHandler(record, [value])\n if (patch !== undefined) {\n value = yield* Effect.try({\n try: () => merge(value, patch),\n catch: (cause) =>\n cause instanceof PluginError\n ? new PluginError({\n code: cause.code,\n message: cause.message,\n plugin: record.plugin,\n hook: record.hook,\n path: cause.path\n })\n : new PluginError({\n code: \"config_invalid\",\n message: `waterfall hook \"${record.hook}\" in plugin \"${record.plugin}\" returned an invalid patch`,\n plugin: record.plugin,\n hook: record.hook\n })\n })\n }\n }\n return value\n })) as Service<H>[\"waterfall\"]\n\n return Object.freeze({ resolved, handlers, sequential, parallel, first, waterfall })\n}\n\n/**\n * A dispatcher with no plugins at all.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const makeNoop = <H = FlowsHooks>(): Service<H> =>\n make<H>(Object.freeze({\n plugins: Object.freeze([]),\n handlers: ImmutableMap.make<string, ReadonlyArray<HandlerRecord>>(),\n kinds: engineHooks,\n parallelConcurrency: defaultParallelConcurrency\n }))\n\n/**\n * The shared dispatcher, as a service tag.\n *\n * This tag holds one dispatcher over the process-wide augmented `FlowsHooks`.\n * `declare module \"@smthrs/plugin\"` augmentation is the supported extension\n * mechanism for values placed in the tag. A host typed against a separate hook\n * interface holds its `Service<H>` directly, as `@smthrs/agent` does, and does\n * not use this tag or its layers.\n *\n * @category context\n * @since 1.0.0-rc.0\n */\nexport class Plugins extends Context.Service<Plugins, Service>()(\"flows/plugin/Plugins\") {}\n\n/**\n * Layer providing a dispatcher over an already resolved plugin list.\n *\n * This layer targets the shared augmented `FlowsHooks` catalog only. A host\n * with a separate hook interface holds its `Service<H>` directly.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layer = (resolved: Resolved): Layer.Layer<Plugins> => Layer.succeed(Plugins)(make(resolved))\n\n/**\n * Layer providing a dispatcher with no plugins.\n *\n * This layer targets the shared augmented `FlowsHooks` catalog only. A host\n * with a separate hook interface holds its `Service<H>` directly.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layerNoop: Layer.Layer<Plugins> = Layer.succeed(Plugins)(makeNoop())\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBA,mBAA8B;AAE9B,cAAyB;AACzB,aAAwB;AACxB,YAAuB;AACvB,aAAwB;AAExB,mBAA4B;AAE5B,yBAA4B;AAC5B,qBAA8E;AAE9E,MAAM,QAAsC,OAAO,OAAO,CAAC,CAAC;
|
|
4
|
+
"sourcesContent": ["/**\n * The dispatcher: a plain service over a resolved plugin list, generic over the\n * hook interface.\n *\n * The public package contract is documented at\n * {@link https://smithers.sh/docs/reference/api/plugin}. Each host holds an instance over its\n * augmented `FlowsHooks` and may dispatch only the runtime catalog it supplied.\n * The shipped cell host owns the three\n * waterfalls declared in `packages/smithers/agent/src/CellPlugin.ts`; there is\n * no engine-wide lifecycle dispatcher.\n *\n * Cancellation is fiber interruption via scope closure; nothing here threads an\n * `AbortSignal`.\n *\n * @since 1.0.0-rc.0\n */\n\nimport * as ImmutableMap from \"@smthrs/canonical/ReadonlyMap\"\nimport type * as Cause from \"effect/Cause\"\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Option from \"effect/Option\"\nimport type { ArgsOf, ContextOf, HookKind, KeysOfKind, SuccessOf } from \"./Hooks.ts\"\nimport { engineHooks } from \"./Hooks.ts\"\nimport type { FlowsHooks } from \"./index.ts\"\nimport { PluginError } from \"./PluginError.ts\"\nimport { defaultParallelConcurrency, type HandlerRecord, type Resolved } from \"./Resolve.ts\"\n\nconst empty: ReadonlyArray<HandlerRecord> = Object.freeze([])\n\n// The typed catalog and the runtime catalog can only drift when a host casts\n// around `KeysOfKind`; refuse before any handler runs rather than execute a\n// hook under semantics its declaration never promised.\n// A hook the catalog does not declare dispatches as empty, unless a\n// hand-built resolution registered handlers for it: those have no declared\n// kind to honor, so they are refused too.\nconst kindMismatch = (\n resolved: Resolved<unknown>,\n hook: string,\n kind: HookKind,\n handlers: ReadonlyArray<HandlerRecord>\n): PluginError | undefined => {\n if (!Object.hasOwn(resolved.kinds, hook)) {\n if (handlers.length === 0) return undefined\n return new PluginError({\n code: \"hook_kind_mismatch\",\n message: `hook \"${hook}\" has handlers but is not declared in the runtime catalog`,\n hook\n })\n }\n const declared = resolved.kinds[hook]\n if (declared === kind) return undefined\n return new PluginError({\n code: \"hook_kind_mismatch\",\n message: `hook \"${hook}\" is declared ${JSON.stringify(declared)} in the runtime catalog but was dispatched as ${\n JSON.stringify(kind)\n }`,\n hook\n })\n}\n\nconst runHandler = (\n record: HandlerRecord,\n args: ReadonlyArray<unknown>\n): Effect.Effect<unknown, PluginError, any> => {\n const onCause = (cause: Cause.Cause<unknown>) =>\n Effect.fail(\n new PluginError({\n code: \"hook_failed\",\n message: `hook \"${record.hook}\" failed in plugin \"${record.plugin}\"`,\n plugin: record.plugin,\n hook: record.hook,\n cause\n })\n )\n\n return Effect.sync(() => record.handler(...args)).pipe(\n Effect.catchCause(onCause),\n Effect.flatMap((result) =>\n Effect.isEffect(result)\n ? result.pipe(Effect.catchCause(onCause))\n : Effect.fail(\n new PluginError({\n code: \"hook_failed\",\n message: `hook \"${record.hook}\" in plugin \"${record.plugin}\" returned a non-Effect (${typeof result})`,\n plugin: record.plugin,\n hook: record.hook\n })\n )\n )\n )\n}\n\n/**\n * The dispatch surface.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Service<H = FlowsHooks> {\n /** The resolved list this dispatcher walks. */\n readonly resolved: Resolved<H>\n /** Frozen, ordered handler records for a hook. */\n readonly handlers: (hook: string) => ReadonlyArray<HandlerRecord>\n /** Runs every handler in resolved order, one at a time. */\n readonly sequential: <K extends KeysOfKind<H, \"sequential\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<ReadonlyArray<SuccessOf<H[K]>>, PluginError, ContextOf<H[K]>>\n /**\n * Runs every handler concurrently, ignoring results. Never fails: handler\n * failures are returned so the caller can report them at its own boundary.\n */\n readonly parallel: <K extends KeysOfKind<H, \"parallel\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<ReadonlyArray<PluginError>, never, ContextOf<H[K]>>\n /** Runs handlers in order until one returns `Option.some`. */\n readonly first: <K extends KeysOfKind<H, \"first\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<SuccessOf<H[K]>, PluginError, ContextOf<H[K]>>\n /** Threads a value through every handler, merging each returned patch. */\n readonly waterfall: <K extends KeysOfKind<H, \"waterfall\">>(\n hook: K,\n initial: ArgsOf<H[K]>[0],\n merge: (previous: ArgsOf<H[K]>[0], patch: Exclude<SuccessOf<H[K]>, void>) => ArgsOf<H[K]>[0]\n ) => Effect.Effect<ArgsOf<H[K]>[0], PluginError, ContextOf<H[K]>>\n}\n\n/**\n * Builds a dispatcher over an already resolved plugin list.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const make = <H = FlowsHooks>(resolved: Resolved<H>): Service<H> => {\n const handlers = (hook: string): ReadonlyArray<HandlerRecord> => resolved.handlers.get(hook) ?? empty\n\n const sequential = ((hook: string, ...args: Array<unknown>) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"sequential\", handlers(hook))\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n const results: Array<unknown> = []\n for (const record of handlers(hook)) {\n results.push(yield* runHandler(record, args))\n }\n return results\n })) as Service<H>[\"sequential\"]\n\n const parallel = ((hook: string, ...args: Array<unknown>) => {\n const mismatch = kindMismatch(resolved, hook, \"parallel\", handlers(hook))\n if (mismatch !== undefined) return Effect.succeed([mismatch])\n return Effect.forEach(\n handlers(hook),\n (record) =>\n runHandler(record, args).pipe(\n Effect.match({ onFailure: (error) => [error], onSuccess: () => [] as Array<PluginError> })\n ),\n { concurrency: resolved.parallelConcurrency }\n ).pipe(Effect.map((chunks) => chunks.flat()))\n }) as Service<H>[\"parallel\"]\n\n const first = ((hook: string, ...args: Array<unknown>) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"first\", handlers(hook))\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n for (const record of handlers(hook)) {\n const result = yield* runHandler(record, args)\n if (!Option.isOption(result)) {\n return yield* Effect.fail(\n new PluginError({\n code: \"invalid_hook_result\",\n message: `first hook \"${record.hook}\" in plugin \"${record.plugin}\" did not return an Option`,\n plugin: record.plugin,\n hook: record.hook\n })\n )\n }\n if (Option.isSome(result)) return result\n }\n return Option.none()\n })) as unknown as Service<H>[\"first\"]\n\n const waterfall =\n ((hook: string, initial: unknown, merge: (previous: unknown, patch: unknown) => unknown) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"waterfall\", handlers(hook))\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n let value = initial\n for (const record of handlers(hook)) {\n const patch = yield* runHandler(record, [value])\n if (patch !== undefined) {\n value = yield* Effect.try({\n try: () => merge(value, patch),\n catch: (cause) =>\n cause instanceof PluginError\n ? new PluginError({\n code: cause.code,\n message: cause.message,\n plugin: record.plugin,\n hook: record.hook,\n path: cause.path,\n cause\n })\n : new PluginError({\n code: \"config_invalid\",\n message: `waterfall hook \"${record.hook}\" in plugin \"${record.plugin}\" returned an invalid patch`,\n plugin: record.plugin,\n hook: record.hook,\n cause\n })\n })\n }\n }\n return value\n })) as Service<H>[\"waterfall\"]\n\n return Object.freeze({ resolved, handlers, sequential, parallel, first, waterfall })\n}\n\n/**\n * A dispatcher with no plugins at all.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const makeNoop = <H = FlowsHooks>(): Service<H> =>\n make<H>(Object.freeze({\n plugins: Object.freeze([]),\n handlers: ImmutableMap.make<string, ReadonlyArray<HandlerRecord>>(),\n kinds: engineHooks,\n parallelConcurrency: defaultParallelConcurrency\n }))\n\n/**\n * The shared dispatcher, as a service tag.\n *\n * This tag holds one dispatcher over the process-wide augmented `FlowsHooks`.\n * `declare module \"@smthrs/plugin\"` augmentation is the supported extension\n * mechanism for values placed in the tag. A host typed against a separate hook\n * interface holds its `Service<H>` directly, as `@smthrs/agent` does, and does\n * not use this tag or its layers.\n *\n * @category context\n * @since 1.0.0-rc.0\n */\nexport class Plugins extends Context.Service<Plugins, Service>()(\"flows/plugin/Plugins\") {}\n\n/**\n * Layer providing a dispatcher over an already resolved plugin list.\n *\n * This layer targets the shared augmented `FlowsHooks` catalog only. A host\n * with a separate hook interface holds its `Service<H>` directly.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layer = (resolved: Resolved): Layer.Layer<Plugins> => Layer.succeed(Plugins)(make(resolved))\n\n/**\n * Layer providing a dispatcher with no plugins.\n *\n * This layer targets the shared augmented `FlowsHooks` catalog only. A host\n * with a separate hook interface holds its `Service<H>` directly.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layerNoop: Layer.Layer<Plugins> = Layer.succeed(Plugins)(makeNoop())\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Resolve.d.ts","sourceRoot":"","sources":["../../src/Resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAc,MAAM,YAAY,CAAA;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAI5C,OAAO,KAAK,EAAS,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,WAAW,EAAwB,MAAM,kBAAkB,CAAA;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,OAAQ,CAAA;AAEpC;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,OAAQ,CAAA;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAA;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAA;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAA;CACnD;AAED;;;;;GAKG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,UAAU;IACtC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAA;IACpE,iHAAiH;IACjH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAA;CAChE;AAED;;;;;GAKG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,GAAG,UAAU;IACrC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;IACzC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;IAClD;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;IAC3C,gHAAgH;IAChH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAA;IAC/D,2EAA2E;IAC3E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAClD;
|
|
1
|
+
{"version":3,"file":"Resolve.d.ts","sourceRoot":"","sources":["../../src/Resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/Resolve.js
CHANGED
|
@@ -62,21 +62,23 @@ const childPath = (path, key) => {
|
|
|
62
62
|
const bounded = diagnosticKey(key);
|
|
63
63
|
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(bounded) ? `${path}.${bounded}` : `${path}[${JSON.stringify(bounded)}]`;
|
|
64
64
|
};
|
|
65
|
-
const ownData = (input, path, allowed) => {
|
|
65
|
+
const ownData = (input, path, allowed, fields = {}) => {
|
|
66
66
|
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
67
|
-
throw invalidPlugin(path, "must be an ordinary record");
|
|
67
|
+
throw invalidPlugin(path, "must be an ordinary record", fields);
|
|
68
68
|
}
|
|
69
69
|
const prototype = Object.getPrototypeOf(input);
|
|
70
|
-
if (prototype !== Object.prototype && prototype !== null)
|
|
70
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
71
|
+
throw invalidPlugin(path, "must be an ordinary record", fields);
|
|
72
|
+
}
|
|
71
73
|
const output = {};
|
|
72
74
|
for (const key of Reflect.ownKeys(input)) {
|
|
73
|
-
if (typeof key !== "string") throw invalidPlugin(path, "must not contain symbol keys");
|
|
75
|
+
if (typeof key !== "string") throw invalidPlugin(path, "must not contain symbol keys", fields);
|
|
74
76
|
if (allowed !== void 0 && !allowed.has(key)) {
|
|
75
|
-
throw invalidPlugin(childPath(path, key), "contains an unknown property");
|
|
77
|
+
throw invalidPlugin(childPath(path, key), "contains an unknown property", fields);
|
|
76
78
|
}
|
|
77
79
|
const descriptor = Object.getOwnPropertyDescriptor(input, key);
|
|
78
80
|
if (descriptor === void 0 || !("value" in descriptor) || !descriptor.enumerable) {
|
|
79
|
-
throw invalidPlugin(childPath(path, key), "must be an enumerable data property");
|
|
81
|
+
throw invalidPlugin(childPath(path, key), "must be an enumerable data property", fields);
|
|
80
82
|
}
|
|
81
83
|
Object.defineProperty(output, key, { value: descriptor.value, enumerable: true });
|
|
82
84
|
}
|
|
@@ -136,7 +138,7 @@ const snapshotHook = (entry, path, plugin, hook) => {
|
|
|
136
138
|
if (entry === void 0) {
|
|
137
139
|
throw invalidPlugin(path, "must be a function or a hook object", { plugin, hook });
|
|
138
140
|
}
|
|
139
|
-
const values = ownData(entry, path, /* @__PURE__ */ new Set(["order", "handler"]));
|
|
141
|
+
const values = ownData(entry, path, /* @__PURE__ */ new Set(["order", "handler"]), { plugin, hook });
|
|
140
142
|
if (typeof values.handler !== "function") {
|
|
141
143
|
throw invalidPlugin(`${path}.handler`, "must be a function", { plugin, hook });
|
|
142
144
|
}
|
|
@@ -164,11 +166,11 @@ const snapshotPlugin = (input, path) => {
|
|
|
164
166
|
}
|
|
165
167
|
let hooks;
|
|
166
168
|
if (values.hooks !== void 0) {
|
|
167
|
-
const rawHooks = ownData(values.hooks, `${path}.hooks
|
|
169
|
+
const rawHooks = ownData(values.hooks, `${path}.hooks`, void 0, { plugin: name });
|
|
168
170
|
const snapshot = /* @__PURE__ */ Object.create(null);
|
|
169
171
|
for (const [index, hook] of Object.keys(rawHooks).entries()) {
|
|
170
172
|
if (!validName(hook)) {
|
|
171
|
-
throw invalidPlugin(`${path}.hooks[${index}]`, "contains an invalid hook name");
|
|
173
|
+
throw invalidPlugin(`${path}.hooks[${index}]`, "contains an invalid hook name", { plugin: name });
|
|
172
174
|
}
|
|
173
175
|
const entry = rawHooks[hook];
|
|
174
176
|
Object.defineProperty(snapshot, hook, {
|
package/dist/cjs/Resolve.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/Resolve.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Bounded plugin resolution: admit, filter, validate, order, and snapshot.\n *\n * The resulting catalog owns every record it exposes. Dispatch never reads a\n * caller-owned map, plugin record, hook object, config value, or cache identity.\n *\n * @since 1.0.0-rc.0\n */\n\nimport * as ImmutableMap from \"@smthrs/canonical/ReadonlyMap\"\nimport type { Action } from \"@smthrs/flow\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport type { FlowsConfig } from \"./Config.ts\"\nimport * as Config from \"./Config.ts\"\nimport type { HookCatalog, HookKind, HookObject } from \"./Hooks.ts\"\nimport { engineHooks, handlerOf, orderOf } from \"./Hooks.ts\"\nimport type { FlowsHooks } from \"./index.ts\"\nimport * as Boundary from \"./internal/Boundary.ts\"\nimport { mergePluginLayers } from \"./internal/mergePluginLayers.ts\"\nimport { snapshotCacheEnvironment } from \"./internal/snapshotCacheEnvironment.ts\"\nimport type { Apply, FlowsPlugin, PluginInput } from \"./Plugin.ts\"\nimport { PluginError, type PluginErrorCode } from \"./PluginError.ts\"\n\n/**\n * Maximum nested preset-array depth accepted at startup.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginDepth = 64\n\n/**\n * Maximum plugins accepted by one kernel.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPlugins = 256\n\n/**\n * Maximum aggregate hook handlers accepted by one kernel.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumHandlers = 1_024\n\n/**\n * Maximum input nodes, including arrays and omitted entries.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginInputNodes = 4_096\n\n/**\n * Maximum UTF-16 length of one plugin or hook name.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginNameLength = 256\n\n/**\n * Default fiber bound for parallel observers.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const defaultParallelConcurrency = 16\n\n/**\n * Maximum configurable parallel-observer bound.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumParallelConcurrency = 256\n\n/**\n * One resolved handler with immutable attribution.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface HandlerRecord {\n readonly plugin: string\n readonly hook: string\n readonly handler: (...args: Array<any>) => unknown\n}\n\n/**\n * The immutable output of plugin resolution.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Resolved<H = FlowsHooks> {\n readonly plugins: ReadonlyArray<FlowsPlugin<H>>\n readonly handlers: ReadonlyMap<string, ReadonlyArray<HandlerRecord>>\n /** The frozen runtime catalog this resolution admitted. Dispatch refuses a method whose kind differs from it. */\n readonly kinds: Readonly<Record<string, HookKind>>\n readonly parallelConcurrency: number\n readonly cacheEnvironment?: Action.CacheEnvironment | undefined\n}\n\n/**\n * Options for {@link resolve}.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Options<H = FlowsHooks> {\n /** Pre-resolution config tested by `apply` predicates. */\n readonly config?: FlowsConfig | undefined\n /** Host whose literal `apply` selectors are active. Defaults to `\"engine\"`. */\n readonly target?: \"engine\" | \"harness\" | undefined\n /**\n * Hook names recognized by this host, each with the kind `H` declares for\n * it. The shared `config` and `configResolved` hooks are fixed to\n * `waterfall` and `parallel`; another kind fails with `hook_kind_mismatch`.\n */\n readonly hooks?: HookCatalog<H> | undefined\n /** Complete composition identity for sealed activity keys. Requires every selected plugin to have a version. */\n readonly cacheEnvironment?: Action.CacheEnvironment | undefined\n /** Maximum observers run at once. Defaults to 16 and cannot exceed 256. */\n readonly parallelConcurrency?: number | undefined\n}\n\ninterface RawOptions {\n readonly config: unknown\n readonly target: unknown\n readonly hooks: unknown\n readonly cacheEnvironment: unknown\n readonly parallelConcurrency: unknown\n}\n\nconst failure = (\n code: PluginErrorCode,\n message: string,\n path: string,\n fields: { readonly plugin?: string; readonly hook?: string } = {}\n): PluginError => new PluginError({ code, message, path, ...fields })\n\nconst invalidPlugin = (\n path: string,\n complaint: string,\n fields: { readonly plugin?: string; readonly hook?: string } = {}\n): PluginError => failure(\"invalid_plugin\", `plugin input ${complaint}`, path, fields)\n\n// Bound before quoting or scanning caller-controlled keys. Keep Boundary's\n// identifier/dot and JSON-quoted/bracket path convention.\nconst diagnosticKey = (key: string): string => key.length > 64 ? `${key.slice(0, 64)}...` : key\n\nconst childPath = (path: string, key: string): string => {\n const bounded = diagnosticKey(key)\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(bounded) ? `${path}.${bounded}` : `${path}[${JSON.stringify(bounded)}]`\n}\n\nconst ownData = (\n input: unknown,\n path: string,\n allowed?: ReadonlySet<string>\n): Readonly<Record<string, unknown>> => {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw invalidPlugin(path, \"must be an ordinary record\")\n }\n const prototype = Object.getPrototypeOf(input)\n if (prototype !== Object.prototype && prototype !== null) throw invalidPlugin(path, \"must be an ordinary record\")\n const output: Record<string, unknown> = {}\n for (const key of Reflect.ownKeys(input)) {\n if (typeof key !== \"string\") throw invalidPlugin(path, \"must not contain symbol keys\")\n if (allowed !== undefined && !allowed.has(key)) {\n throw invalidPlugin(childPath(path, key), \"contains an unknown property\")\n }\n const descriptor = Object.getOwnPropertyDescriptor(input, key)\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(childPath(path, key), \"must be an enumerable data property\")\n }\n Object.defineProperty(output, key, { value: descriptor.value, enumerable: true })\n }\n return output\n}\n\nconst snapshotOptions = (input: unknown): RawOptions => {\n const values = ownData(\n input,\n \"$options\",\n new Set([\"config\", \"target\", \"hooks\", \"cacheEnvironment\", \"parallelConcurrency\"])\n )\n return {\n config: values.config,\n target: values.target,\n hooks: values.hooks,\n cacheEnvironment: values.cacheEnvironment,\n parallelConcurrency: values.parallelConcurrency\n }\n}\n\nconst validName = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0 && value.length <= maximumPluginNameLength &&\n Boundary.isWellFormedText(value) && !/^\\s*$/u.test(value) && !/\\p{Cc}/u.test(value)\n\nconst snapshotCatalog = (input: unknown): Readonly<Record<string, HookKind>> => {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw invalidPlugin(\"$options.hooks\", \"must be an ordinary hook catalog\")\n }\n const prototype = Object.getPrototypeOf(input)\n if (prototype !== Object.prototype && prototype !== null) {\n throw invalidPlugin(\"$options.hooks\", \"must be an ordinary hook catalog\")\n }\n const output: Record<string, HookKind> = {}\n for (const key of Reflect.ownKeys(input)) {\n if (typeof key !== \"string\" || !validName(key)) {\n throw invalidPlugin(\"$options.hooks\", \"contains an invalid hook name\")\n }\n const descriptor = Object.getOwnPropertyDescriptor(input, key)\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(childPath(\"$options.hooks\", key), \"must be an enumerable data property\")\n }\n if (!([\"sequential\", \"parallel\", \"first\", \"waterfall\"] as ReadonlyArray<unknown>).includes(descriptor.value)) {\n throw invalidPlugin(childPath(\"$options.hooks\", key), \"contains an invalid hook kind\")\n }\n Object.defineProperty(output, key, { value: descriptor.value, enumerable: true })\n }\n for (const hook of Object.keys(engineHooks) as ReadonlyArray<keyof typeof engineHooks>) {\n if (Object.hasOwn(output, hook) && output[hook] !== engineHooks[hook]) {\n throw failure(\n \"hook_kind_mismatch\",\n `hook catalog declares shared hook ${JSON.stringify(hook)} as ${\n JSON.stringify(output[hook])\n }, the kernel dispatches it as ${JSON.stringify(engineHooks[hook])}`,\n childPath(\"$options.hooks\", hook),\n { hook }\n )\n }\n }\n return Object.freeze(output)\n}\n\nconst snapshotHook = (\n entry: unknown,\n path: string,\n plugin: string,\n hook: string\n): ((...args: Array<any>) => unknown) | HookObject<(...args: Array<any>) => unknown> => {\n if (typeof entry === \"function\") return entry as (...args: Array<any>) => unknown\n if (entry === undefined) {\n throw invalidPlugin(path, \"must be a function or a hook object\", { plugin, hook })\n }\n const values = ownData(entry, path, new Set([\"order\", \"handler\"]))\n if (typeof values.handler !== \"function\") {\n throw invalidPlugin(`${path}.handler`, \"must be a function\", { plugin, hook })\n }\n if (values.order !== undefined && values.order !== \"pre\" && values.order !== \"post\") {\n throw invalidPlugin(`${path}.order`, \"must be pre or post\", { plugin, hook })\n }\n return Object.freeze({\n ...(values.order === undefined ? {} : { order: values.order }),\n handler: values.handler\n }) as HookObject<(...args: Array<any>) => unknown>\n}\n\nconst snapshotPlugin = <H>(\n input: unknown,\n path: string\n): FlowsPlugin<H> => {\n const values = ownData(input, path, new Set([\"name\", \"version\", \"enforce\", \"apply\", \"layer\", \"hooks\"]))\n if (!validName(values.name)) throw invalidPlugin(`${path}.name`, \"requires a bounded non-empty name\")\n const name = values.name\n if (values.version !== undefined && !validName(values.version)) {\n throw invalidPlugin(`${path}.version`, \"requires a bounded non-empty version\", { plugin: name })\n }\n if (values.enforce !== undefined && values.enforce !== \"pre\" && values.enforce !== \"post\") {\n throw invalidPlugin(`${path}.enforce`, \"must be pre or post\", { plugin: name })\n }\n if (\n values.apply !== undefined && values.apply !== \"engine\" && values.apply !== \"harness\" &&\n typeof values.apply !== \"function\"\n ) throw invalidPlugin(`${path}.apply`, \"must be engine, harness, or a predicate\", { plugin: name })\n if (values.layer !== undefined && !Layer.isLayer(values.layer)) {\n throw invalidPlugin(`${path}.layer`, \"must be an Effect Layer\", { plugin: name })\n }\n\n let hooks: Readonly<Record<string, unknown>> | undefined\n if (values.hooks !== undefined) {\n const rawHooks = ownData(values.hooks, `${path}.hooks`)\n const snapshot: Record<string, unknown> = Object.create(null)\n for (const [index, hook] of Object.keys(rawHooks).entries()) {\n if (!validName(hook)) {\n throw invalidPlugin(`${path}.hooks[${index}]`, \"contains an invalid hook name\")\n }\n const entry = rawHooks[hook]\n Object.defineProperty(snapshot, hook, {\n value: snapshotHook(entry, childPath(`${path}.hooks`, hook), name, hook),\n enumerable: true\n })\n }\n hooks = Object.freeze(snapshot)\n }\n\n return Object.freeze({\n name,\n ...(values.version === undefined ? {} : { version: values.version }),\n ...(values.enforce === undefined ? {} : { enforce: values.enforce }),\n ...(values.apply === undefined ? {} : { apply: values.apply as Apply }),\n ...(values.layer === undefined ? {} : { layer: values.layer as Layer.Layer<never, any, any> }),\n ...(hooks === undefined ? {} : { hooks: hooks as Partial<H> })\n })\n}\n\ninterface AdmittedPlugin<H> {\n readonly plugin: FlowsPlugin<H>\n readonly path: string\n}\n\nconst flatten = <H>(input: unknown): ReadonlyArray<AdmittedPlugin<H>> => {\n const output: Array<AdmittedPlugin<H>> = []\n const arrays = new WeakSet<object>()\n const stack: Array<{ readonly value: unknown; readonly path: string; readonly depth: number }> = [\n { value: input, path: \"$\", depth: 0 }\n ]\n let nodes = 0\n while (stack.length > 0) {\n const current = stack.pop()!\n nodes += 1\n if (current.value === false || current.value === null || current.value === undefined) continue\n if (Array.isArray(current.value)) {\n if (current.depth >= maximumPluginDepth) {\n throw failure(\"resource_limit\", `plugin input exceeds the depth limit of ${maximumPluginDepth}`, current.path)\n }\n if (arrays.has(current.value)) throw invalidPlugin(current.path, \"contains a cycle or repeated preset array\")\n arrays.add(current.value)\n const length = current.value.length\n // Every queued frame and array element costs a node, including omitted\n // entries. Refuse before enumerating keys, descriptors, or child frames.\n if (length > maximumPluginInputNodes - nodes - stack.length) {\n throw failure(\"resource_limit\", `plugin input exceeds the ${maximumPluginInputNodes}-node limit`, current.path)\n }\n const keys = Reflect.ownKeys(current.value)\n if (keys.length !== length + 1 || !keys.includes(\"length\")) {\n throw invalidPlugin(current.path, \"must be a dense preset array with no extra properties\")\n }\n for (let index = length - 1; index >= 0; index--) {\n const descriptor = Object.getOwnPropertyDescriptor(current.value, String(index))\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(`${current.path}[${index}]`, \"must be an enumerable data property\")\n }\n stack.push({ value: descriptor.value, path: `${current.path}[${index}]`, depth: current.depth + 1 })\n }\n continue\n }\n output.push(Object.freeze({ plugin: snapshotPlugin<H>(current.value, current.path), path: current.path }))\n if (output.length > maximumPlugins) {\n throw failure(\"resource_limit\", `plugin input exceeds the ${maximumPlugins}-plugin limit`, current.path)\n }\n }\n return output\n}\n\nconst included = <H>(\n { path, plugin }: AdmittedPlugin<H>,\n config: FlowsConfig,\n target: \"engine\" | \"harness\"\n): Effect.Effect<boolean, PluginError> => {\n const apply = plugin.apply\n if (apply === undefined) return Effect.succeed(true)\n if (typeof apply !== \"function\") return Effect.succeed(apply === target)\n return Effect.try({\n try: () => apply(config),\n catch: () =>\n failure(\"apply_failed\", `plugin \"${plugin.name}\" apply predicate failed`, `${path}.apply`, {\n plugin: plugin.name\n })\n }).pipe(\n Effect.flatMap((result) =>\n typeof result === \"boolean\"\n ? Effect.succeed(result)\n : Effect.fail(invalidPlugin(`${path}.apply`, \"predicate must return a boolean\", { plugin: plugin.name }))\n )\n )\n}\n\nconst rank = (enforce: \"pre\" | \"post\" | undefined): number => (enforce === \"pre\" ? 0 : enforce === \"post\" ? 2 : 1)\n\n/**\n * Resolves a plugin preset into an immutable, resource-bounded catalog.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const resolve = <H = FlowsHooks>(\n input: PluginInput<NoInfer<H>>,\n options: Options<NoInfer<H>> = {},\n configOverride?: FlowsConfig\n): Effect.Effect<Resolved<H>, PluginError> =>\n Effect.gen(function*() {\n const raw = yield* Effect.try({\n try: () => snapshotOptions(options),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$options\", \"could not be inspected without executing user code\")\n })\n if (configOverride !== undefined && raw.config !== undefined) {\n return yield* Effect.fail(invalidPlugin(\n \"$options.config\",\n \"cannot declare config in options alongside the positional override\"\n ))\n }\n if (raw.target !== undefined && raw.target !== \"engine\" && raw.target !== \"harness\") {\n return yield* Effect.fail(invalidPlugin(\"$options.target\", \"must be engine or harness\"))\n }\n if (\n raw.parallelConcurrency !== undefined &&\n (typeof raw.parallelConcurrency !== \"number\" || !Number.isSafeInteger(raw.parallelConcurrency) ||\n raw.parallelConcurrency <= 0 ||\n raw.parallelConcurrency > maximumParallelConcurrency)\n ) {\n return yield* Effect.fail(failure(\n \"resource_limit\",\n `parallel concurrency must be between 1 and ${maximumParallelConcurrency}`,\n \"$options.parallelConcurrency\"\n ))\n }\n const parallelConcurrency = raw.parallelConcurrency === undefined\n ? defaultParallelConcurrency\n : raw.parallelConcurrency\n const config = yield* Config.snapshot(configOverride ?? raw.config ?? {})\n const known = yield* Effect.try({\n try: () => snapshotCatalog(raw.hooks ?? engineHooks),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$options.hooks\", \"could not be inspected without executing user code\")\n })\n const admitted = yield* Effect.try({\n try: () => flatten<H>(input),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$\", \"could not be inspected without executing user code\")\n })\n const target = raw.target ?? \"engine\"\n const selected = yield* Effect.filter(admitted, (entry) => included(entry, config, target))\n\n let handlerCount = 0\n for (const { path, plugin } of selected) {\n const pluginHooks = plugin.hooks as Readonly<Record<string, unknown>> | undefined\n if (pluginHooks === undefined) continue\n for (const hook of Object.keys(pluginHooks)) {\n if (!Object.hasOwn(known, hook)) {\n return yield* Effect.fail(failure(\n \"unknown_hook\",\n `plugin ${JSON.stringify(plugin.name)} declares unknown hook ${JSON.stringify(diagnosticKey(hook))}`,\n childPath(`${path}.hooks`, hook),\n { plugin: plugin.name, hook }\n ))\n }\n handlerCount += 1\n if (handlerCount > maximumHandlers) {\n return yield* Effect.fail(failure(\n \"resource_limit\",\n `plugin handlers exceed the limit of ${maximumHandlers}`,\n childPath(`${path}.hooks`, hook)\n ))\n }\n }\n }\n\n const seen = new Set<string>()\n for (const { path, plugin } of selected) {\n if (seen.has(plugin.name)) {\n return yield* Effect.fail(failure(\n \"duplicate_name\",\n `duplicate plugin name \"${plugin.name}\"`,\n `${path}.name`,\n { plugin: plugin.name }\n ))\n }\n seen.add(plugin.name)\n }\n\n const orderedEntries = selected\n .map((entry, index) => ({ entry, index }))\n .sort((left, right) =>\n rank(left.entry.plugin.enforce) - rank(right.entry.plugin.enforce) || left.index - right.index\n )\n .map(({ entry }) => entry)\n const plugins = Object.freeze(orderedEntries.map(({ plugin }) => plugin))\n const entries: Array<readonly [string, ReadonlyArray<HandlerRecord>]> = []\n for (const hook of Object.keys(known)) {\n const records: Array<{\n readonly record: HandlerRecord\n readonly enforceRank: number\n readonly orderRank: number\n readonly index: number\n }> = []\n for (const [index, plugin] of plugins.entries()) {\n const pluginHooks = plugin.hooks as Readonly<Record<string, unknown>> | undefined\n if (pluginHooks === undefined || !Object.hasOwn(pluginHooks, hook)) continue\n const entry = pluginHooks[hook]\n const record = Object.freeze({ plugin: plugin.name, hook, handler: handlerOf(entry) })\n records.push({ record, enforceRank: rank(plugin.enforce), orderRank: rank(orderOf(entry)), index })\n }\n // Vite's rule, verbatim: the per-hook `order` is the outer partition and\n // the enforce-sorted plugin list supplies the stable order inside it, so a\n // hook marked `order: \"pre\"` runs ahead of every normal-order handler even\n // when its plugin is `enforce: \"post\"`.\n const ordered = records\n .sort((left, right) =>\n left.orderRank - right.orderRank || left.enforceRank - right.enforceRank || left.index - right.index\n )\n .map(({ record }) => record)\n if (ordered.length > 0) entries.push([hook, Object.freeze(ordered)])\n }\n const cacheEnvironment = yield* snapshotCacheEnvironment(raw.cacheEnvironment, orderedEntries)\n return Object.freeze({\n plugins,\n handlers: ImmutableMap.make(entries),\n kinds: known,\n parallelConcurrency,\n ...(cacheEnvironment === undefined ? {} : { cacheEnvironment })\n })\n })\n\n/**\n * Merges every resolved plugin layer left-to-right and supplies the detached\n * cache environment captured during resolution.\n *\n * @category combinators\n * @since 1.0.0-rc.0\n */\nexport const layer = <H>(resolved: Resolved<H>): Layer.Layer<any, PluginError, any> =>\n mergePluginLayers(resolved.plugins, resolved.cacheEnvironment)\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Bounded plugin resolution: admit, filter, validate, order, and snapshot.\n *\n * The resulting catalog owns every record it exposes. Dispatch never reads a\n * caller-owned map, plugin record, hook object, config value, or cache identity.\n *\n * @since 1.0.0-rc.0\n */\n\nimport * as ImmutableMap from \"@smthrs/canonical/ReadonlyMap\"\nimport type { Action } from \"@smthrs/flow\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport type { FlowsConfig } from \"./Config.ts\"\nimport * as Config from \"./Config.ts\"\nimport type { HookCatalog, HookKind, HookObject } from \"./Hooks.ts\"\nimport { engineHooks, handlerOf, orderOf } from \"./Hooks.ts\"\nimport type { FlowsHooks } from \"./index.ts\"\nimport * as Boundary from \"./internal/Boundary.ts\"\nimport { mergePluginLayers } from \"./internal/mergePluginLayers.ts\"\nimport { snapshotCacheEnvironment } from \"./internal/snapshotCacheEnvironment.ts\"\nimport type { Apply, FlowsPlugin, PluginInput } from \"./Plugin.ts\"\nimport { PluginError, type PluginErrorCode } from \"./PluginError.ts\"\n\n/**\n * Maximum nested preset-array depth accepted at startup.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginDepth = 64\n\n/**\n * Maximum plugins accepted by one kernel.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPlugins = 256\n\n/**\n * Maximum aggregate hook handlers accepted by one kernel.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumHandlers = 1_024\n\n/**\n * Maximum input nodes, including arrays and omitted entries.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginInputNodes = 4_096\n\n/**\n * Maximum UTF-16 length of one plugin or hook name.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginNameLength = 256\n\n/**\n * Default fiber bound for parallel observers.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const defaultParallelConcurrency = 16\n\n/**\n * Maximum configurable parallel-observer bound.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumParallelConcurrency = 256\n\n/**\n * One resolved handler with immutable attribution.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface HandlerRecord {\n readonly plugin: string\n readonly hook: string\n readonly handler: (...args: Array<any>) => unknown\n}\n\n/**\n * The immutable output of plugin resolution.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Resolved<H = FlowsHooks> {\n readonly plugins: ReadonlyArray<FlowsPlugin<H>>\n readonly handlers: ReadonlyMap<string, ReadonlyArray<HandlerRecord>>\n /** The frozen runtime catalog this resolution admitted. Dispatch refuses a method whose kind differs from it. */\n readonly kinds: Readonly<Record<string, HookKind>>\n readonly parallelConcurrency: number\n readonly cacheEnvironment?: Action.CacheEnvironment | undefined\n}\n\n/**\n * Options for {@link resolve}.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Options<H = FlowsHooks> {\n /** Pre-resolution config tested by `apply` predicates. */\n readonly config?: FlowsConfig | undefined\n /** Host whose literal `apply` selectors are active. Defaults to `\"engine\"`. */\n readonly target?: \"engine\" | \"harness\" | undefined\n /**\n * Hook names recognized by this host, each with the kind `H` declares for\n * it. The shared `config` and `configResolved` hooks are fixed to\n * `waterfall` and `parallel`; another kind fails with `hook_kind_mismatch`.\n */\n readonly hooks?: HookCatalog<H> | undefined\n /** Complete composition identity for sealed activity keys. Requires every selected plugin to have a version. */\n readonly cacheEnvironment?: Action.CacheEnvironment | undefined\n /** Maximum observers run at once. Defaults to 16 and cannot exceed 256. */\n readonly parallelConcurrency?: number | undefined\n}\n\ninterface RawOptions {\n readonly config: unknown\n readonly target: unknown\n readonly hooks: unknown\n readonly cacheEnvironment: unknown\n readonly parallelConcurrency: unknown\n}\n\nconst failure = (\n code: PluginErrorCode,\n message: string,\n path: string,\n fields: { readonly plugin?: string; readonly hook?: string } = {}\n): PluginError => new PluginError({ code, message, path, ...fields })\n\nconst invalidPlugin = (\n path: string,\n complaint: string,\n fields: { readonly plugin?: string; readonly hook?: string } = {}\n): PluginError => failure(\"invalid_plugin\", `plugin input ${complaint}`, path, fields)\n\n// Bound before quoting or scanning caller-controlled keys. Keep Boundary's\n// identifier/dot and JSON-quoted/bracket path convention.\nconst diagnosticKey = (key: string): string => key.length > 64 ? `${key.slice(0, 64)}...` : key\n\nconst childPath = (path: string, key: string): string => {\n const bounded = diagnosticKey(key)\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(bounded) ? `${path}.${bounded}` : `${path}[${JSON.stringify(bounded)}]`\n}\n\nconst ownData = (\n input: unknown,\n path: string,\n allowed?: ReadonlySet<string>,\n fields: { readonly plugin?: string; readonly hook?: string } = {}\n): Readonly<Record<string, unknown>> => {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw invalidPlugin(path, \"must be an ordinary record\", fields)\n }\n const prototype = Object.getPrototypeOf(input)\n if (prototype !== Object.prototype && prototype !== null) {\n throw invalidPlugin(path, \"must be an ordinary record\", fields)\n }\n const output: Record<string, unknown> = {}\n for (const key of Reflect.ownKeys(input)) {\n if (typeof key !== \"string\") throw invalidPlugin(path, \"must not contain symbol keys\", fields)\n if (allowed !== undefined && !allowed.has(key)) {\n throw invalidPlugin(childPath(path, key), \"contains an unknown property\", fields)\n }\n const descriptor = Object.getOwnPropertyDescriptor(input, key)\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(childPath(path, key), \"must be an enumerable data property\", fields)\n }\n Object.defineProperty(output, key, { value: descriptor.value, enumerable: true })\n }\n return output\n}\n\nconst snapshotOptions = (input: unknown): RawOptions => {\n const values = ownData(\n input,\n \"$options\",\n new Set([\"config\", \"target\", \"hooks\", \"cacheEnvironment\", \"parallelConcurrency\"])\n )\n return {\n config: values.config,\n target: values.target,\n hooks: values.hooks,\n cacheEnvironment: values.cacheEnvironment,\n parallelConcurrency: values.parallelConcurrency\n }\n}\n\nconst validName = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0 && value.length <= maximumPluginNameLength &&\n Boundary.isWellFormedText(value) && !/^\\s*$/u.test(value) && !/\\p{Cc}/u.test(value)\n\nconst snapshotCatalog = (input: unknown): Readonly<Record<string, HookKind>> => {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw invalidPlugin(\"$options.hooks\", \"must be an ordinary hook catalog\")\n }\n const prototype = Object.getPrototypeOf(input)\n if (prototype !== Object.prototype && prototype !== null) {\n throw invalidPlugin(\"$options.hooks\", \"must be an ordinary hook catalog\")\n }\n const output: Record<string, HookKind> = {}\n for (const key of Reflect.ownKeys(input)) {\n if (typeof key !== \"string\" || !validName(key)) {\n throw invalidPlugin(\"$options.hooks\", \"contains an invalid hook name\")\n }\n const descriptor = Object.getOwnPropertyDescriptor(input, key)\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(childPath(\"$options.hooks\", key), \"must be an enumerable data property\")\n }\n if (!([\"sequential\", \"parallel\", \"first\", \"waterfall\"] as ReadonlyArray<unknown>).includes(descriptor.value)) {\n throw invalidPlugin(childPath(\"$options.hooks\", key), \"contains an invalid hook kind\")\n }\n Object.defineProperty(output, key, { value: descriptor.value, enumerable: true })\n }\n for (const hook of Object.keys(engineHooks) as ReadonlyArray<keyof typeof engineHooks>) {\n if (Object.hasOwn(output, hook) && output[hook] !== engineHooks[hook]) {\n throw failure(\n \"hook_kind_mismatch\",\n `hook catalog declares shared hook ${JSON.stringify(hook)} as ${\n JSON.stringify(output[hook])\n }, the kernel dispatches it as ${JSON.stringify(engineHooks[hook])}`,\n childPath(\"$options.hooks\", hook),\n { hook }\n )\n }\n }\n return Object.freeze(output)\n}\n\nconst snapshotHook = (\n entry: unknown,\n path: string,\n plugin: string,\n hook: string\n): ((...args: Array<any>) => unknown) | HookObject<(...args: Array<any>) => unknown> => {\n if (typeof entry === \"function\") return entry as (...args: Array<any>) => unknown\n if (entry === undefined) {\n throw invalidPlugin(path, \"must be a function or a hook object\", { plugin, hook })\n }\n const values = ownData(entry, path, new Set([\"order\", \"handler\"]), { plugin, hook })\n if (typeof values.handler !== \"function\") {\n throw invalidPlugin(`${path}.handler`, \"must be a function\", { plugin, hook })\n }\n if (values.order !== undefined && values.order !== \"pre\" && values.order !== \"post\") {\n throw invalidPlugin(`${path}.order`, \"must be pre or post\", { plugin, hook })\n }\n return Object.freeze({\n ...(values.order === undefined ? {} : { order: values.order }),\n handler: values.handler\n }) as HookObject<(...args: Array<any>) => unknown>\n}\n\nconst snapshotPlugin = <H>(\n input: unknown,\n path: string\n): FlowsPlugin<H> => {\n const values = ownData(input, path, new Set([\"name\", \"version\", \"enforce\", \"apply\", \"layer\", \"hooks\"]))\n if (!validName(values.name)) throw invalidPlugin(`${path}.name`, \"requires a bounded non-empty name\")\n const name = values.name\n if (values.version !== undefined && !validName(values.version)) {\n throw invalidPlugin(`${path}.version`, \"requires a bounded non-empty version\", { plugin: name })\n }\n if (values.enforce !== undefined && values.enforce !== \"pre\" && values.enforce !== \"post\") {\n throw invalidPlugin(`${path}.enforce`, \"must be pre or post\", { plugin: name })\n }\n if (\n values.apply !== undefined && values.apply !== \"engine\" && values.apply !== \"harness\" &&\n typeof values.apply !== \"function\"\n ) throw invalidPlugin(`${path}.apply`, \"must be engine, harness, or a predicate\", { plugin: name })\n if (values.layer !== undefined && !Layer.isLayer(values.layer)) {\n throw invalidPlugin(`${path}.layer`, \"must be an Effect Layer\", { plugin: name })\n }\n\n let hooks: Readonly<Record<string, unknown>> | undefined\n if (values.hooks !== undefined) {\n const rawHooks = ownData(values.hooks, `${path}.hooks`, undefined, { plugin: name })\n const snapshot: Record<string, unknown> = Object.create(null)\n for (const [index, hook] of Object.keys(rawHooks).entries()) {\n if (!validName(hook)) {\n throw invalidPlugin(`${path}.hooks[${index}]`, \"contains an invalid hook name\", { plugin: name })\n }\n const entry = rawHooks[hook]\n Object.defineProperty(snapshot, hook, {\n value: snapshotHook(entry, childPath(`${path}.hooks`, hook), name, hook),\n enumerable: true\n })\n }\n hooks = Object.freeze(snapshot)\n }\n\n return Object.freeze({\n name,\n ...(values.version === undefined ? {} : { version: values.version }),\n ...(values.enforce === undefined ? {} : { enforce: values.enforce }),\n ...(values.apply === undefined ? {} : { apply: values.apply as Apply }),\n ...(values.layer === undefined ? {} : { layer: values.layer as Layer.Layer<never, any, any> }),\n ...(hooks === undefined ? {} : { hooks: hooks as Partial<H> })\n })\n}\n\ninterface AdmittedPlugin<H> {\n readonly plugin: FlowsPlugin<H>\n readonly path: string\n}\n\nconst flatten = <H>(input: unknown): ReadonlyArray<AdmittedPlugin<H>> => {\n const output: Array<AdmittedPlugin<H>> = []\n const arrays = new WeakSet<object>()\n const stack: Array<{ readonly value: unknown; readonly path: string; readonly depth: number }> = [\n { value: input, path: \"$\", depth: 0 }\n ]\n let nodes = 0\n while (stack.length > 0) {\n const current = stack.pop()!\n nodes += 1\n if (current.value === false || current.value === null || current.value === undefined) continue\n if (Array.isArray(current.value)) {\n if (current.depth >= maximumPluginDepth) {\n throw failure(\"resource_limit\", `plugin input exceeds the depth limit of ${maximumPluginDepth}`, current.path)\n }\n if (arrays.has(current.value)) throw invalidPlugin(current.path, \"contains a cycle or repeated preset array\")\n arrays.add(current.value)\n const length = current.value.length\n // Every queued frame and array element costs a node, including omitted\n // entries. Refuse before enumerating keys, descriptors, or child frames.\n if (length > maximumPluginInputNodes - nodes - stack.length) {\n throw failure(\"resource_limit\", `plugin input exceeds the ${maximumPluginInputNodes}-node limit`, current.path)\n }\n const keys = Reflect.ownKeys(current.value)\n if (keys.length !== length + 1 || !keys.includes(\"length\")) {\n throw invalidPlugin(current.path, \"must be a dense preset array with no extra properties\")\n }\n for (let index = length - 1; index >= 0; index--) {\n const descriptor = Object.getOwnPropertyDescriptor(current.value, String(index))\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(`${current.path}[${index}]`, \"must be an enumerable data property\")\n }\n stack.push({ value: descriptor.value, path: `${current.path}[${index}]`, depth: current.depth + 1 })\n }\n continue\n }\n output.push(Object.freeze({ plugin: snapshotPlugin<H>(current.value, current.path), path: current.path }))\n if (output.length > maximumPlugins) {\n throw failure(\"resource_limit\", `plugin input exceeds the ${maximumPlugins}-plugin limit`, current.path)\n }\n }\n return output\n}\n\nconst included = <H>(\n { path, plugin }: AdmittedPlugin<H>,\n config: FlowsConfig,\n target: \"engine\" | \"harness\"\n): Effect.Effect<boolean, PluginError> => {\n const apply = plugin.apply\n if (apply === undefined) return Effect.succeed(true)\n if (typeof apply !== \"function\") return Effect.succeed(apply === target)\n return Effect.try({\n try: () => apply(config),\n catch: () =>\n failure(\"apply_failed\", `plugin \"${plugin.name}\" apply predicate failed`, `${path}.apply`, {\n plugin: plugin.name\n })\n }).pipe(\n Effect.flatMap((result) =>\n typeof result === \"boolean\"\n ? Effect.succeed(result)\n : Effect.fail(invalidPlugin(`${path}.apply`, \"predicate must return a boolean\", { plugin: plugin.name }))\n )\n )\n}\n\nconst rank = (enforce: \"pre\" | \"post\" | undefined): number => (enforce === \"pre\" ? 0 : enforce === \"post\" ? 2 : 1)\n\n/**\n * Resolves a plugin preset into an immutable, resource-bounded catalog.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const resolve = <H = FlowsHooks>(\n input: PluginInput<NoInfer<H>>,\n options: Options<NoInfer<H>> = {},\n configOverride?: FlowsConfig\n): Effect.Effect<Resolved<H>, PluginError> =>\n Effect.gen(function*() {\n const raw = yield* Effect.try({\n try: () => snapshotOptions(options),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$options\", \"could not be inspected without executing user code\")\n })\n if (configOverride !== undefined && raw.config !== undefined) {\n return yield* Effect.fail(invalidPlugin(\n \"$options.config\",\n \"cannot declare config in options alongside the positional override\"\n ))\n }\n if (raw.target !== undefined && raw.target !== \"engine\" && raw.target !== \"harness\") {\n return yield* Effect.fail(invalidPlugin(\"$options.target\", \"must be engine or harness\"))\n }\n if (\n raw.parallelConcurrency !== undefined &&\n (typeof raw.parallelConcurrency !== \"number\" || !Number.isSafeInteger(raw.parallelConcurrency) ||\n raw.parallelConcurrency <= 0 ||\n raw.parallelConcurrency > maximumParallelConcurrency)\n ) {\n return yield* Effect.fail(failure(\n \"resource_limit\",\n `parallel concurrency must be between 1 and ${maximumParallelConcurrency}`,\n \"$options.parallelConcurrency\"\n ))\n }\n const parallelConcurrency = raw.parallelConcurrency === undefined\n ? defaultParallelConcurrency\n : raw.parallelConcurrency\n const config = yield* Config.snapshot(configOverride ?? raw.config ?? {})\n const known = yield* Effect.try({\n try: () => snapshotCatalog(raw.hooks ?? engineHooks),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$options.hooks\", \"could not be inspected without executing user code\")\n })\n const admitted = yield* Effect.try({\n try: () => flatten<H>(input),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$\", \"could not be inspected without executing user code\")\n })\n const target = raw.target ?? \"engine\"\n const selected = yield* Effect.filter(admitted, (entry) => included(entry, config, target))\n\n let handlerCount = 0\n for (const { path, plugin } of selected) {\n const pluginHooks = plugin.hooks as Readonly<Record<string, unknown>> | undefined\n if (pluginHooks === undefined) continue\n for (const hook of Object.keys(pluginHooks)) {\n if (!Object.hasOwn(known, hook)) {\n return yield* Effect.fail(failure(\n \"unknown_hook\",\n `plugin ${JSON.stringify(plugin.name)} declares unknown hook ${JSON.stringify(diagnosticKey(hook))}`,\n childPath(`${path}.hooks`, hook),\n { plugin: plugin.name, hook }\n ))\n }\n handlerCount += 1\n if (handlerCount > maximumHandlers) {\n return yield* Effect.fail(failure(\n \"resource_limit\",\n `plugin handlers exceed the limit of ${maximumHandlers}`,\n childPath(`${path}.hooks`, hook)\n ))\n }\n }\n }\n\n const seen = new Set<string>()\n for (const { path, plugin } of selected) {\n if (seen.has(plugin.name)) {\n return yield* Effect.fail(failure(\n \"duplicate_name\",\n `duplicate plugin name \"${plugin.name}\"`,\n `${path}.name`,\n { plugin: plugin.name }\n ))\n }\n seen.add(plugin.name)\n }\n\n const orderedEntries = selected\n .map((entry, index) => ({ entry, index }))\n .sort((left, right) =>\n rank(left.entry.plugin.enforce) - rank(right.entry.plugin.enforce) || left.index - right.index\n )\n .map(({ entry }) => entry)\n const plugins = Object.freeze(orderedEntries.map(({ plugin }) => plugin))\n const entries: Array<readonly [string, ReadonlyArray<HandlerRecord>]> = []\n for (const hook of Object.keys(known)) {\n const records: Array<{\n readonly record: HandlerRecord\n readonly enforceRank: number\n readonly orderRank: number\n readonly index: number\n }> = []\n for (const [index, plugin] of plugins.entries()) {\n const pluginHooks = plugin.hooks as Readonly<Record<string, unknown>> | undefined\n if (pluginHooks === undefined || !Object.hasOwn(pluginHooks, hook)) continue\n const entry = pluginHooks[hook]\n const record = Object.freeze({ plugin: plugin.name, hook, handler: handlerOf(entry) })\n records.push({ record, enforceRank: rank(plugin.enforce), orderRank: rank(orderOf(entry)), index })\n }\n // Vite's rule, verbatim: the per-hook `order` is the outer partition and\n // the enforce-sorted plugin list supplies the stable order inside it, so a\n // hook marked `order: \"pre\"` runs ahead of every normal-order handler even\n // when its plugin is `enforce: \"post\"`.\n const ordered = records\n .sort((left, right) =>\n left.orderRank - right.orderRank || left.enforceRank - right.enforceRank || left.index - right.index\n )\n .map(({ record }) => record)\n if (ordered.length > 0) entries.push([hook, Object.freeze(ordered)])\n }\n const cacheEnvironment = yield* snapshotCacheEnvironment(raw.cacheEnvironment, orderedEntries)\n return Object.freeze({\n plugins,\n handlers: ImmutableMap.make(entries),\n kinds: known,\n parallelConcurrency,\n ...(cacheEnvironment === undefined ? {} : { cacheEnvironment })\n })\n })\n\n/**\n * Merges every resolved plugin layer left-to-right and supplies the detached\n * cache environment captured during resolution.\n *\n * @category combinators\n * @since 1.0.0-rc.0\n */\nexport const layer = <H>(resolved: Resolved<H>): Layer.Layer<any, PluginError, any> =>\n mergePluginLayers(resolved.plugins, resolved.cacheEnvironment)\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,mBAA8B;AAE9B,aAAwB;AACxB,YAAuB;AAEvB,aAAwB;AAExB,mBAAgD;AAEhD,eAA0B;AAC1B,+BAAkC;AAClC,sCAAyC;AAEzC,yBAAkD;AAQ3C,MAAM,qBAAqB;AAQ3B,MAAM,iBAAiB;AAQvB,MAAM,kBAAkB;AAQxB,MAAM,0BAA0B;AAQhC,MAAM,0BAA0B;AAQhC,MAAM,6BAA6B;AAQnC,MAAM,6BAA6B;AA4D1C,MAAM,UAAU,CACd,MACA,SACA,MACA,SAA+D,CAAC,MAChD,IAAI,+BAAY,EAAE,MAAM,SAAS,MAAM,GAAG,OAAO,CAAC;AAEpE,MAAM,gBAAgB,CACpB,MACA,WACA,SAA+D,CAAC,MAChD,QAAQ,kBAAkB,gBAAgB,SAAS,IAAI,MAAM,MAAM;AAIrF,MAAM,gBAAgB,CAAC,QAAwB,IAAI,SAAS,KAAK,GAAG,IAAI,MAAM,GAAG,EAAE,CAAC,QAAQ;AAE5F,MAAM,YAAY,CAAC,MAAc,QAAwB;AACvD,QAAM,UAAU,cAAc,GAAG;AACjC,SAAO,6BAA6B,KAAK,OAAO,IAAI,GAAG,IAAI,IAAI,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,UAAU,OAAO,CAAC;AAC/G;AAEA,MAAM,UAAU,CACd,OACA,MACA,SACA,SAA+D,CAAC,MAC1B;AACtC,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,UAAM,cAAc,MAAM,8BAA8B,MAAM;AAAA,EAChE;AACA,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,MAAI,cAAc,OAAO,aAAa,cAAc,MAAM;AACxD,UAAM,cAAc,MAAM,8BAA8B,MAAM;AAAA,EAChE;AACA,QAAM,SAAkC,CAAC;AACzC,aAAW,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxC,QAAI,OAAO,QAAQ,SAAU,OAAM,cAAc,MAAM,gCAAgC,MAAM;AAC7F,QAAI,YAAY,UAAa,CAAC,QAAQ,IAAI,GAAG,GAAG;AAC9C,YAAM,cAAc,UAAU,MAAM,GAAG,GAAG,gCAAgC,MAAM;AAAA,IAClF;AACA,UAAM,aAAa,OAAO,yBAAyB,OAAO,GAAG;AAC7D,QAAI,eAAe,UAAa,EAAE,WAAW,eAAe,CAAC,WAAW,YAAY;AAClF,YAAM,cAAc,UAAU,MAAM,GAAG,GAAG,uCAAuC,MAAM;AAAA,IACzF;AACA,WAAO,eAAe,QAAQ,KAAK,EAAE,OAAO,WAAW,OAAO,YAAY,KAAK,CAAC;AAAA,EAClF;AACA,SAAO;AACT;AAEA,MAAM,kBAAkB,CAAC,UAA+B;AACtD,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA,oBAAI,IAAI,CAAC,UAAU,UAAU,SAAS,oBAAoB,qBAAqB,CAAC;AAAA,EAClF;AACA,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO;AAAA,IACd,kBAAkB,OAAO;AAAA,IACzB,qBAAqB,OAAO;AAAA,EAC9B;AACF;AAEA,MAAM,YAAY,CAAC,UACjB,OAAO,UAAU,YAAY,MAAM,SAAS,KAAK,MAAM,UAAU,2BACjE,SAAS,iBAAiB,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,KAAK,CAAC,UAAU,KAAK,KAAK;AAEpF,MAAM,kBAAkB,CAAC,UAAuD;AAC9E,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,UAAM,cAAc,kBAAkB,kCAAkC;AAAA,EAC1E;AACA,QAAM,YAAY,OAAO,eAAe,KAAK;AAC7C,MAAI,cAAc,OAAO,aAAa,cAAc,MAAM;AACxD,UAAM,cAAc,kBAAkB,kCAAkC;AAAA,EAC1E;AACA,QAAM,SAAmC,CAAC;AAC1C,aAAW,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxC,QAAI,OAAO,QAAQ,YAAY,CAAC,UAAU,GAAG,GAAG;AAC9C,YAAM,cAAc,kBAAkB,+BAA+B;AAAA,IACvE;AACA,UAAM,aAAa,OAAO,yBAAyB,OAAO,GAAG;AAC7D,QAAI,eAAe,UAAa,EAAE,WAAW,eAAe,CAAC,WAAW,YAAY;AAClF,YAAM,cAAc,UAAU,kBAAkB,GAAG,GAAG,qCAAqC;AAAA,IAC7F;AACA,QAAI,CAAE,CAAC,cAAc,YAAY,SAAS,WAAW,EAA6B,SAAS,WAAW,KAAK,GAAG;AAC5G,YAAM,cAAc,UAAU,kBAAkB,GAAG,GAAG,+BAA+B;AAAA,IACvF;AACA,WAAO,eAAe,QAAQ,KAAK,EAAE,OAAO,WAAW,OAAO,YAAY,KAAK,CAAC;AAAA,EAClF;AACA,aAAW,QAAQ,OAAO,KAAK,wBAAW,GAA8C;AACtF,QAAI,OAAO,OAAO,QAAQ,IAAI,KAAK,OAAO,IAAI,MAAM,yBAAY,IAAI,GAAG;AACrE,YAAM;AAAA,QACJ;AAAA,QACA,qCAAqC,KAAK,UAAU,IAAI,CAAC,OACvD,KAAK,UAAU,OAAO,IAAI,CAAC,CAC7B,iCAAiC,KAAK,UAAU,yBAAY,IAAI,CAAC,CAAC;AAAA,QAClE,UAAU,kBAAkB,IAAI;AAAA,QAChC,EAAE,KAAK;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEA,MAAM,eAAe,CACnB,OACA,MACA,QACA,SACsF;AACtF,MAAI,OAAO,UAAU,WAAY,QAAO;AACxC,MAAI,UAAU,QAAW;AACvB,UAAM,cAAc,MAAM,uCAAuC,EAAE,QAAQ,KAAK,CAAC;AAAA,EACnF;AACA,QAAM,SAAS,QAAQ,OAAO,MAAM,oBAAI,IAAI,CAAC,SAAS,SAAS,CAAC,GAAG,EAAE,QAAQ,KAAK,CAAC;AACnF,MAAI,OAAO,OAAO,YAAY,YAAY;AACxC,UAAM,cAAc,GAAG,IAAI,YAAY,sBAAsB,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC/E;AACA,MAAI,OAAO,UAAU,UAAa,OAAO,UAAU,SAAS,OAAO,UAAU,QAAQ;AACnF,UAAM,cAAc,GAAG,IAAI,UAAU,uBAAuB,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC9E;AACA,SAAO,OAAO,OAAO;AAAA,IACnB,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,IAC5D,SAAS,OAAO;AAAA,EAClB,CAAC;AACH;AAEA,MAAM,iBAAiB,CACrB,OACA,SACmB;AACnB,QAAM,SAAS,QAAQ,OAAO,MAAM,oBAAI,IAAI,CAAC,QAAQ,WAAW,WAAW,SAAS,SAAS,OAAO,CAAC,CAAC;AACtG,MAAI,CAAC,UAAU,OAAO,IAAI,EAAG,OAAM,cAAc,GAAG,IAAI,SAAS,mCAAmC;AACpG,QAAM,OAAO,OAAO;AACpB,MAAI,OAAO,YAAY,UAAa,CAAC,UAAU,OAAO,OAAO,GAAG;AAC9D,UAAM,cAAc,GAAG,IAAI,YAAY,wCAAwC,EAAE,QAAQ,KAAK,CAAC;AAAA,EACjG;AACA,MAAI,OAAO,YAAY,UAAa,OAAO,YAAY,SAAS,OAAO,YAAY,QAAQ;AACzF,UAAM,cAAc,GAAG,IAAI,YAAY,uBAAuB,EAAE,QAAQ,KAAK,CAAC;AAAA,EAChF;AACA,MACE,OAAO,UAAU,UAAa,OAAO,UAAU,YAAY,OAAO,UAAU,aAC5E,OAAO,OAAO,UAAU,WACxB,OAAM,cAAc,GAAG,IAAI,UAAU,2CAA2C,EAAE,QAAQ,KAAK,CAAC;AAClG,MAAI,OAAO,UAAU,UAAa,CAAC,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC9D,UAAM,cAAc,GAAG,IAAI,UAAU,2BAA2B,EAAE,QAAQ,KAAK,CAAC;AAAA,EAClF;AAEA,MAAI;AACJ,MAAI,OAAO,UAAU,QAAW;AAC9B,UAAM,WAAW,QAAQ,OAAO,OAAO,GAAG,IAAI,UAAU,QAAW,EAAE,QAAQ,KAAK,CAAC;AACnF,UAAM,WAAoC,uBAAO,OAAO,IAAI;AAC5D,eAAW,CAAC,OAAO,IAAI,KAAK,OAAO,KAAK,QAAQ,EAAE,QAAQ,GAAG;AAC3D,UAAI,CAAC,UAAU,IAAI,GAAG;AACpB,cAAM,cAAc,GAAG,IAAI,UAAU,KAAK,KAAK,iCAAiC,EAAE,QAAQ,KAAK,CAAC;AAAA,MAClG;AACA,YAAM,QAAQ,SAAS,IAAI;AAC3B,aAAO,eAAe,UAAU,MAAM;AAAA,QACpC,OAAO,aAAa,OAAO,UAAU,GAAG,IAAI,UAAU,IAAI,GAAG,MAAM,IAAI;AAAA,QACvE,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AACA,YAAQ,OAAO,OAAO,QAAQ;AAAA,EAChC;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,GAAI,OAAO,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;AAAA,IAClE,GAAI,OAAO,YAAY,SAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;AAAA,IAClE,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAe;AAAA,IACrE,GAAI,OAAO,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAsC;AAAA,IAC5F,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAA2B;AAAA,EAC9D,CAAC;AACH;AAOA,MAAM,UAAU,CAAI,UAAqD;AACvE,QAAM,SAAmC,CAAC;AAC1C,QAAM,SAAS,oBAAI,QAAgB;AACnC,QAAM,QAA2F;AAAA,IAC/F,EAAE,OAAO,OAAO,MAAM,KAAK,OAAO,EAAE;AAAA,EACtC;AACA,MAAI,QAAQ;AACZ,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,UAAU,MAAM,IAAI;AAC1B,aAAS;AACT,QAAI,QAAQ,UAAU,SAAS,QAAQ,UAAU,QAAQ,QAAQ,UAAU,OAAW;AACtF,QAAI,MAAM,QAAQ,QAAQ,KAAK,GAAG;AAChC,UAAI,QAAQ,SAAS,oBAAoB;AACvC,cAAM,QAAQ,kBAAkB,2CAA2C,kBAAkB,IAAI,QAAQ,IAAI;AAAA,MAC/G;AACA,UAAI,OAAO,IAAI,QAAQ,KAAK,EAAG,OAAM,cAAc,QAAQ,MAAM,2CAA2C;AAC5G,aAAO,IAAI,QAAQ,KAAK;AACxB,YAAM,SAAS,QAAQ,MAAM;AAG7B,UAAI,SAAS,0BAA0B,QAAQ,MAAM,QAAQ;AAC3D,cAAM,QAAQ,kBAAkB,4BAA4B,uBAAuB,eAAe,QAAQ,IAAI;AAAA,MAChH;AACA,YAAM,OAAO,QAAQ,QAAQ,QAAQ,KAAK;AAC1C,UAAI,KAAK,WAAW,SAAS,KAAK,CAAC,KAAK,SAAS,QAAQ,GAAG;AAC1D,cAAM,cAAc,QAAQ,MAAM,uDAAuD;AAAA,MAC3F;AACA,eAAS,QAAQ,SAAS,GAAG,SAAS,GAAG,SAAS;AAChD,cAAM,aAAa,OAAO,yBAAyB,QAAQ,OAAO,OAAO,KAAK,CAAC;AAC/E,YAAI,eAAe,UAAa,EAAE,WAAW,eAAe,CAAC,WAAW,YAAY;AAClF,gBAAM,cAAc,GAAG,QAAQ,IAAI,IAAI,KAAK,KAAK,qCAAqC;AAAA,QACxF;AACA,cAAM,KAAK,EAAE,OAAO,WAAW,OAAO,MAAM,GAAG,QAAQ,IAAI,IAAI,KAAK,KAAK,OAAO,QAAQ,QAAQ,EAAE,CAAC;AAAA,MACrG;AACA;AAAA,IACF;AACA,WAAO,KAAK,OAAO,OAAO,EAAE,QAAQ,eAAkB,QAAQ,OAAO,QAAQ,IAAI,GAAG,MAAM,QAAQ,KAAK,CAAC,CAAC;AACzG,QAAI,OAAO,SAAS,gBAAgB;AAClC,YAAM,QAAQ,kBAAkB,4BAA4B,cAAc,iBAAiB,QAAQ,IAAI;AAAA,IACzG;AAAA,EACF;AACA,SAAO;AACT;AAEA,MAAM,WAAW,CACf,EAAE,MAAM,OAAO,GACf,QACA,WACwC;AACxC,QAAM,QAAQ,OAAO;AACrB,MAAI,UAAU,OAAW,QAAO,OAAO,QAAQ,IAAI;AACnD,MAAI,OAAO,UAAU,WAAY,QAAO,OAAO,QAAQ,UAAU,MAAM;AACvE,SAAO,OAAO,IAAI;AAAA,IAChB,KAAK,MAAM,MAAM,MAAM;AAAA,IACvB,OAAO,MACL,QAAQ,gBAAgB,WAAW,OAAO,IAAI,4BAA4B,GAAG,IAAI,UAAU;AAAA,MACzF,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACL,CAAC,EAAE;AAAA,IACD,OAAO;AAAA,MAAQ,CAAC,WACd,OAAO,WAAW,YACd,OAAO,QAAQ,MAAM,IACrB,OAAO,KAAK,cAAc,GAAG,IAAI,UAAU,mCAAmC,EAAE,QAAQ,OAAO,KAAK,CAAC,CAAC;AAAA,IAC5G;AAAA,EACF;AACF;AAEA,MAAM,OAAO,CAAC,YAAiD,YAAY,QAAQ,IAAI,YAAY,SAAS,IAAI;AAQzG,MAAM,UAAU,CACrB,OACA,UAA+B,CAAC,GAChC,mBAEA,OAAO,IAAI,aAAY;AACrB,QAAM,MAAM,OAAO,OAAO,IAAI;AAAA,IAC5B,KAAK,MAAM,gBAAgB,OAAO;AAAA,IAClC,OAAO,CAAC,UACN,iBAAiB,iCACb,QACA,cAAc,YAAY,oDAAoD;AAAA,EACtF,CAAC;AACD,MAAI,mBAAmB,UAAa,IAAI,WAAW,QAAW;AAC5D,WAAO,OAAO,OAAO,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACA,MAAI,IAAI,WAAW,UAAa,IAAI,WAAW,YAAY,IAAI,WAAW,WAAW;AACnF,WAAO,OAAO,OAAO,KAAK,cAAc,mBAAmB,2BAA2B,CAAC;AAAA,EACzF;AACA,MACE,IAAI,wBAAwB,WAC3B,OAAO,IAAI,wBAAwB,YAAY,CAAC,OAAO,cAAc,IAAI,mBAAmB,KAC3F,IAAI,uBAAuB,KAC3B,IAAI,sBAAsB,6BAC5B;AACA,WAAO,OAAO,OAAO,KAAK;AAAA,MACxB;AAAA,MACA,8CAA8C,0BAA0B;AAAA,MACxE;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,sBAAsB,IAAI,wBAAwB,SACpD,6BACA,IAAI;AACR,QAAM,SAAS,OAAO,OAAO,SAAS,kBAAkB,IAAI,UAAU,CAAC,CAAC;AACxE,QAAM,QAAQ,OAAO,OAAO,IAAI;AAAA,IAC9B,KAAK,MAAM,gBAAgB,IAAI,SAAS,wBAAW;AAAA,IACnD,OAAO,CAAC,UACN,iBAAiB,iCACb,QACA,cAAc,kBAAkB,oDAAoD;AAAA,EAC5F,CAAC;AACD,QAAM,WAAW,OAAO,OAAO,IAAI;AAAA,IACjC,KAAK,MAAM,QAAW,KAAK;AAAA,IAC3B,OAAO,CAAC,UACN,iBAAiB,iCACb,QACA,cAAc,KAAK,oDAAoD;AAAA,EAC/E,CAAC;AACD,QAAM,SAAS,IAAI,UAAU;AAC7B,QAAM,WAAW,OAAO,OAAO,OAAO,UAAU,CAAC,UAAU,SAAS,OAAO,QAAQ,MAAM,CAAC;AAE1F,MAAI,eAAe;AACnB,aAAW,EAAE,MAAM,OAAO,KAAK,UAAU;AACvC,UAAM,cAAc,OAAO;AAC3B,QAAI,gBAAgB,OAAW;AAC/B,eAAW,QAAQ,OAAO,KAAK,WAAW,GAAG;AAC3C,UAAI,CAAC,OAAO,OAAO,OAAO,IAAI,GAAG;AAC/B,eAAO,OAAO,OAAO,KAAK;AAAA,UACxB;AAAA,UACA,UAAU,KAAK,UAAU,OAAO,IAAI,CAAC,0BAA0B,KAAK,UAAU,cAAc,IAAI,CAAC,CAAC;AAAA,UAClG,UAAU,GAAG,IAAI,UAAU,IAAI;AAAA,UAC/B,EAAE,QAAQ,OAAO,MAAM,KAAK;AAAA,QAC9B,CAAC;AAAA,MACH;AACA,sBAAgB;AAChB,UAAI,eAAe,iBAAiB;AAClC,eAAO,OAAO,OAAO,KAAK;AAAA,UACxB;AAAA,UACA,uCAAuC,eAAe;AAAA,UACtD,UAAU,GAAG,IAAI,UAAU,IAAI;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,EAAE,MAAM,OAAO,KAAK,UAAU;AACvC,QAAI,KAAK,IAAI,OAAO,IAAI,GAAG;AACzB,aAAO,OAAO,OAAO,KAAK;AAAA,QACxB;AAAA,QACA,0BAA0B,OAAO,IAAI;AAAA,QACrC,GAAG,IAAI;AAAA,QACP,EAAE,QAAQ,OAAO,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AACA,SAAK,IAAI,OAAO,IAAI;AAAA,EACtB;AAEA,QAAM,iBAAiB,SACpB,IAAI,CAAC,OAAO,WAAW,EAAE,OAAO,MAAM,EAAE,EACxC;AAAA,IAAK,CAAC,MAAM,UACX,KAAK,KAAK,MAAM,OAAO,OAAO,IAAI,KAAK,MAAM,MAAM,OAAO,OAAO,KAAK,KAAK,QAAQ,MAAM;AAAA,EAC3F,EACC,IAAI,CAAC,EAAE,MAAM,MAAM,KAAK;AAC3B,QAAM,UAAU,OAAO,OAAO,eAAe,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM,CAAC;AACxE,QAAM,UAAkE,CAAC;AACzE,aAAW,QAAQ,OAAO,KAAK,KAAK,GAAG;AACrC,UAAM,UAKD,CAAC;AACN,eAAW,CAAC,OAAO,MAAM,KAAK,QAAQ,QAAQ,GAAG;AAC/C,YAAM,cAAc,OAAO;AAC3B,UAAI,gBAAgB,UAAa,CAAC,OAAO,OAAO,aAAa,IAAI,EAAG;AACpE,YAAM,QAAQ,YAAY,IAAI;AAC9B,YAAM,SAAS,OAAO,OAAO,EAAE,QAAQ,OAAO,MAAM,MAAM,aAAS,wBAAU,KAAK,EAAE,CAAC;AACrF,cAAQ,KAAK,EAAE,QAAQ,aAAa,KAAK,OAAO,OAAO,GAAG,WAAW,SAAK,sBAAQ,KAAK,CAAC,GAAG,MAAM,CAAC;AAAA,IACpG;AAKA,UAAM,UAAU,QACb;AAAA,MAAK,CAAC,MAAM,UACX,KAAK,YAAY,MAAM,aAAa,KAAK,cAAc,MAAM,eAAe,KAAK,QAAQ,MAAM;AAAA,IACjG,EACC,IAAI,CAAC,EAAE,OAAO,MAAM,MAAM;AAC7B,QAAI,QAAQ,SAAS,EAAG,SAAQ,KAAK,CAAC,MAAM,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,EACrE;AACA,QAAM,mBAAmB,WAAO,0DAAyB,IAAI,kBAAkB,cAAc;AAC7F,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,UAAU,aAAa,KAAK,OAAO;AAAA,IACnC,OAAO;AAAA,IACP;AAAA,IACA,GAAI,qBAAqB,SAAY,CAAC,IAAI,EAAE,iBAAiB;AAAA,EAC/D,CAAC;AACH,CAAC;AASI,MAAM,QAAQ,CAAI,iBACvB,4CAAkB,SAAS,SAAS,SAAS,gBAAgB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plugins.d.ts","sourceRoot":"","sources":["../../src/Plugins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAY,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAA8B,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"Plugins.d.ts","sourceRoot":"","sources":["../../src/Plugins.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/Plugins.js
CHANGED
|
@@ -26,9 +26,19 @@ const empty = Object.freeze([]);
|
|
|
26
26
|
// The typed catalog and the runtime catalog can only drift when a host casts
|
|
27
27
|
// around `KeysOfKind`; refuse before any handler runs rather than execute a
|
|
28
28
|
// hook under semantics its declaration never promised.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
// A hook the catalog does not declare dispatches as empty, unless a
|
|
30
|
+
// hand-built resolution registered handlers for it: those have no declared
|
|
31
|
+
// kind to honor, so they are refused too.
|
|
32
|
+
const kindMismatch = (resolved, hook, kind, handlers) => {
|
|
33
|
+
if (!Object.hasOwn(resolved.kinds, hook)) {
|
|
34
|
+
if (handlers.length === 0)
|
|
35
|
+
return undefined;
|
|
36
|
+
return new PluginError({
|
|
37
|
+
code: "hook_kind_mismatch",
|
|
38
|
+
message: `hook "${hook}" has handlers but is not declared in the runtime catalog`,
|
|
39
|
+
hook
|
|
40
|
+
});
|
|
41
|
+
}
|
|
32
42
|
const declared = resolved.kinds[hook];
|
|
33
43
|
if (declared === kind)
|
|
34
44
|
return undefined;
|
|
@@ -64,7 +74,7 @@ const runHandler = (record, args) => {
|
|
|
64
74
|
export const make = (resolved) => {
|
|
65
75
|
const handlers = (hook) => resolved.handlers.get(hook) ?? empty;
|
|
66
76
|
const sequential = ((hook, ...args) => Effect.gen(function* () {
|
|
67
|
-
const mismatch = kindMismatch(resolved, hook, "sequential");
|
|
77
|
+
const mismatch = kindMismatch(resolved, hook, "sequential", handlers(hook));
|
|
68
78
|
if (mismatch !== undefined)
|
|
69
79
|
return yield* Effect.fail(mismatch);
|
|
70
80
|
const results = [];
|
|
@@ -74,13 +84,13 @@ export const make = (resolved) => {
|
|
|
74
84
|
return results;
|
|
75
85
|
}));
|
|
76
86
|
const parallel = ((hook, ...args) => {
|
|
77
|
-
const mismatch = kindMismatch(resolved, hook, "parallel");
|
|
87
|
+
const mismatch = kindMismatch(resolved, hook, "parallel", handlers(hook));
|
|
78
88
|
if (mismatch !== undefined)
|
|
79
89
|
return Effect.succeed([mismatch]);
|
|
80
90
|
return Effect.forEach(handlers(hook), (record) => runHandler(record, args).pipe(Effect.match({ onFailure: (error) => [error], onSuccess: () => [] })), { concurrency: resolved.parallelConcurrency }).pipe(Effect.map((chunks) => chunks.flat()));
|
|
81
91
|
});
|
|
82
92
|
const first = ((hook, ...args) => Effect.gen(function* () {
|
|
83
|
-
const mismatch = kindMismatch(resolved, hook, "first");
|
|
93
|
+
const mismatch = kindMismatch(resolved, hook, "first", handlers(hook));
|
|
84
94
|
if (mismatch !== undefined)
|
|
85
95
|
return yield* Effect.fail(mismatch);
|
|
86
96
|
for (const record of handlers(hook)) {
|
|
@@ -99,7 +109,7 @@ export const make = (resolved) => {
|
|
|
99
109
|
return Option.none();
|
|
100
110
|
}));
|
|
101
111
|
const waterfall = ((hook, initial, merge) => Effect.gen(function* () {
|
|
102
|
-
const mismatch = kindMismatch(resolved, hook, "waterfall");
|
|
112
|
+
const mismatch = kindMismatch(resolved, hook, "waterfall", handlers(hook));
|
|
103
113
|
if (mismatch !== undefined)
|
|
104
114
|
return yield* Effect.fail(mismatch);
|
|
105
115
|
let value = initial;
|
|
@@ -114,13 +124,15 @@ export const make = (resolved) => {
|
|
|
114
124
|
message: cause.message,
|
|
115
125
|
plugin: record.plugin,
|
|
116
126
|
hook: record.hook,
|
|
117
|
-
path: cause.path
|
|
127
|
+
path: cause.path,
|
|
128
|
+
cause
|
|
118
129
|
})
|
|
119
130
|
: new PluginError({
|
|
120
131
|
code: "config_invalid",
|
|
121
132
|
message: `waterfall hook "${record.hook}" in plugin "${record.plugin}" returned an invalid patch`,
|
|
122
133
|
plugin: record.plugin,
|
|
123
|
-
hook: record.hook
|
|
134
|
+
hook: record.hook,
|
|
135
|
+
cause
|
|
124
136
|
})
|
|
125
137
|
});
|
|
126
138
|
}
|
package/dist/esm/Plugins.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plugins.js","sourceRoot":"","sources":["../../src/Plugins.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The dispatcher: a plain service over a resolved plugin list, generic over the\n * hook interface.\n *\n * The public package contract is documented at\n * {@link https://smithers.sh/docs/reference/api/plugin}. Each host holds an instance over its\n * augmented `FlowsHooks` and may dispatch only the runtime catalog it supplied.\n * The shipped cell host owns the three\n * waterfalls declared in `packages/smithers/agent/src/CellPlugin.ts`; there is\n * no engine-wide lifecycle dispatcher.\n *\n * Cancellation is fiber interruption via scope closure; nothing here threads an\n * `AbortSignal`.\n *\n * @since 1.0.0-rc.0\n */\n\nimport * as ImmutableMap from \"@smthrs/canonical/ReadonlyMap\"\nimport type * as Cause from \"effect/Cause\"\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Option from \"effect/Option\"\nimport type { ArgsOf, ContextOf, HookKind, KeysOfKind, SuccessOf } from \"./Hooks.ts\"\nimport { engineHooks } from \"./Hooks.ts\"\nimport type { FlowsHooks } from \"./index.ts\"\nimport { PluginError } from \"./PluginError.ts\"\nimport { defaultParallelConcurrency, type HandlerRecord, type Resolved } from \"./Resolve.ts\"\n\nconst empty: ReadonlyArray<HandlerRecord> = Object.freeze([])\n\n// The typed catalog and the runtime catalog can only drift when a host casts\n// around `KeysOfKind`; refuse before any handler runs rather than execute a\n// hook under semantics its declaration never promised.\nconst kindMismatch = (resolved: Resolved<unknown>, hook: string, kind: HookKind): PluginError | undefined => {\n if (!Object.hasOwn(resolved.kinds, hook)) return undefined\n const declared = resolved.kinds[hook]\n if (declared === kind) return undefined\n return new PluginError({\n code: \"hook_kind_mismatch\",\n message: `hook \"${hook}\" is declared ${JSON.stringify(declared)} in the runtime catalog but was dispatched as ${\n JSON.stringify(kind)\n }`,\n hook\n })\n}\n\nconst runHandler = (\n record: HandlerRecord,\n args: ReadonlyArray<unknown>\n): Effect.Effect<unknown, PluginError, any> => {\n const onCause = (cause: Cause.Cause<unknown>) =>\n Effect.fail(\n new PluginError({\n code: \"hook_failed\",\n message: `hook \"${record.hook}\" failed in plugin \"${record.plugin}\"`,\n plugin: record.plugin,\n hook: record.hook,\n cause\n })\n )\n\n return Effect.sync(() => record.handler(...args)).pipe(\n Effect.catchCause(onCause),\n Effect.flatMap((result) =>\n Effect.isEffect(result)\n ? result.pipe(Effect.catchCause(onCause))\n : Effect.fail(\n new PluginError({\n code: \"hook_failed\",\n message: `hook \"${record.hook}\" in plugin \"${record.plugin}\" returned a non-Effect (${typeof result})`,\n plugin: record.plugin,\n hook: record.hook\n })\n )\n )\n )\n}\n\n/**\n * The dispatch surface.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Service<H = FlowsHooks> {\n /** The resolved list this dispatcher walks. */\n readonly resolved: Resolved<H>\n /** Frozen, ordered handler records for a hook. */\n readonly handlers: (hook: string) => ReadonlyArray<HandlerRecord>\n /** Runs every handler in resolved order, one at a time. */\n readonly sequential: <K extends KeysOfKind<H, \"sequential\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<ReadonlyArray<SuccessOf<H[K]>>, PluginError, ContextOf<H[K]>>\n /**\n * Runs every handler concurrently, ignoring results. Never fails: handler\n * failures are returned so the caller can report them at its own boundary.\n */\n readonly parallel: <K extends KeysOfKind<H, \"parallel\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<ReadonlyArray<PluginError>, never, ContextOf<H[K]>>\n /** Runs handlers in order until one returns `Option.some`. */\n readonly first: <K extends KeysOfKind<H, \"first\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<SuccessOf<H[K]>, PluginError, ContextOf<H[K]>>\n /** Threads a value through every handler, merging each returned patch. */\n readonly waterfall: <K extends KeysOfKind<H, \"waterfall\">>(\n hook: K,\n initial: ArgsOf<H[K]>[0],\n merge: (previous: ArgsOf<H[K]>[0], patch: Exclude<SuccessOf<H[K]>, void>) => ArgsOf<H[K]>[0]\n ) => Effect.Effect<ArgsOf<H[K]>[0], PluginError, ContextOf<H[K]>>\n}\n\n/**\n * Builds a dispatcher over an already resolved plugin list.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const make = <H = FlowsHooks>(resolved: Resolved<H>): Service<H> => {\n const handlers = (hook: string): ReadonlyArray<HandlerRecord> => resolved.handlers.get(hook) ?? empty\n\n const sequential = ((hook: string, ...args: Array<unknown>) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"sequential\")\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n const results: Array<unknown> = []\n for (const record of handlers(hook)) {\n results.push(yield* runHandler(record, args))\n }\n return results\n })) as Service<H>[\"sequential\"]\n\n const parallel = ((hook: string, ...args: Array<unknown>) => {\n const mismatch = kindMismatch(resolved, hook, \"parallel\")\n if (mismatch !== undefined) return Effect.succeed([mismatch])\n return Effect.forEach(\n handlers(hook),\n (record) =>\n runHandler(record, args).pipe(\n Effect.match({ onFailure: (error) => [error], onSuccess: () => [] as Array<PluginError> })\n ),\n { concurrency: resolved.parallelConcurrency }\n ).pipe(Effect.map((chunks) => chunks.flat()))\n }) as Service<H>[\"parallel\"]\n\n const first = ((hook: string, ...args: Array<unknown>) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"first\")\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n for (const record of handlers(hook)) {\n const result = yield* runHandler(record, args)\n if (!Option.isOption(result)) {\n return yield* Effect.fail(\n new PluginError({\n code: \"invalid_hook_result\",\n message: `first hook \"${record.hook}\" in plugin \"${record.plugin}\" did not return an Option`,\n plugin: record.plugin,\n hook: record.hook\n })\n )\n }\n if (Option.isSome(result)) return result\n }\n return Option.none()\n })) as unknown as Service<H>[\"first\"]\n\n const waterfall =\n ((hook: string, initial: unknown, merge: (previous: unknown, patch: unknown) => unknown) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"waterfall\")\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n let value = initial\n for (const record of handlers(hook)) {\n const patch = yield* runHandler(record, [value])\n if (patch !== undefined) {\n value = yield* Effect.try({\n try: () => merge(value, patch),\n catch: (cause) =>\n cause instanceof PluginError\n ? new PluginError({\n code: cause.code,\n message: cause.message,\n plugin: record.plugin,\n hook: record.hook,\n path: cause.path\n })\n : new PluginError({\n code: \"config_invalid\",\n message: `waterfall hook \"${record.hook}\" in plugin \"${record.plugin}\" returned an invalid patch`,\n plugin: record.plugin,\n hook: record.hook\n })\n })\n }\n }\n return value\n })) as Service<H>[\"waterfall\"]\n\n return Object.freeze({ resolved, handlers, sequential, parallel, first, waterfall })\n}\n\n/**\n * A dispatcher with no plugins at all.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const makeNoop = <H = FlowsHooks>(): Service<H> =>\n make<H>(Object.freeze({\n plugins: Object.freeze([]),\n handlers: ImmutableMap.make<string, ReadonlyArray<HandlerRecord>>(),\n kinds: engineHooks,\n parallelConcurrency: defaultParallelConcurrency\n }))\n\n/**\n * The shared dispatcher, as a service tag.\n *\n * This tag holds one dispatcher over the process-wide augmented `FlowsHooks`.\n * `declare module \"@smthrs/plugin\"` augmentation is the supported extension\n * mechanism for values placed in the tag. A host typed against a separate hook\n * interface holds its `Service<H>` directly, as `@smthrs/agent` does, and does\n * not use this tag or its layers.\n *\n * @category context\n * @since 1.0.0-rc.0\n */\nexport class Plugins extends Context.Service<Plugins, Service>()(\"flows/plugin/Plugins\") {}\n\n/**\n * Layer providing a dispatcher over an already resolved plugin list.\n *\n * This layer targets the shared augmented `FlowsHooks` catalog only. A host\n * with a separate hook interface holds its `Service<H>` directly.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layer = (resolved: Resolved): Layer.Layer<Plugins> => Layer.succeed(Plugins)(make(resolved))\n\n/**\n * Layer providing a dispatcher with no plugins.\n *\n * This layer targets the shared augmented `FlowsHooks` catalog only. A host\n * with a separate hook interface holds its `Service<H>` directly.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layerNoop: Layer.Layer<Plugins> = Layer.succeed(Plugins)(makeNoop())\n"]}
|
|
1
|
+
{"version":3,"file":"Plugins.js","sourceRoot":"","sources":["../../src/Plugins.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The dispatcher: a plain service over a resolved plugin list, generic over the\n * hook interface.\n *\n * The public package contract is documented at\n * {@link https://smithers.sh/docs/reference/api/plugin}. Each host holds an instance over its\n * augmented `FlowsHooks` and may dispatch only the runtime catalog it supplied.\n * The shipped cell host owns the three\n * waterfalls declared in `packages/smithers/agent/src/CellPlugin.ts`; there is\n * no engine-wide lifecycle dispatcher.\n *\n * Cancellation is fiber interruption via scope closure; nothing here threads an\n * `AbortSignal`.\n *\n * @since 1.0.0-rc.0\n */\n\nimport * as ImmutableMap from \"@smthrs/canonical/ReadonlyMap\"\nimport type * as Cause from \"effect/Cause\"\nimport * as Context from \"effect/Context\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport * as Option from \"effect/Option\"\nimport type { ArgsOf, ContextOf, HookKind, KeysOfKind, SuccessOf } from \"./Hooks.ts\"\nimport { engineHooks } from \"./Hooks.ts\"\nimport type { FlowsHooks } from \"./index.ts\"\nimport { PluginError } from \"./PluginError.ts\"\nimport { defaultParallelConcurrency, type HandlerRecord, type Resolved } from \"./Resolve.ts\"\n\nconst empty: ReadonlyArray<HandlerRecord> = Object.freeze([])\n\n// The typed catalog and the runtime catalog can only drift when a host casts\n// around `KeysOfKind`; refuse before any handler runs rather than execute a\n// hook under semantics its declaration never promised.\n// A hook the catalog does not declare dispatches as empty, unless a\n// hand-built resolution registered handlers for it: those have no declared\n// kind to honor, so they are refused too.\nconst kindMismatch = (\n resolved: Resolved<unknown>,\n hook: string,\n kind: HookKind,\n handlers: ReadonlyArray<HandlerRecord>\n): PluginError | undefined => {\n if (!Object.hasOwn(resolved.kinds, hook)) {\n if (handlers.length === 0) return undefined\n return new PluginError({\n code: \"hook_kind_mismatch\",\n message: `hook \"${hook}\" has handlers but is not declared in the runtime catalog`,\n hook\n })\n }\n const declared = resolved.kinds[hook]\n if (declared === kind) return undefined\n return new PluginError({\n code: \"hook_kind_mismatch\",\n message: `hook \"${hook}\" is declared ${JSON.stringify(declared)} in the runtime catalog but was dispatched as ${\n JSON.stringify(kind)\n }`,\n hook\n })\n}\n\nconst runHandler = (\n record: HandlerRecord,\n args: ReadonlyArray<unknown>\n): Effect.Effect<unknown, PluginError, any> => {\n const onCause = (cause: Cause.Cause<unknown>) =>\n Effect.fail(\n new PluginError({\n code: \"hook_failed\",\n message: `hook \"${record.hook}\" failed in plugin \"${record.plugin}\"`,\n plugin: record.plugin,\n hook: record.hook,\n cause\n })\n )\n\n return Effect.sync(() => record.handler(...args)).pipe(\n Effect.catchCause(onCause),\n Effect.flatMap((result) =>\n Effect.isEffect(result)\n ? result.pipe(Effect.catchCause(onCause))\n : Effect.fail(\n new PluginError({\n code: \"hook_failed\",\n message: `hook \"${record.hook}\" in plugin \"${record.plugin}\" returned a non-Effect (${typeof result})`,\n plugin: record.plugin,\n hook: record.hook\n })\n )\n )\n )\n}\n\n/**\n * The dispatch surface.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Service<H = FlowsHooks> {\n /** The resolved list this dispatcher walks. */\n readonly resolved: Resolved<H>\n /** Frozen, ordered handler records for a hook. */\n readonly handlers: (hook: string) => ReadonlyArray<HandlerRecord>\n /** Runs every handler in resolved order, one at a time. */\n readonly sequential: <K extends KeysOfKind<H, \"sequential\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<ReadonlyArray<SuccessOf<H[K]>>, PluginError, ContextOf<H[K]>>\n /**\n * Runs every handler concurrently, ignoring results. Never fails: handler\n * failures are returned so the caller can report them at its own boundary.\n */\n readonly parallel: <K extends KeysOfKind<H, \"parallel\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<ReadonlyArray<PluginError>, never, ContextOf<H[K]>>\n /** Runs handlers in order until one returns `Option.some`. */\n readonly first: <K extends KeysOfKind<H, \"first\">>(\n hook: K,\n ...args: ArgsOf<H[K]>\n ) => Effect.Effect<SuccessOf<H[K]>, PluginError, ContextOf<H[K]>>\n /** Threads a value through every handler, merging each returned patch. */\n readonly waterfall: <K extends KeysOfKind<H, \"waterfall\">>(\n hook: K,\n initial: ArgsOf<H[K]>[0],\n merge: (previous: ArgsOf<H[K]>[0], patch: Exclude<SuccessOf<H[K]>, void>) => ArgsOf<H[K]>[0]\n ) => Effect.Effect<ArgsOf<H[K]>[0], PluginError, ContextOf<H[K]>>\n}\n\n/**\n * Builds a dispatcher over an already resolved plugin list.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const make = <H = FlowsHooks>(resolved: Resolved<H>): Service<H> => {\n const handlers = (hook: string): ReadonlyArray<HandlerRecord> => resolved.handlers.get(hook) ?? empty\n\n const sequential = ((hook: string, ...args: Array<unknown>) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"sequential\", handlers(hook))\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n const results: Array<unknown> = []\n for (const record of handlers(hook)) {\n results.push(yield* runHandler(record, args))\n }\n return results\n })) as Service<H>[\"sequential\"]\n\n const parallel = ((hook: string, ...args: Array<unknown>) => {\n const mismatch = kindMismatch(resolved, hook, \"parallel\", handlers(hook))\n if (mismatch !== undefined) return Effect.succeed([mismatch])\n return Effect.forEach(\n handlers(hook),\n (record) =>\n runHandler(record, args).pipe(\n Effect.match({ onFailure: (error) => [error], onSuccess: () => [] as Array<PluginError> })\n ),\n { concurrency: resolved.parallelConcurrency }\n ).pipe(Effect.map((chunks) => chunks.flat()))\n }) as Service<H>[\"parallel\"]\n\n const first = ((hook: string, ...args: Array<unknown>) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"first\", handlers(hook))\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n for (const record of handlers(hook)) {\n const result = yield* runHandler(record, args)\n if (!Option.isOption(result)) {\n return yield* Effect.fail(\n new PluginError({\n code: \"invalid_hook_result\",\n message: `first hook \"${record.hook}\" in plugin \"${record.plugin}\" did not return an Option`,\n plugin: record.plugin,\n hook: record.hook\n })\n )\n }\n if (Option.isSome(result)) return result\n }\n return Option.none()\n })) as unknown as Service<H>[\"first\"]\n\n const waterfall =\n ((hook: string, initial: unknown, merge: (previous: unknown, patch: unknown) => unknown) =>\n Effect.gen(function*() {\n const mismatch = kindMismatch(resolved, hook, \"waterfall\", handlers(hook))\n if (mismatch !== undefined) return yield* Effect.fail(mismatch)\n let value = initial\n for (const record of handlers(hook)) {\n const patch = yield* runHandler(record, [value])\n if (patch !== undefined) {\n value = yield* Effect.try({\n try: () => merge(value, patch),\n catch: (cause) =>\n cause instanceof PluginError\n ? new PluginError({\n code: cause.code,\n message: cause.message,\n plugin: record.plugin,\n hook: record.hook,\n path: cause.path,\n cause\n })\n : new PluginError({\n code: \"config_invalid\",\n message: `waterfall hook \"${record.hook}\" in plugin \"${record.plugin}\" returned an invalid patch`,\n plugin: record.plugin,\n hook: record.hook,\n cause\n })\n })\n }\n }\n return value\n })) as Service<H>[\"waterfall\"]\n\n return Object.freeze({ resolved, handlers, sequential, parallel, first, waterfall })\n}\n\n/**\n * A dispatcher with no plugins at all.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const makeNoop = <H = FlowsHooks>(): Service<H> =>\n make<H>(Object.freeze({\n plugins: Object.freeze([]),\n handlers: ImmutableMap.make<string, ReadonlyArray<HandlerRecord>>(),\n kinds: engineHooks,\n parallelConcurrency: defaultParallelConcurrency\n }))\n\n/**\n * The shared dispatcher, as a service tag.\n *\n * This tag holds one dispatcher over the process-wide augmented `FlowsHooks`.\n * `declare module \"@smthrs/plugin\"` augmentation is the supported extension\n * mechanism for values placed in the tag. A host typed against a separate hook\n * interface holds its `Service<H>` directly, as `@smthrs/agent` does, and does\n * not use this tag or its layers.\n *\n * @category context\n * @since 1.0.0-rc.0\n */\nexport class Plugins extends Context.Service<Plugins, Service>()(\"flows/plugin/Plugins\") {}\n\n/**\n * Layer providing a dispatcher over an already resolved plugin list.\n *\n * This layer targets the shared augmented `FlowsHooks` catalog only. A host\n * with a separate hook interface holds its `Service<H>` directly.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layer = (resolved: Resolved): Layer.Layer<Plugins> => Layer.succeed(Plugins)(make(resolved))\n\n/**\n * Layer providing a dispatcher with no plugins.\n *\n * This layer targets the shared augmented `FlowsHooks` catalog only. A host\n * with a separate hook interface holds its `Service<H>` directly.\n *\n * @category layers\n * @since 1.0.0-rc.0\n */\nexport const layerNoop: Layer.Layer<Plugins> = Layer.succeed(Plugins)(makeNoop())\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Resolve.d.ts","sourceRoot":"","sources":["../../src/Resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAc,MAAM,YAAY,CAAA;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAI5C,OAAO,KAAK,EAAS,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,WAAW,EAAwB,MAAM,kBAAkB,CAAA;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,MAAM,CAAA;AAEjC;;;;;GAKG;AACH,eAAO,MAAM,eAAe,OAAQ,CAAA;AAEpC;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,OAAQ,CAAA;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAA;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAA;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAA;CACnD;AAED;;;;;GAKG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,UAAU;IACtC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/C,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAA;IACpE,iHAAiH;IACjH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAA;CAChE;AAED;;;;;GAKG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,GAAG,UAAU;IACrC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;IACzC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;IAClD;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;IAC3C,gHAAgH;IAChH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,gBAAgB,GAAG,SAAS,CAAA;IAC/D,2EAA2E;IAC3E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAClD;
|
|
1
|
+
{"version":3,"file":"Resolve.d.ts","sourceRoot":"","sources":["../../src/Resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/Resolve.js
CHANGED
|
@@ -73,23 +73,24 @@ const childPath = (path, key) => {
|
|
|
73
73
|
const bounded = diagnosticKey(key);
|
|
74
74
|
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(bounded) ? `${path}.${bounded}` : `${path}[${JSON.stringify(bounded)}]`;
|
|
75
75
|
};
|
|
76
|
-
const ownData = (input, path, allowed) => {
|
|
76
|
+
const ownData = (input, path, allowed, fields = {}) => {
|
|
77
77
|
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
78
|
-
throw invalidPlugin(path, "must be an ordinary record");
|
|
78
|
+
throw invalidPlugin(path, "must be an ordinary record", fields);
|
|
79
79
|
}
|
|
80
80
|
const prototype = Object.getPrototypeOf(input);
|
|
81
|
-
if (prototype !== Object.prototype && prototype !== null)
|
|
82
|
-
throw invalidPlugin(path, "must be an ordinary record");
|
|
81
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
82
|
+
throw invalidPlugin(path, "must be an ordinary record", fields);
|
|
83
|
+
}
|
|
83
84
|
const output = {};
|
|
84
85
|
for (const key of Reflect.ownKeys(input)) {
|
|
85
86
|
if (typeof key !== "string")
|
|
86
|
-
throw invalidPlugin(path, "must not contain symbol keys");
|
|
87
|
+
throw invalidPlugin(path, "must not contain symbol keys", fields);
|
|
87
88
|
if (allowed !== undefined && !allowed.has(key)) {
|
|
88
|
-
throw invalidPlugin(childPath(path, key), "contains an unknown property");
|
|
89
|
+
throw invalidPlugin(childPath(path, key), "contains an unknown property", fields);
|
|
89
90
|
}
|
|
90
91
|
const descriptor = Object.getOwnPropertyDescriptor(input, key);
|
|
91
92
|
if (descriptor === undefined || !("value" in descriptor) || !descriptor.enumerable) {
|
|
92
|
-
throw invalidPlugin(childPath(path, key), "must be an enumerable data property");
|
|
93
|
+
throw invalidPlugin(childPath(path, key), "must be an enumerable data property", fields);
|
|
93
94
|
}
|
|
94
95
|
Object.defineProperty(output, key, { value: descriptor.value, enumerable: true });
|
|
95
96
|
}
|
|
@@ -142,7 +143,7 @@ const snapshotHook = (entry, path, plugin, hook) => {
|
|
|
142
143
|
if (entry === undefined) {
|
|
143
144
|
throw invalidPlugin(path, "must be a function or a hook object", { plugin, hook });
|
|
144
145
|
}
|
|
145
|
-
const values = ownData(entry, path, new Set(["order", "handler"]));
|
|
146
|
+
const values = ownData(entry, path, new Set(["order", "handler"]), { plugin, hook });
|
|
146
147
|
if (typeof values.handler !== "function") {
|
|
147
148
|
throw invalidPlugin(`${path}.handler`, "must be a function", { plugin, hook });
|
|
148
149
|
}
|
|
@@ -173,11 +174,11 @@ const snapshotPlugin = (input, path) => {
|
|
|
173
174
|
}
|
|
174
175
|
let hooks;
|
|
175
176
|
if (values.hooks !== undefined) {
|
|
176
|
-
const rawHooks = ownData(values.hooks, `${path}.hooks
|
|
177
|
+
const rawHooks = ownData(values.hooks, `${path}.hooks`, undefined, { plugin: name });
|
|
177
178
|
const snapshot = Object.create(null);
|
|
178
179
|
for (const [index, hook] of Object.keys(rawHooks).entries()) {
|
|
179
180
|
if (!validName(hook)) {
|
|
180
|
-
throw invalidPlugin(`${path}.hooks[${index}]`, "contains an invalid hook name");
|
|
181
|
+
throw invalidPlugin(`${path}.hooks[${index}]`, "contains an invalid hook name", { plugin: name });
|
|
181
182
|
}
|
|
182
183
|
const entry = rawHooks[hook];
|
|
183
184
|
Object.defineProperty(snapshot, hook, {
|
package/dist/esm/Resolve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Resolve.js","sourceRoot":"","sources":["../../src/Resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,YAAY,MAAM,+BAA+B,CAAA;AAE7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAE5D,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAA;AAEjF,OAAO,EAAE,WAAW,EAAwB,MAAM,kBAAkB,CAAA;AAEpE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAA;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AAEjC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAA;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAA;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAA;AAE5C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAA;AA4D7C,MAAM,OAAO,GAAG,CACd,IAAqB,EACrB,OAAe,EACf,IAAY,EACZ,SAA+D,EAAE,EACpD,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;AAErE,MAAM,aAAa,GAAG,CACpB,IAAY,EACZ,SAAiB,EACjB,SAA+D,EAAE,EACpD,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;AAEtF,2EAA2E;AAC3E,0DAA0D;AAC1D,MAAM,aAAa,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAA;AAE/F,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,GAAW,EAAU,EAAE;IACtD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;IAClC,OAAO,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAA;AAClH,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CACd,KAAc,EACd,IAAY,EACZ,OAA6B,EACM,EAAE;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,aAAa,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAA;IACzD,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAC9C,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI;QAAE,MAAM,aAAa,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAA;IACjH,MAAM,MAAM,GAA4B,EAAE,CAAA;IAC1C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,MAAM,aAAa,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAA;QACtF,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,8BAA8B,CAAC,CAAA;QAC3E,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC9D,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACnF,MAAM,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,qCAAqC,CAAC,CAAA;QAClF,CAAC;QACD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IACnF,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,KAAc,EAAc,EAAE;IACrD,MAAM,MAAM,GAAG,OAAO,CACpB,KAAK,EACL,UAAU,EACV,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,CAAC,CAAC,CAClF,CAAA;IACD,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;KAChD,CAAA;AACH,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,KAAc,EAAmB,EAAE,CACpD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,uBAAuB;IACxF,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAErF,MAAM,eAAe,GAAG,CAAC,KAAc,EAAsC,EAAE;IAC7E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,aAAa,CAAC,gBAAgB,EAAE,kCAAkC,CAAC,CAAA;IAC3E,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;IAC9C,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACzD,MAAM,aAAa,CAAC,gBAAgB,EAAE,kCAAkC,CAAC,CAAA;IAC3E,CAAC;IACD,MAAM,MAAM,GAA6B,EAAE,CAAA;IAC3C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,aAAa,CAAC,gBAAgB,EAAE,+BAA+B,CAAC,CAAA;QACxE,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QAC9D,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YACnF,MAAM,aAAa,CAAC,SAAS,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,qCAAqC,CAAC,CAAA;QAC9F,CAAC;QACD,IAAI,CAAE,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAA4B,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7G,MAAM,aAAa,CAAC,SAAS,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,+BAA+B,CAAC,CAAA;QACxF,CAAC;QACD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IACnF,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAA4C,EAAE,CAAC;QACvF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACtE,MAAM,OAAO,CACX,oBAAoB,EACpB,qCAAqC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OACvD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAC7B,iCAAiC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,EACpE,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,EACjC,EAAE,IAAI,EAAE,CACT,CAAA;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AAC9B,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CACnB,KAAc,EACd,IAAY,EACZ,MAAc,EACd,IAAY,EACuE,EAAE;IACrF,IAAI,OAAO,KAAK,KAAK,UAAU;QAAE,OAAO,KAAyC,CAAA;IACjF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,aAAa,CAAC,IAAI,EAAE,qCAAqC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IACpF,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IAClE,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACzC,MAAM,aAAa,CAAC,GAAG,IAAI,UAAU,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAChF,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QACpF,MAAM,aAAa,CAAC,GAAG,IAAI,QAAQ,EAAE,qBAAqB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/E,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAiD,CAAA;AACpD,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CACrB,KAAc,EACd,IAAY,EACI,EAAE;IAClB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IACvG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,MAAM,aAAa,CAAC,GAAG,IAAI,OAAO,EAAE,mCAAmC,CAAC,CAAA;IACrG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;IACxB,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/D,MAAM,aAAa,CAAC,GAAG,IAAI,UAAU,EAAE,sCAAsC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IAClG,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC1F,MAAM,aAAa,CAAC,GAAG,IAAI,UAAU,EAAE,qBAAqB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IACjF,CAAC;IACD,IACE,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;QACrF,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU;QAClC,MAAM,aAAa,CAAC,GAAG,IAAI,QAAQ,EAAE,yCAAyC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IACnG,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,aAAa,CAAC,GAAG,IAAI,QAAQ,EAAE,yBAAyB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;IACnF,CAAC;IAED,IAAI,KAAoD,CAAA;IACxD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAA;QACvD,MAAM,QAAQ,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC7D,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,aAAa,CAAC,GAAG,IAAI,UAAU,KAAK,GAAG,EAAE,+BAA+B,CAAC,CAAA;YACjF,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC5B,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE;gBACpC,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,IAAI,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;gBACxE,UAAU,EAAE,IAAI;aACjB,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACjC,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI;QACJ,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAc,EAAE,CAAC;QACvE,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAqC,EAAE,CAAC;QAC9F,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAmB,EAAE,CAAC;KAC/D,CAAC,CAAA;AACJ,CAAC,CAAA;AAOD,MAAM,OAAO,GAAG,CAAI,KAAc,EAAoC,EAAE;IACtE,MAAM,MAAM,GAA6B,EAAE,CAAA;IAC3C,MAAM,MAAM,GAAG,IAAI,OAAO,EAAU,CAAA;IACpC,MAAM,KAAK,GAAsF;QAC/F,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE;KACtC,CAAA;IACD,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAG,CAAA;QAC5B,KAAK,IAAI,CAAC,CAAA;QACV,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,SAAQ;QAC9F,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,OAAO,CAAC,KAAK,IAAI,kBAAkB,EAAE,CAAC;gBACxC,MAAM,OAAO,CAAC,gBAAgB,EAAE,2CAA2C,kBAAkB,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YAChH,CAAC;YACD,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,2CAA2C,CAAC,CAAA;YAC7G,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACzB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAA;YACnC,uEAAuE;YACvE,yEAAyE;YACzE,IAAI,MAAM,GAAG,uBAAuB,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC5D,MAAM,OAAO,CAAC,gBAAgB,EAAE,4BAA4B,uBAAuB,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;YACjH,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3D,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,uDAAuD,CAAC,CAAA;YAC5F,CAAC;YACD,KAAK,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBACjD,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBAChF,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;oBACnF,MAAM,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE,qCAAqC,CAAC,CAAA;gBACzF,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAA;YACtG,CAAC;YACD,SAAQ;QACV,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,cAAc,CAAI,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAC1G,IAAI,MAAM,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;YACnC,MAAM,OAAO,CAAC,gBAAgB,EAAE,4BAA4B,cAAc,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAC1G,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CACf,EAAE,IAAI,EAAE,MAAM,EAAqB,EACnC,MAAmB,EACnB,MAA4B,EACS,EAAE;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAC1B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,IAAI,OAAO,KAAK,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,CAAA;IACxE,OAAO,MAAM,CAAC,GAAG,CAAC;QAChB,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;QACxB,KAAK,EAAE,GAAG,EAAE,CACV,OAAO,CAAC,cAAc,EAAE,WAAW,MAAM,CAAC,IAAI,0BAA0B,EAAE,GAAG,IAAI,QAAQ,EAAE;YACzF,MAAM,EAAE,MAAM,CAAC,IAAI;SACpB,CAAC;KACL,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACxB,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACxB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,QAAQ,EAAE,iCAAiC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAC5G,CACF,CAAA;AACH,CAAC,CAAA;AAED,MAAM,IAAI,GAAG,CAAC,OAAmC,EAAU,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAElH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,KAA8B,EAC9B,UAA+B,EAAE,EACjC,cAA4B,EACa,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAC5B,GAAG,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC;QACnC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,KAAK,YAAY,WAAW;YAC1B,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,oDAAoD,CAAC;KACtF,CAAC,CAAA;IACF,IAAI,cAAc,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CACrC,iBAAiB,EACjB,oEAAoE,CACrE,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACpF,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,2BAA2B,CAAC,CAAC,CAAA;IAC1F,CAAC;IACD,IACE,GAAG,CAAC,mBAAmB,KAAK,SAAS;QACrC,CAAC,OAAO,GAAG,CAAC,mBAAmB,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,mBAAmB,CAAC;YAC5F,GAAG,CAAC,mBAAmB,IAAI,CAAC;YAC5B,GAAG,CAAC,mBAAmB,GAAG,0BAA0B,CAAC,EACvD,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAC/B,gBAAgB,EAChB,8CAA8C,0BAA0B,EAAE,EAC1E,8BAA8B,CAC/B,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,mBAAmB,GAAG,GAAG,CAAC,mBAAmB,KAAK,SAAS;QAC/D,CAAC,CAAC,0BAA0B;QAC5B,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAA;IAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAC9B,GAAG,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC;QACpD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,KAAK,YAAY,WAAW;YAC1B,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,aAAa,CAAC,gBAAgB,EAAE,oDAAoD,CAAC;KAC5F,CAAC,CAAA;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACjC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAI,KAAK,CAAC;QAC5B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,KAAK,YAAY,WAAW;YAC1B,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,oDAAoD,CAAC;KAC/E,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAA;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAE3F,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAsD,CAAA;QACjF,IAAI,WAAW,KAAK,SAAS;YAAE,SAAQ;QACvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAC/B,cAAc,EACd,UAAU,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EACpG,SAAS,CAAC,GAAG,IAAI,QAAQ,EAAE,IAAI,CAAC,EAChC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAC9B,CAAC,CAAA;YACJ,CAAC;YACD,YAAY,IAAI,CAAC,CAAA;YACjB,IAAI,YAAY,GAAG,eAAe,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAC/B,gBAAgB,EAChB,uCAAuC,eAAe,EAAE,EACxD,SAAS,CAAC,GAAG,IAAI,QAAQ,EAAE,IAAI,CAAC,CACjC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAC/B,gBAAgB,EAChB,0BAA0B,MAAM,CAAC,IAAI,GAAG,EACxC,GAAG,IAAI,OAAO,EACd,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CACxB,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC;IAED,MAAM,cAAc,GAAG,QAAQ;SAC5B,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SACzC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAC/F;SACA,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAA;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACzE,MAAM,OAAO,GAA2D,EAAE,CAAA;IAC1E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,OAAO,GAKR,EAAE,CAAA;QACP,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAsD,CAAA;YACjF,IAAI,WAAW,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC;gBAAE,SAAQ;YAC5E,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;YAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACtF,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;QACrG,CAAC;QACD,yEAAyE;QACzE,2EAA2E;QAC3E,2EAA2E;QAC3E,wCAAwC;QACxC,MAAM,OAAO,GAAG,OAAO;aACpB,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CACrG;aACA,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAA;QAC9B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACtE,CAAC;IACD,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,wBAAwB,CAAC,GAAG,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAA;IAC9F,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO;QACP,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QACpC,KAAK,EAAE,KAAK;QACZ,mBAAmB;QACnB,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;KAChE,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEJ;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAI,QAAqB,EAAsC,EAAE,CACpF,iBAAiB,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAA","sourcesContent":["/**\n * Bounded plugin resolution: admit, filter, validate, order, and snapshot.\n *\n * The resulting catalog owns every record it exposes. Dispatch never reads a\n * caller-owned map, plugin record, hook object, config value, or cache identity.\n *\n * @since 1.0.0-rc.0\n */\n\nimport * as ImmutableMap from \"@smthrs/canonical/ReadonlyMap\"\nimport type { Action } from \"@smthrs/flow\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport type { FlowsConfig } from \"./Config.ts\"\nimport * as Config from \"./Config.ts\"\nimport type { HookCatalog, HookKind, HookObject } from \"./Hooks.ts\"\nimport { engineHooks, handlerOf, orderOf } from \"./Hooks.ts\"\nimport type { FlowsHooks } from \"./index.ts\"\nimport * as Boundary from \"./internal/Boundary.ts\"\nimport { mergePluginLayers } from \"./internal/mergePluginLayers.ts\"\nimport { snapshotCacheEnvironment } from \"./internal/snapshotCacheEnvironment.ts\"\nimport type { Apply, FlowsPlugin, PluginInput } from \"./Plugin.ts\"\nimport { PluginError, type PluginErrorCode } from \"./PluginError.ts\"\n\n/**\n * Maximum nested preset-array depth accepted at startup.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginDepth = 64\n\n/**\n * Maximum plugins accepted by one kernel.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPlugins = 256\n\n/**\n * Maximum aggregate hook handlers accepted by one kernel.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumHandlers = 1_024\n\n/**\n * Maximum input nodes, including arrays and omitted entries.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginInputNodes = 4_096\n\n/**\n * Maximum UTF-16 length of one plugin or hook name.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginNameLength = 256\n\n/**\n * Default fiber bound for parallel observers.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const defaultParallelConcurrency = 16\n\n/**\n * Maximum configurable parallel-observer bound.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumParallelConcurrency = 256\n\n/**\n * One resolved handler with immutable attribution.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface HandlerRecord {\n readonly plugin: string\n readonly hook: string\n readonly handler: (...args: Array<any>) => unknown\n}\n\n/**\n * The immutable output of plugin resolution.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Resolved<H = FlowsHooks> {\n readonly plugins: ReadonlyArray<FlowsPlugin<H>>\n readonly handlers: ReadonlyMap<string, ReadonlyArray<HandlerRecord>>\n /** The frozen runtime catalog this resolution admitted. Dispatch refuses a method whose kind differs from it. */\n readonly kinds: Readonly<Record<string, HookKind>>\n readonly parallelConcurrency: number\n readonly cacheEnvironment?: Action.CacheEnvironment | undefined\n}\n\n/**\n * Options for {@link resolve}.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Options<H = FlowsHooks> {\n /** Pre-resolution config tested by `apply` predicates. */\n readonly config?: FlowsConfig | undefined\n /** Host whose literal `apply` selectors are active. Defaults to `\"engine\"`. */\n readonly target?: \"engine\" | \"harness\" | undefined\n /**\n * Hook names recognized by this host, each with the kind `H` declares for\n * it. The shared `config` and `configResolved` hooks are fixed to\n * `waterfall` and `parallel`; another kind fails with `hook_kind_mismatch`.\n */\n readonly hooks?: HookCatalog<H> | undefined\n /** Complete composition identity for sealed activity keys. Requires every selected plugin to have a version. */\n readonly cacheEnvironment?: Action.CacheEnvironment | undefined\n /** Maximum observers run at once. Defaults to 16 and cannot exceed 256. */\n readonly parallelConcurrency?: number | undefined\n}\n\ninterface RawOptions {\n readonly config: unknown\n readonly target: unknown\n readonly hooks: unknown\n readonly cacheEnvironment: unknown\n readonly parallelConcurrency: unknown\n}\n\nconst failure = (\n code: PluginErrorCode,\n message: string,\n path: string,\n fields: { readonly plugin?: string; readonly hook?: string } = {}\n): PluginError => new PluginError({ code, message, path, ...fields })\n\nconst invalidPlugin = (\n path: string,\n complaint: string,\n fields: { readonly plugin?: string; readonly hook?: string } = {}\n): PluginError => failure(\"invalid_plugin\", `plugin input ${complaint}`, path, fields)\n\n// Bound before quoting or scanning caller-controlled keys. Keep Boundary's\n// identifier/dot and JSON-quoted/bracket path convention.\nconst diagnosticKey = (key: string): string => key.length > 64 ? `${key.slice(0, 64)}...` : key\n\nconst childPath = (path: string, key: string): string => {\n const bounded = diagnosticKey(key)\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(bounded) ? `${path}.${bounded}` : `${path}[${JSON.stringify(bounded)}]`\n}\n\nconst ownData = (\n input: unknown,\n path: string,\n allowed?: ReadonlySet<string>\n): Readonly<Record<string, unknown>> => {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw invalidPlugin(path, \"must be an ordinary record\")\n }\n const prototype = Object.getPrototypeOf(input)\n if (prototype !== Object.prototype && prototype !== null) throw invalidPlugin(path, \"must be an ordinary record\")\n const output: Record<string, unknown> = {}\n for (const key of Reflect.ownKeys(input)) {\n if (typeof key !== \"string\") throw invalidPlugin(path, \"must not contain symbol keys\")\n if (allowed !== undefined && !allowed.has(key)) {\n throw invalidPlugin(childPath(path, key), \"contains an unknown property\")\n }\n const descriptor = Object.getOwnPropertyDescriptor(input, key)\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(childPath(path, key), \"must be an enumerable data property\")\n }\n Object.defineProperty(output, key, { value: descriptor.value, enumerable: true })\n }\n return output\n}\n\nconst snapshotOptions = (input: unknown): RawOptions => {\n const values = ownData(\n input,\n \"$options\",\n new Set([\"config\", \"target\", \"hooks\", \"cacheEnvironment\", \"parallelConcurrency\"])\n )\n return {\n config: values.config,\n target: values.target,\n hooks: values.hooks,\n cacheEnvironment: values.cacheEnvironment,\n parallelConcurrency: values.parallelConcurrency\n }\n}\n\nconst validName = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0 && value.length <= maximumPluginNameLength &&\n Boundary.isWellFormedText(value) && !/^\\s*$/u.test(value) && !/\\p{Cc}/u.test(value)\n\nconst snapshotCatalog = (input: unknown): Readonly<Record<string, HookKind>> => {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw invalidPlugin(\"$options.hooks\", \"must be an ordinary hook catalog\")\n }\n const prototype = Object.getPrototypeOf(input)\n if (prototype !== Object.prototype && prototype !== null) {\n throw invalidPlugin(\"$options.hooks\", \"must be an ordinary hook catalog\")\n }\n const output: Record<string, HookKind> = {}\n for (const key of Reflect.ownKeys(input)) {\n if (typeof key !== \"string\" || !validName(key)) {\n throw invalidPlugin(\"$options.hooks\", \"contains an invalid hook name\")\n }\n const descriptor = Object.getOwnPropertyDescriptor(input, key)\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(childPath(\"$options.hooks\", key), \"must be an enumerable data property\")\n }\n if (!([\"sequential\", \"parallel\", \"first\", \"waterfall\"] as ReadonlyArray<unknown>).includes(descriptor.value)) {\n throw invalidPlugin(childPath(\"$options.hooks\", key), \"contains an invalid hook kind\")\n }\n Object.defineProperty(output, key, { value: descriptor.value, enumerable: true })\n }\n for (const hook of Object.keys(engineHooks) as ReadonlyArray<keyof typeof engineHooks>) {\n if (Object.hasOwn(output, hook) && output[hook] !== engineHooks[hook]) {\n throw failure(\n \"hook_kind_mismatch\",\n `hook catalog declares shared hook ${JSON.stringify(hook)} as ${\n JSON.stringify(output[hook])\n }, the kernel dispatches it as ${JSON.stringify(engineHooks[hook])}`,\n childPath(\"$options.hooks\", hook),\n { hook }\n )\n }\n }\n return Object.freeze(output)\n}\n\nconst snapshotHook = (\n entry: unknown,\n path: string,\n plugin: string,\n hook: string\n): ((...args: Array<any>) => unknown) | HookObject<(...args: Array<any>) => unknown> => {\n if (typeof entry === \"function\") return entry as (...args: Array<any>) => unknown\n if (entry === undefined) {\n throw invalidPlugin(path, \"must be a function or a hook object\", { plugin, hook })\n }\n const values = ownData(entry, path, new Set([\"order\", \"handler\"]))\n if (typeof values.handler !== \"function\") {\n throw invalidPlugin(`${path}.handler`, \"must be a function\", { plugin, hook })\n }\n if (values.order !== undefined && values.order !== \"pre\" && values.order !== \"post\") {\n throw invalidPlugin(`${path}.order`, \"must be pre or post\", { plugin, hook })\n }\n return Object.freeze({\n ...(values.order === undefined ? {} : { order: values.order }),\n handler: values.handler\n }) as HookObject<(...args: Array<any>) => unknown>\n}\n\nconst snapshotPlugin = <H>(\n input: unknown,\n path: string\n): FlowsPlugin<H> => {\n const values = ownData(input, path, new Set([\"name\", \"version\", \"enforce\", \"apply\", \"layer\", \"hooks\"]))\n if (!validName(values.name)) throw invalidPlugin(`${path}.name`, \"requires a bounded non-empty name\")\n const name = values.name\n if (values.version !== undefined && !validName(values.version)) {\n throw invalidPlugin(`${path}.version`, \"requires a bounded non-empty version\", { plugin: name })\n }\n if (values.enforce !== undefined && values.enforce !== \"pre\" && values.enforce !== \"post\") {\n throw invalidPlugin(`${path}.enforce`, \"must be pre or post\", { plugin: name })\n }\n if (\n values.apply !== undefined && values.apply !== \"engine\" && values.apply !== \"harness\" &&\n typeof values.apply !== \"function\"\n ) throw invalidPlugin(`${path}.apply`, \"must be engine, harness, or a predicate\", { plugin: name })\n if (values.layer !== undefined && !Layer.isLayer(values.layer)) {\n throw invalidPlugin(`${path}.layer`, \"must be an Effect Layer\", { plugin: name })\n }\n\n let hooks: Readonly<Record<string, unknown>> | undefined\n if (values.hooks !== undefined) {\n const rawHooks = ownData(values.hooks, `${path}.hooks`)\n const snapshot: Record<string, unknown> = Object.create(null)\n for (const [index, hook] of Object.keys(rawHooks).entries()) {\n if (!validName(hook)) {\n throw invalidPlugin(`${path}.hooks[${index}]`, \"contains an invalid hook name\")\n }\n const entry = rawHooks[hook]\n Object.defineProperty(snapshot, hook, {\n value: snapshotHook(entry, childPath(`${path}.hooks`, hook), name, hook),\n enumerable: true\n })\n }\n hooks = Object.freeze(snapshot)\n }\n\n return Object.freeze({\n name,\n ...(values.version === undefined ? {} : { version: values.version }),\n ...(values.enforce === undefined ? {} : { enforce: values.enforce }),\n ...(values.apply === undefined ? {} : { apply: values.apply as Apply }),\n ...(values.layer === undefined ? {} : { layer: values.layer as Layer.Layer<never, any, any> }),\n ...(hooks === undefined ? {} : { hooks: hooks as Partial<H> })\n })\n}\n\ninterface AdmittedPlugin<H> {\n readonly plugin: FlowsPlugin<H>\n readonly path: string\n}\n\nconst flatten = <H>(input: unknown): ReadonlyArray<AdmittedPlugin<H>> => {\n const output: Array<AdmittedPlugin<H>> = []\n const arrays = new WeakSet<object>()\n const stack: Array<{ readonly value: unknown; readonly path: string; readonly depth: number }> = [\n { value: input, path: \"$\", depth: 0 }\n ]\n let nodes = 0\n while (stack.length > 0) {\n const current = stack.pop()!\n nodes += 1\n if (current.value === false || current.value === null || current.value === undefined) continue\n if (Array.isArray(current.value)) {\n if (current.depth >= maximumPluginDepth) {\n throw failure(\"resource_limit\", `plugin input exceeds the depth limit of ${maximumPluginDepth}`, current.path)\n }\n if (arrays.has(current.value)) throw invalidPlugin(current.path, \"contains a cycle or repeated preset array\")\n arrays.add(current.value)\n const length = current.value.length\n // Every queued frame and array element costs a node, including omitted\n // entries. Refuse before enumerating keys, descriptors, or child frames.\n if (length > maximumPluginInputNodes - nodes - stack.length) {\n throw failure(\"resource_limit\", `plugin input exceeds the ${maximumPluginInputNodes}-node limit`, current.path)\n }\n const keys = Reflect.ownKeys(current.value)\n if (keys.length !== length + 1 || !keys.includes(\"length\")) {\n throw invalidPlugin(current.path, \"must be a dense preset array with no extra properties\")\n }\n for (let index = length - 1; index >= 0; index--) {\n const descriptor = Object.getOwnPropertyDescriptor(current.value, String(index))\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(`${current.path}[${index}]`, \"must be an enumerable data property\")\n }\n stack.push({ value: descriptor.value, path: `${current.path}[${index}]`, depth: current.depth + 1 })\n }\n continue\n }\n output.push(Object.freeze({ plugin: snapshotPlugin<H>(current.value, current.path), path: current.path }))\n if (output.length > maximumPlugins) {\n throw failure(\"resource_limit\", `plugin input exceeds the ${maximumPlugins}-plugin limit`, current.path)\n }\n }\n return output\n}\n\nconst included = <H>(\n { path, plugin }: AdmittedPlugin<H>,\n config: FlowsConfig,\n target: \"engine\" | \"harness\"\n): Effect.Effect<boolean, PluginError> => {\n const apply = plugin.apply\n if (apply === undefined) return Effect.succeed(true)\n if (typeof apply !== \"function\") return Effect.succeed(apply === target)\n return Effect.try({\n try: () => apply(config),\n catch: () =>\n failure(\"apply_failed\", `plugin \"${plugin.name}\" apply predicate failed`, `${path}.apply`, {\n plugin: plugin.name\n })\n }).pipe(\n Effect.flatMap((result) =>\n typeof result === \"boolean\"\n ? Effect.succeed(result)\n : Effect.fail(invalidPlugin(`${path}.apply`, \"predicate must return a boolean\", { plugin: plugin.name }))\n )\n )\n}\n\nconst rank = (enforce: \"pre\" | \"post\" | undefined): number => (enforce === \"pre\" ? 0 : enforce === \"post\" ? 2 : 1)\n\n/**\n * Resolves a plugin preset into an immutable, resource-bounded catalog.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const resolve = <H = FlowsHooks>(\n input: PluginInput<NoInfer<H>>,\n options: Options<NoInfer<H>> = {},\n configOverride?: FlowsConfig\n): Effect.Effect<Resolved<H>, PluginError> =>\n Effect.gen(function*() {\n const raw = yield* Effect.try({\n try: () => snapshotOptions(options),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$options\", \"could not be inspected without executing user code\")\n })\n if (configOverride !== undefined && raw.config !== undefined) {\n return yield* Effect.fail(invalidPlugin(\n \"$options.config\",\n \"cannot declare config in options alongside the positional override\"\n ))\n }\n if (raw.target !== undefined && raw.target !== \"engine\" && raw.target !== \"harness\") {\n return yield* Effect.fail(invalidPlugin(\"$options.target\", \"must be engine or harness\"))\n }\n if (\n raw.parallelConcurrency !== undefined &&\n (typeof raw.parallelConcurrency !== \"number\" || !Number.isSafeInteger(raw.parallelConcurrency) ||\n raw.parallelConcurrency <= 0 ||\n raw.parallelConcurrency > maximumParallelConcurrency)\n ) {\n return yield* Effect.fail(failure(\n \"resource_limit\",\n `parallel concurrency must be between 1 and ${maximumParallelConcurrency}`,\n \"$options.parallelConcurrency\"\n ))\n }\n const parallelConcurrency = raw.parallelConcurrency === undefined\n ? defaultParallelConcurrency\n : raw.parallelConcurrency\n const config = yield* Config.snapshot(configOverride ?? raw.config ?? {})\n const known = yield* Effect.try({\n try: () => snapshotCatalog(raw.hooks ?? engineHooks),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$options.hooks\", \"could not be inspected without executing user code\")\n })\n const admitted = yield* Effect.try({\n try: () => flatten<H>(input),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$\", \"could not be inspected without executing user code\")\n })\n const target = raw.target ?? \"engine\"\n const selected = yield* Effect.filter(admitted, (entry) => included(entry, config, target))\n\n let handlerCount = 0\n for (const { path, plugin } of selected) {\n const pluginHooks = plugin.hooks as Readonly<Record<string, unknown>> | undefined\n if (pluginHooks === undefined) continue\n for (const hook of Object.keys(pluginHooks)) {\n if (!Object.hasOwn(known, hook)) {\n return yield* Effect.fail(failure(\n \"unknown_hook\",\n `plugin ${JSON.stringify(plugin.name)} declares unknown hook ${JSON.stringify(diagnosticKey(hook))}`,\n childPath(`${path}.hooks`, hook),\n { plugin: plugin.name, hook }\n ))\n }\n handlerCount += 1\n if (handlerCount > maximumHandlers) {\n return yield* Effect.fail(failure(\n \"resource_limit\",\n `plugin handlers exceed the limit of ${maximumHandlers}`,\n childPath(`${path}.hooks`, hook)\n ))\n }\n }\n }\n\n const seen = new Set<string>()\n for (const { path, plugin } of selected) {\n if (seen.has(plugin.name)) {\n return yield* Effect.fail(failure(\n \"duplicate_name\",\n `duplicate plugin name \"${plugin.name}\"`,\n `${path}.name`,\n { plugin: plugin.name }\n ))\n }\n seen.add(plugin.name)\n }\n\n const orderedEntries = selected\n .map((entry, index) => ({ entry, index }))\n .sort((left, right) =>\n rank(left.entry.plugin.enforce) - rank(right.entry.plugin.enforce) || left.index - right.index\n )\n .map(({ entry }) => entry)\n const plugins = Object.freeze(orderedEntries.map(({ plugin }) => plugin))\n const entries: Array<readonly [string, ReadonlyArray<HandlerRecord>]> = []\n for (const hook of Object.keys(known)) {\n const records: Array<{\n readonly record: HandlerRecord\n readonly enforceRank: number\n readonly orderRank: number\n readonly index: number\n }> = []\n for (const [index, plugin] of plugins.entries()) {\n const pluginHooks = plugin.hooks as Readonly<Record<string, unknown>> | undefined\n if (pluginHooks === undefined || !Object.hasOwn(pluginHooks, hook)) continue\n const entry = pluginHooks[hook]\n const record = Object.freeze({ plugin: plugin.name, hook, handler: handlerOf(entry) })\n records.push({ record, enforceRank: rank(plugin.enforce), orderRank: rank(orderOf(entry)), index })\n }\n // Vite's rule, verbatim: the per-hook `order` is the outer partition and\n // the enforce-sorted plugin list supplies the stable order inside it, so a\n // hook marked `order: \"pre\"` runs ahead of every normal-order handler even\n // when its plugin is `enforce: \"post\"`.\n const ordered = records\n .sort((left, right) =>\n left.orderRank - right.orderRank || left.enforceRank - right.enforceRank || left.index - right.index\n )\n .map(({ record }) => record)\n if (ordered.length > 0) entries.push([hook, Object.freeze(ordered)])\n }\n const cacheEnvironment = yield* snapshotCacheEnvironment(raw.cacheEnvironment, orderedEntries)\n return Object.freeze({\n plugins,\n handlers: ImmutableMap.make(entries),\n kinds: known,\n parallelConcurrency,\n ...(cacheEnvironment === undefined ? {} : { cacheEnvironment })\n })\n })\n\n/**\n * Merges every resolved plugin layer left-to-right and supplies the detached\n * cache environment captured during resolution.\n *\n * @category combinators\n * @since 1.0.0-rc.0\n */\nexport const layer = <H>(resolved: Resolved<H>): Layer.Layer<any, PluginError, any> =>\n mergePluginLayers(resolved.plugins, resolved.cacheEnvironment)\n"]}
|
|
1
|
+
{"version":3,"file":"Resolve.js","sourceRoot":"","sources":["../../src/Resolve.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Bounded plugin resolution: admit, filter, validate, order, and snapshot.\n *\n * The resulting catalog owns every record it exposes. Dispatch never reads a\n * caller-owned map, plugin record, hook object, config value, or cache identity.\n *\n * @since 1.0.0-rc.0\n */\n\nimport * as ImmutableMap from \"@smthrs/canonical/ReadonlyMap\"\nimport type { Action } from \"@smthrs/flow\"\nimport * as Effect from \"effect/Effect\"\nimport * as Layer from \"effect/Layer\"\nimport type { FlowsConfig } from \"./Config.ts\"\nimport * as Config from \"./Config.ts\"\nimport type { HookCatalog, HookKind, HookObject } from \"./Hooks.ts\"\nimport { engineHooks, handlerOf, orderOf } from \"./Hooks.ts\"\nimport type { FlowsHooks } from \"./index.ts\"\nimport * as Boundary from \"./internal/Boundary.ts\"\nimport { mergePluginLayers } from \"./internal/mergePluginLayers.ts\"\nimport { snapshotCacheEnvironment } from \"./internal/snapshotCacheEnvironment.ts\"\nimport type { Apply, FlowsPlugin, PluginInput } from \"./Plugin.ts\"\nimport { PluginError, type PluginErrorCode } from \"./PluginError.ts\"\n\n/**\n * Maximum nested preset-array depth accepted at startup.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginDepth = 64\n\n/**\n * Maximum plugins accepted by one kernel.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPlugins = 256\n\n/**\n * Maximum aggregate hook handlers accepted by one kernel.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumHandlers = 1_024\n\n/**\n * Maximum input nodes, including arrays and omitted entries.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginInputNodes = 4_096\n\n/**\n * Maximum UTF-16 length of one plugin or hook name.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumPluginNameLength = 256\n\n/**\n * Default fiber bound for parallel observers.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const defaultParallelConcurrency = 16\n\n/**\n * Maximum configurable parallel-observer bound.\n *\n * @category limits\n * @since 1.0.0-rc.0\n */\nexport const maximumParallelConcurrency = 256\n\n/**\n * One resolved handler with immutable attribution.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface HandlerRecord {\n readonly plugin: string\n readonly hook: string\n readonly handler: (...args: Array<any>) => unknown\n}\n\n/**\n * The immutable output of plugin resolution.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Resolved<H = FlowsHooks> {\n readonly plugins: ReadonlyArray<FlowsPlugin<H>>\n readonly handlers: ReadonlyMap<string, ReadonlyArray<HandlerRecord>>\n /** The frozen runtime catalog this resolution admitted. Dispatch refuses a method whose kind differs from it. */\n readonly kinds: Readonly<Record<string, HookKind>>\n readonly parallelConcurrency: number\n readonly cacheEnvironment?: Action.CacheEnvironment | undefined\n}\n\n/**\n * Options for {@link resolve}.\n *\n * @category models\n * @since 1.0.0-rc.0\n */\nexport interface Options<H = FlowsHooks> {\n /** Pre-resolution config tested by `apply` predicates. */\n readonly config?: FlowsConfig | undefined\n /** Host whose literal `apply` selectors are active. Defaults to `\"engine\"`. */\n readonly target?: \"engine\" | \"harness\" | undefined\n /**\n * Hook names recognized by this host, each with the kind `H` declares for\n * it. The shared `config` and `configResolved` hooks are fixed to\n * `waterfall` and `parallel`; another kind fails with `hook_kind_mismatch`.\n */\n readonly hooks?: HookCatalog<H> | undefined\n /** Complete composition identity for sealed activity keys. Requires every selected plugin to have a version. */\n readonly cacheEnvironment?: Action.CacheEnvironment | undefined\n /** Maximum observers run at once. Defaults to 16 and cannot exceed 256. */\n readonly parallelConcurrency?: number | undefined\n}\n\ninterface RawOptions {\n readonly config: unknown\n readonly target: unknown\n readonly hooks: unknown\n readonly cacheEnvironment: unknown\n readonly parallelConcurrency: unknown\n}\n\nconst failure = (\n code: PluginErrorCode,\n message: string,\n path: string,\n fields: { readonly plugin?: string; readonly hook?: string } = {}\n): PluginError => new PluginError({ code, message, path, ...fields })\n\nconst invalidPlugin = (\n path: string,\n complaint: string,\n fields: { readonly plugin?: string; readonly hook?: string } = {}\n): PluginError => failure(\"invalid_plugin\", `plugin input ${complaint}`, path, fields)\n\n// Bound before quoting or scanning caller-controlled keys. Keep Boundary's\n// identifier/dot and JSON-quoted/bracket path convention.\nconst diagnosticKey = (key: string): string => key.length > 64 ? `${key.slice(0, 64)}...` : key\n\nconst childPath = (path: string, key: string): string => {\n const bounded = diagnosticKey(key)\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(bounded) ? `${path}.${bounded}` : `${path}[${JSON.stringify(bounded)}]`\n}\n\nconst ownData = (\n input: unknown,\n path: string,\n allowed?: ReadonlySet<string>,\n fields: { readonly plugin?: string; readonly hook?: string } = {}\n): Readonly<Record<string, unknown>> => {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw invalidPlugin(path, \"must be an ordinary record\", fields)\n }\n const prototype = Object.getPrototypeOf(input)\n if (prototype !== Object.prototype && prototype !== null) {\n throw invalidPlugin(path, \"must be an ordinary record\", fields)\n }\n const output: Record<string, unknown> = {}\n for (const key of Reflect.ownKeys(input)) {\n if (typeof key !== \"string\") throw invalidPlugin(path, \"must not contain symbol keys\", fields)\n if (allowed !== undefined && !allowed.has(key)) {\n throw invalidPlugin(childPath(path, key), \"contains an unknown property\", fields)\n }\n const descriptor = Object.getOwnPropertyDescriptor(input, key)\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(childPath(path, key), \"must be an enumerable data property\", fields)\n }\n Object.defineProperty(output, key, { value: descriptor.value, enumerable: true })\n }\n return output\n}\n\nconst snapshotOptions = (input: unknown): RawOptions => {\n const values = ownData(\n input,\n \"$options\",\n new Set([\"config\", \"target\", \"hooks\", \"cacheEnvironment\", \"parallelConcurrency\"])\n )\n return {\n config: values.config,\n target: values.target,\n hooks: values.hooks,\n cacheEnvironment: values.cacheEnvironment,\n parallelConcurrency: values.parallelConcurrency\n }\n}\n\nconst validName = (value: unknown): value is string =>\n typeof value === \"string\" && value.length > 0 && value.length <= maximumPluginNameLength &&\n Boundary.isWellFormedText(value) && !/^\\s*$/u.test(value) && !/\\p{Cc}/u.test(value)\n\nconst snapshotCatalog = (input: unknown): Readonly<Record<string, HookKind>> => {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw invalidPlugin(\"$options.hooks\", \"must be an ordinary hook catalog\")\n }\n const prototype = Object.getPrototypeOf(input)\n if (prototype !== Object.prototype && prototype !== null) {\n throw invalidPlugin(\"$options.hooks\", \"must be an ordinary hook catalog\")\n }\n const output: Record<string, HookKind> = {}\n for (const key of Reflect.ownKeys(input)) {\n if (typeof key !== \"string\" || !validName(key)) {\n throw invalidPlugin(\"$options.hooks\", \"contains an invalid hook name\")\n }\n const descriptor = Object.getOwnPropertyDescriptor(input, key)\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(childPath(\"$options.hooks\", key), \"must be an enumerable data property\")\n }\n if (!([\"sequential\", \"parallel\", \"first\", \"waterfall\"] as ReadonlyArray<unknown>).includes(descriptor.value)) {\n throw invalidPlugin(childPath(\"$options.hooks\", key), \"contains an invalid hook kind\")\n }\n Object.defineProperty(output, key, { value: descriptor.value, enumerable: true })\n }\n for (const hook of Object.keys(engineHooks) as ReadonlyArray<keyof typeof engineHooks>) {\n if (Object.hasOwn(output, hook) && output[hook] !== engineHooks[hook]) {\n throw failure(\n \"hook_kind_mismatch\",\n `hook catalog declares shared hook ${JSON.stringify(hook)} as ${\n JSON.stringify(output[hook])\n }, the kernel dispatches it as ${JSON.stringify(engineHooks[hook])}`,\n childPath(\"$options.hooks\", hook),\n { hook }\n )\n }\n }\n return Object.freeze(output)\n}\n\nconst snapshotHook = (\n entry: unknown,\n path: string,\n plugin: string,\n hook: string\n): ((...args: Array<any>) => unknown) | HookObject<(...args: Array<any>) => unknown> => {\n if (typeof entry === \"function\") return entry as (...args: Array<any>) => unknown\n if (entry === undefined) {\n throw invalidPlugin(path, \"must be a function or a hook object\", { plugin, hook })\n }\n const values = ownData(entry, path, new Set([\"order\", \"handler\"]), { plugin, hook })\n if (typeof values.handler !== \"function\") {\n throw invalidPlugin(`${path}.handler`, \"must be a function\", { plugin, hook })\n }\n if (values.order !== undefined && values.order !== \"pre\" && values.order !== \"post\") {\n throw invalidPlugin(`${path}.order`, \"must be pre or post\", { plugin, hook })\n }\n return Object.freeze({\n ...(values.order === undefined ? {} : { order: values.order }),\n handler: values.handler\n }) as HookObject<(...args: Array<any>) => unknown>\n}\n\nconst snapshotPlugin = <H>(\n input: unknown,\n path: string\n): FlowsPlugin<H> => {\n const values = ownData(input, path, new Set([\"name\", \"version\", \"enforce\", \"apply\", \"layer\", \"hooks\"]))\n if (!validName(values.name)) throw invalidPlugin(`${path}.name`, \"requires a bounded non-empty name\")\n const name = values.name\n if (values.version !== undefined && !validName(values.version)) {\n throw invalidPlugin(`${path}.version`, \"requires a bounded non-empty version\", { plugin: name })\n }\n if (values.enforce !== undefined && values.enforce !== \"pre\" && values.enforce !== \"post\") {\n throw invalidPlugin(`${path}.enforce`, \"must be pre or post\", { plugin: name })\n }\n if (\n values.apply !== undefined && values.apply !== \"engine\" && values.apply !== \"harness\" &&\n typeof values.apply !== \"function\"\n ) throw invalidPlugin(`${path}.apply`, \"must be engine, harness, or a predicate\", { plugin: name })\n if (values.layer !== undefined && !Layer.isLayer(values.layer)) {\n throw invalidPlugin(`${path}.layer`, \"must be an Effect Layer\", { plugin: name })\n }\n\n let hooks: Readonly<Record<string, unknown>> | undefined\n if (values.hooks !== undefined) {\n const rawHooks = ownData(values.hooks, `${path}.hooks`, undefined, { plugin: name })\n const snapshot: Record<string, unknown> = Object.create(null)\n for (const [index, hook] of Object.keys(rawHooks).entries()) {\n if (!validName(hook)) {\n throw invalidPlugin(`${path}.hooks[${index}]`, \"contains an invalid hook name\", { plugin: name })\n }\n const entry = rawHooks[hook]\n Object.defineProperty(snapshot, hook, {\n value: snapshotHook(entry, childPath(`${path}.hooks`, hook), name, hook),\n enumerable: true\n })\n }\n hooks = Object.freeze(snapshot)\n }\n\n return Object.freeze({\n name,\n ...(values.version === undefined ? {} : { version: values.version }),\n ...(values.enforce === undefined ? {} : { enforce: values.enforce }),\n ...(values.apply === undefined ? {} : { apply: values.apply as Apply }),\n ...(values.layer === undefined ? {} : { layer: values.layer as Layer.Layer<never, any, any> }),\n ...(hooks === undefined ? {} : { hooks: hooks as Partial<H> })\n })\n}\n\ninterface AdmittedPlugin<H> {\n readonly plugin: FlowsPlugin<H>\n readonly path: string\n}\n\nconst flatten = <H>(input: unknown): ReadonlyArray<AdmittedPlugin<H>> => {\n const output: Array<AdmittedPlugin<H>> = []\n const arrays = new WeakSet<object>()\n const stack: Array<{ readonly value: unknown; readonly path: string; readonly depth: number }> = [\n { value: input, path: \"$\", depth: 0 }\n ]\n let nodes = 0\n while (stack.length > 0) {\n const current = stack.pop()!\n nodes += 1\n if (current.value === false || current.value === null || current.value === undefined) continue\n if (Array.isArray(current.value)) {\n if (current.depth >= maximumPluginDepth) {\n throw failure(\"resource_limit\", `plugin input exceeds the depth limit of ${maximumPluginDepth}`, current.path)\n }\n if (arrays.has(current.value)) throw invalidPlugin(current.path, \"contains a cycle or repeated preset array\")\n arrays.add(current.value)\n const length = current.value.length\n // Every queued frame and array element costs a node, including omitted\n // entries. Refuse before enumerating keys, descriptors, or child frames.\n if (length > maximumPluginInputNodes - nodes - stack.length) {\n throw failure(\"resource_limit\", `plugin input exceeds the ${maximumPluginInputNodes}-node limit`, current.path)\n }\n const keys = Reflect.ownKeys(current.value)\n if (keys.length !== length + 1 || !keys.includes(\"length\")) {\n throw invalidPlugin(current.path, \"must be a dense preset array with no extra properties\")\n }\n for (let index = length - 1; index >= 0; index--) {\n const descriptor = Object.getOwnPropertyDescriptor(current.value, String(index))\n if (descriptor === undefined || !(\"value\" in descriptor) || !descriptor.enumerable) {\n throw invalidPlugin(`${current.path}[${index}]`, \"must be an enumerable data property\")\n }\n stack.push({ value: descriptor.value, path: `${current.path}[${index}]`, depth: current.depth + 1 })\n }\n continue\n }\n output.push(Object.freeze({ plugin: snapshotPlugin<H>(current.value, current.path), path: current.path }))\n if (output.length > maximumPlugins) {\n throw failure(\"resource_limit\", `plugin input exceeds the ${maximumPlugins}-plugin limit`, current.path)\n }\n }\n return output\n}\n\nconst included = <H>(\n { path, plugin }: AdmittedPlugin<H>,\n config: FlowsConfig,\n target: \"engine\" | \"harness\"\n): Effect.Effect<boolean, PluginError> => {\n const apply = plugin.apply\n if (apply === undefined) return Effect.succeed(true)\n if (typeof apply !== \"function\") return Effect.succeed(apply === target)\n return Effect.try({\n try: () => apply(config),\n catch: () =>\n failure(\"apply_failed\", `plugin \"${plugin.name}\" apply predicate failed`, `${path}.apply`, {\n plugin: plugin.name\n })\n }).pipe(\n Effect.flatMap((result) =>\n typeof result === \"boolean\"\n ? Effect.succeed(result)\n : Effect.fail(invalidPlugin(`${path}.apply`, \"predicate must return a boolean\", { plugin: plugin.name }))\n )\n )\n}\n\nconst rank = (enforce: \"pre\" | \"post\" | undefined): number => (enforce === \"pre\" ? 0 : enforce === \"post\" ? 2 : 1)\n\n/**\n * Resolves a plugin preset into an immutable, resource-bounded catalog.\n *\n * @category constructors\n * @since 1.0.0-rc.0\n */\nexport const resolve = <H = FlowsHooks>(\n input: PluginInput<NoInfer<H>>,\n options: Options<NoInfer<H>> = {},\n configOverride?: FlowsConfig\n): Effect.Effect<Resolved<H>, PluginError> =>\n Effect.gen(function*() {\n const raw = yield* Effect.try({\n try: () => snapshotOptions(options),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$options\", \"could not be inspected without executing user code\")\n })\n if (configOverride !== undefined && raw.config !== undefined) {\n return yield* Effect.fail(invalidPlugin(\n \"$options.config\",\n \"cannot declare config in options alongside the positional override\"\n ))\n }\n if (raw.target !== undefined && raw.target !== \"engine\" && raw.target !== \"harness\") {\n return yield* Effect.fail(invalidPlugin(\"$options.target\", \"must be engine or harness\"))\n }\n if (\n raw.parallelConcurrency !== undefined &&\n (typeof raw.parallelConcurrency !== \"number\" || !Number.isSafeInteger(raw.parallelConcurrency) ||\n raw.parallelConcurrency <= 0 ||\n raw.parallelConcurrency > maximumParallelConcurrency)\n ) {\n return yield* Effect.fail(failure(\n \"resource_limit\",\n `parallel concurrency must be between 1 and ${maximumParallelConcurrency}`,\n \"$options.parallelConcurrency\"\n ))\n }\n const parallelConcurrency = raw.parallelConcurrency === undefined\n ? defaultParallelConcurrency\n : raw.parallelConcurrency\n const config = yield* Config.snapshot(configOverride ?? raw.config ?? {})\n const known = yield* Effect.try({\n try: () => snapshotCatalog(raw.hooks ?? engineHooks),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$options.hooks\", \"could not be inspected without executing user code\")\n })\n const admitted = yield* Effect.try({\n try: () => flatten<H>(input),\n catch: (cause) =>\n cause instanceof PluginError\n ? cause\n : invalidPlugin(\"$\", \"could not be inspected without executing user code\")\n })\n const target = raw.target ?? \"engine\"\n const selected = yield* Effect.filter(admitted, (entry) => included(entry, config, target))\n\n let handlerCount = 0\n for (const { path, plugin } of selected) {\n const pluginHooks = plugin.hooks as Readonly<Record<string, unknown>> | undefined\n if (pluginHooks === undefined) continue\n for (const hook of Object.keys(pluginHooks)) {\n if (!Object.hasOwn(known, hook)) {\n return yield* Effect.fail(failure(\n \"unknown_hook\",\n `plugin ${JSON.stringify(plugin.name)} declares unknown hook ${JSON.stringify(diagnosticKey(hook))}`,\n childPath(`${path}.hooks`, hook),\n { plugin: plugin.name, hook }\n ))\n }\n handlerCount += 1\n if (handlerCount > maximumHandlers) {\n return yield* Effect.fail(failure(\n \"resource_limit\",\n `plugin handlers exceed the limit of ${maximumHandlers}`,\n childPath(`${path}.hooks`, hook)\n ))\n }\n }\n }\n\n const seen = new Set<string>()\n for (const { path, plugin } of selected) {\n if (seen.has(plugin.name)) {\n return yield* Effect.fail(failure(\n \"duplicate_name\",\n `duplicate plugin name \"${plugin.name}\"`,\n `${path}.name`,\n { plugin: plugin.name }\n ))\n }\n seen.add(plugin.name)\n }\n\n const orderedEntries = selected\n .map((entry, index) => ({ entry, index }))\n .sort((left, right) =>\n rank(left.entry.plugin.enforce) - rank(right.entry.plugin.enforce) || left.index - right.index\n )\n .map(({ entry }) => entry)\n const plugins = Object.freeze(orderedEntries.map(({ plugin }) => plugin))\n const entries: Array<readonly [string, ReadonlyArray<HandlerRecord>]> = []\n for (const hook of Object.keys(known)) {\n const records: Array<{\n readonly record: HandlerRecord\n readonly enforceRank: number\n readonly orderRank: number\n readonly index: number\n }> = []\n for (const [index, plugin] of plugins.entries()) {\n const pluginHooks = plugin.hooks as Readonly<Record<string, unknown>> | undefined\n if (pluginHooks === undefined || !Object.hasOwn(pluginHooks, hook)) continue\n const entry = pluginHooks[hook]\n const record = Object.freeze({ plugin: plugin.name, hook, handler: handlerOf(entry) })\n records.push({ record, enforceRank: rank(plugin.enforce), orderRank: rank(orderOf(entry)), index })\n }\n // Vite's rule, verbatim: the per-hook `order` is the outer partition and\n // the enforce-sorted plugin list supplies the stable order inside it, so a\n // hook marked `order: \"pre\"` runs ahead of every normal-order handler even\n // when its plugin is `enforce: \"post\"`.\n const ordered = records\n .sort((left, right) =>\n left.orderRank - right.orderRank || left.enforceRank - right.enforceRank || left.index - right.index\n )\n .map(({ record }) => record)\n if (ordered.length > 0) entries.push([hook, Object.freeze(ordered)])\n }\n const cacheEnvironment = yield* snapshotCacheEnvironment(raw.cacheEnvironment, orderedEntries)\n return Object.freeze({\n plugins,\n handlers: ImmutableMap.make(entries),\n kinds: known,\n parallelConcurrency,\n ...(cacheEnvironment === undefined ? {} : { cacheEnvironment })\n })\n })\n\n/**\n * Merges every resolved plugin layer left-to-right and supplies the detached\n * cache environment captured during resolution.\n *\n * @category combinators\n * @since 1.0.0-rc.0\n */\nexport const layer = <H>(resolved: Resolved<H>): Layer.Layer<any, PluginError, any> =>\n mergePluginLayers(resolved.plugins, resolved.cacheEnvironment)\n"]}
|
package/docs/api.md
CHANGED
|
@@ -256,8 +256,10 @@ Every method first compares its kind with the runtime catalog the resolution
|
|
|
256
256
|
admitted (`Resolved.kinds`). A hook the catalog declares with a different kind
|
|
257
257
|
is refused before any handler runs: `sequential`, `first`, and `waterfall` fail
|
|
258
258
|
with `hook_kind_mismatch`, and `parallel` returns that one error. A hook name
|
|
259
|
-
absent from the catalog dispatches nothing
|
|
260
|
-
|
|
259
|
+
absent from the catalog dispatches nothing, unless a hand-built `Resolved`
|
|
260
|
+
registered handlers under it; those are refused the same way, because no kind
|
|
261
|
+
was declared for them. The typed signatures make the mismatch unreachable
|
|
262
|
+
without a cast; the runtime check covers the cast.
|
|
261
263
|
|
|
262
264
|
Handlers must return an Effect. Synchronous throws, Effect failures and defects,
|
|
263
265
|
and non-Effect results (including `undefined`, scalars, and Promises) become
|
|
@@ -482,8 +484,8 @@ class PluginError extends Schema.TaggedError<PluginError>()("flows/plugin/Plugin
|
|
|
482
484
|
|
|
483
485
|
Every startup and dispatch refusal uses this one error. `plugin` and `hook` are
|
|
484
486
|
attribution, `path` is a diagnostic dollar-path into the refused value, and
|
|
485
|
-
`cause` carries a failing handler's
|
|
486
|
-
`code`; the messages are prose.
|
|
487
|
+
`cause` carries a failing handler's, layer's, or waterfall merge's original
|
|
488
|
+
failure. Match on `code`; the messages are prose.
|
|
487
489
|
|
|
488
490
|
`cause` is not redacted. It holds whatever the plugin failed or threw with,
|
|
489
491
|
which can include credentials or config values. Keep it in process for
|
package/docs/troubleshooting.md
CHANGED
|
@@ -45,7 +45,8 @@ At startup, `Options.hooks` labelled `config` with a kind other than
|
|
|
45
45
|
`waterfall`, or `configResolved` with a kind other than `parallel`; the path
|
|
46
46
|
names the entry, such as `$options.hooks.config`. At dispatch, a method was
|
|
47
47
|
called for a hook the catalog declares with a different kind, which only a cast
|
|
48
|
-
around the typed dispatcher can reach
|
|
48
|
+
around the typed dispatcher can reach, or for a hook a hand-built `Resolved`
|
|
49
|
+
gave handlers without declaring it in `kinds`. In every case no handler ran.
|
|
49
50
|
|
|
50
51
|
**What to change.** Make the catalog agree with the hook interface: spread
|
|
51
52
|
`engineHooks` for the shared hooks and write each of your own hooks with the
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smthrs/plugin",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.0-rc.
|
|
4
|
+
"version": "1.0.0-rc.9",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"smthrs": {
|
|
7
7
|
"group": "agent"
|
|
@@ -145,8 +145,8 @@
|
|
|
145
145
|
"tag": "next"
|
|
146
146
|
},
|
|
147
147
|
"dependencies": {
|
|
148
|
-
"@smthrs/canonical": "1.0.0-rc.
|
|
149
|
-
"@smthrs/flow": "1.0.0-rc.
|
|
148
|
+
"@smthrs/canonical": "1.0.0-rc.9",
|
|
149
|
+
"@smthrs/flow": "1.0.0-rc.9"
|
|
150
150
|
},
|
|
151
151
|
"devDependencies": {
|
|
152
152
|
"@effect/language-service": "0.87.2",
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
"effect": "^4.0.4"
|
|
172
172
|
},
|
|
173
173
|
"scripts": {
|
|
174
|
-
"lint": "eslint src --max-warnings=0 && dprint check",
|
|
174
|
+
"lint": "eslint src examples --max-warnings=0 && dprint check",
|
|
175
175
|
"format": "dprint fmt",
|
|
176
176
|
"build": "node scripts/build.mjs",
|
|
177
177
|
"check": "tsc -b tsconfig.json && tsc -p tsconfig.test.json --noEmit",
|
package/src/Plugins.ts
CHANGED
|
@@ -32,8 +32,23 @@ const empty: ReadonlyArray<HandlerRecord> = Object.freeze([])
|
|
|
32
32
|
// The typed catalog and the runtime catalog can only drift when a host casts
|
|
33
33
|
// around `KeysOfKind`; refuse before any handler runs rather than execute a
|
|
34
34
|
// hook under semantics its declaration never promised.
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
// A hook the catalog does not declare dispatches as empty, unless a
|
|
36
|
+
// hand-built resolution registered handlers for it: those have no declared
|
|
37
|
+
// kind to honor, so they are refused too.
|
|
38
|
+
const kindMismatch = (
|
|
39
|
+
resolved: Resolved<unknown>,
|
|
40
|
+
hook: string,
|
|
41
|
+
kind: HookKind,
|
|
42
|
+
handlers: ReadonlyArray<HandlerRecord>
|
|
43
|
+
): PluginError | undefined => {
|
|
44
|
+
if (!Object.hasOwn(resolved.kinds, hook)) {
|
|
45
|
+
if (handlers.length === 0) return undefined
|
|
46
|
+
return new PluginError({
|
|
47
|
+
code: "hook_kind_mismatch",
|
|
48
|
+
message: `hook "${hook}" has handlers but is not declared in the runtime catalog`,
|
|
49
|
+
hook
|
|
50
|
+
})
|
|
51
|
+
}
|
|
37
52
|
const declared = resolved.kinds[hook]
|
|
38
53
|
if (declared === kind) return undefined
|
|
39
54
|
return new PluginError({
|
|
@@ -125,7 +140,7 @@ export const make = <H = FlowsHooks>(resolved: Resolved<H>): Service<H> => {
|
|
|
125
140
|
|
|
126
141
|
const sequential = ((hook: string, ...args: Array<unknown>) =>
|
|
127
142
|
Effect.gen(function*() {
|
|
128
|
-
const mismatch = kindMismatch(resolved, hook, "sequential")
|
|
143
|
+
const mismatch = kindMismatch(resolved, hook, "sequential", handlers(hook))
|
|
129
144
|
if (mismatch !== undefined) return yield* Effect.fail(mismatch)
|
|
130
145
|
const results: Array<unknown> = []
|
|
131
146
|
for (const record of handlers(hook)) {
|
|
@@ -135,7 +150,7 @@ export const make = <H = FlowsHooks>(resolved: Resolved<H>): Service<H> => {
|
|
|
135
150
|
})) as Service<H>["sequential"]
|
|
136
151
|
|
|
137
152
|
const parallel = ((hook: string, ...args: Array<unknown>) => {
|
|
138
|
-
const mismatch = kindMismatch(resolved, hook, "parallel")
|
|
153
|
+
const mismatch = kindMismatch(resolved, hook, "parallel", handlers(hook))
|
|
139
154
|
if (mismatch !== undefined) return Effect.succeed([mismatch])
|
|
140
155
|
return Effect.forEach(
|
|
141
156
|
handlers(hook),
|
|
@@ -149,7 +164,7 @@ export const make = <H = FlowsHooks>(resolved: Resolved<H>): Service<H> => {
|
|
|
149
164
|
|
|
150
165
|
const first = ((hook: string, ...args: Array<unknown>) =>
|
|
151
166
|
Effect.gen(function*() {
|
|
152
|
-
const mismatch = kindMismatch(resolved, hook, "first")
|
|
167
|
+
const mismatch = kindMismatch(resolved, hook, "first", handlers(hook))
|
|
153
168
|
if (mismatch !== undefined) return yield* Effect.fail(mismatch)
|
|
154
169
|
for (const record of handlers(hook)) {
|
|
155
170
|
const result = yield* runHandler(record, args)
|
|
@@ -171,7 +186,7 @@ export const make = <H = FlowsHooks>(resolved: Resolved<H>): Service<H> => {
|
|
|
171
186
|
const waterfall =
|
|
172
187
|
((hook: string, initial: unknown, merge: (previous: unknown, patch: unknown) => unknown) =>
|
|
173
188
|
Effect.gen(function*() {
|
|
174
|
-
const mismatch = kindMismatch(resolved, hook, "waterfall")
|
|
189
|
+
const mismatch = kindMismatch(resolved, hook, "waterfall", handlers(hook))
|
|
175
190
|
if (mismatch !== undefined) return yield* Effect.fail(mismatch)
|
|
176
191
|
let value = initial
|
|
177
192
|
for (const record of handlers(hook)) {
|
|
@@ -186,13 +201,15 @@ export const make = <H = FlowsHooks>(resolved: Resolved<H>): Service<H> => {
|
|
|
186
201
|
message: cause.message,
|
|
187
202
|
plugin: record.plugin,
|
|
188
203
|
hook: record.hook,
|
|
189
|
-
path: cause.path
|
|
204
|
+
path: cause.path,
|
|
205
|
+
cause
|
|
190
206
|
})
|
|
191
207
|
: new PluginError({
|
|
192
208
|
code: "config_invalid",
|
|
193
209
|
message: `waterfall hook "${record.hook}" in plugin "${record.plugin}" returned an invalid patch`,
|
|
194
210
|
plugin: record.plugin,
|
|
195
|
-
hook: record.hook
|
|
211
|
+
hook: record.hook,
|
|
212
|
+
cause
|
|
196
213
|
})
|
|
197
214
|
})
|
|
198
215
|
}
|
package/src/Resolve.ts
CHANGED
|
@@ -161,22 +161,25 @@ const childPath = (path: string, key: string): string => {
|
|
|
161
161
|
const ownData = (
|
|
162
162
|
input: unknown,
|
|
163
163
|
path: string,
|
|
164
|
-
allowed?: ReadonlySet<string
|
|
164
|
+
allowed?: ReadonlySet<string>,
|
|
165
|
+
fields: { readonly plugin?: string; readonly hook?: string } = {}
|
|
165
166
|
): Readonly<Record<string, unknown>> => {
|
|
166
167
|
if (typeof input !== "object" || input === null || Array.isArray(input)) {
|
|
167
|
-
throw invalidPlugin(path, "must be an ordinary record")
|
|
168
|
+
throw invalidPlugin(path, "must be an ordinary record", fields)
|
|
168
169
|
}
|
|
169
170
|
const prototype = Object.getPrototypeOf(input)
|
|
170
|
-
if (prototype !== Object.prototype && prototype !== null)
|
|
171
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
172
|
+
throw invalidPlugin(path, "must be an ordinary record", fields)
|
|
173
|
+
}
|
|
171
174
|
const output: Record<string, unknown> = {}
|
|
172
175
|
for (const key of Reflect.ownKeys(input)) {
|
|
173
|
-
if (typeof key !== "string") throw invalidPlugin(path, "must not contain symbol keys")
|
|
176
|
+
if (typeof key !== "string") throw invalidPlugin(path, "must not contain symbol keys", fields)
|
|
174
177
|
if (allowed !== undefined && !allowed.has(key)) {
|
|
175
|
-
throw invalidPlugin(childPath(path, key), "contains an unknown property")
|
|
178
|
+
throw invalidPlugin(childPath(path, key), "contains an unknown property", fields)
|
|
176
179
|
}
|
|
177
180
|
const descriptor = Object.getOwnPropertyDescriptor(input, key)
|
|
178
181
|
if (descriptor === undefined || !("value" in descriptor) || !descriptor.enumerable) {
|
|
179
|
-
throw invalidPlugin(childPath(path, key), "must be an enumerable data property")
|
|
182
|
+
throw invalidPlugin(childPath(path, key), "must be an enumerable data property", fields)
|
|
180
183
|
}
|
|
181
184
|
Object.defineProperty(output, key, { value: descriptor.value, enumerable: true })
|
|
182
185
|
}
|
|
@@ -249,7 +252,7 @@ const snapshotHook = (
|
|
|
249
252
|
if (entry === undefined) {
|
|
250
253
|
throw invalidPlugin(path, "must be a function or a hook object", { plugin, hook })
|
|
251
254
|
}
|
|
252
|
-
const values = ownData(entry, path, new Set(["order", "handler"]))
|
|
255
|
+
const values = ownData(entry, path, new Set(["order", "handler"]), { plugin, hook })
|
|
253
256
|
if (typeof values.handler !== "function") {
|
|
254
257
|
throw invalidPlugin(`${path}.handler`, "must be a function", { plugin, hook })
|
|
255
258
|
}
|
|
@@ -285,11 +288,11 @@ const snapshotPlugin = <H>(
|
|
|
285
288
|
|
|
286
289
|
let hooks: Readonly<Record<string, unknown>> | undefined
|
|
287
290
|
if (values.hooks !== undefined) {
|
|
288
|
-
const rawHooks = ownData(values.hooks, `${path}.hooks
|
|
291
|
+
const rawHooks = ownData(values.hooks, `${path}.hooks`, undefined, { plugin: name })
|
|
289
292
|
const snapshot: Record<string, unknown> = Object.create(null)
|
|
290
293
|
for (const [index, hook] of Object.keys(rawHooks).entries()) {
|
|
291
294
|
if (!validName(hook)) {
|
|
292
|
-
throw invalidPlugin(`${path}.hooks[${index}]`, "contains an invalid hook name")
|
|
295
|
+
throw invalidPlugin(`${path}.hooks[${index}]`, "contains an invalid hook name", { plugin: name })
|
|
293
296
|
}
|
|
294
297
|
const entry = rawHooks[hook]
|
|
295
298
|
Object.defineProperty(snapshot, hook, {
|