@leaven-graphql/plugins 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +395 -99
- package/dist/builtin.d.ts +75 -4
- package/dist/builtin.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +819 -158
- package/dist/manager.d.ts +50 -2
- package/dist/manager.d.ts.map +1 -1
- package/dist/types.d.ts +8 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -4
package/dist/manager.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @leaven-graphql/plugins - Plugin manager
|
|
3
3
|
*
|
|
4
|
-
* Copyright 2026
|
|
4
|
+
* Copyright 2026 Joseph Quinn
|
|
5
5
|
* Licensed under the Apache License, Version 2.0
|
|
6
6
|
*/
|
|
7
7
|
import type { DocumentNode, GraphQLSchema, GraphQLError } from 'graphql';
|
|
@@ -23,9 +23,50 @@ export declare class PluginManager {
|
|
|
23
23
|
private readonly schema;
|
|
24
24
|
private readonly plugins;
|
|
25
25
|
private readonly pluginOrder;
|
|
26
|
+
/**
|
|
27
|
+
* Per-hook dispatch index: for each hook name, the plugins that implement
|
|
28
|
+
* that hook, in registration order. Maintained on register/unregister so
|
|
29
|
+
* request-time dispatch iterates only plugins that implement the hook.
|
|
30
|
+
*/
|
|
31
|
+
private readonly hookPlugins;
|
|
32
|
+
/** Constructor-registered plugins whose `onRegister` hooks are still deferred. */
|
|
33
|
+
private pendingOnRegister;
|
|
34
|
+
private initPromise;
|
|
35
|
+
private initialized;
|
|
26
36
|
constructor(config: PluginManagerConfig);
|
|
37
|
+
/**
|
|
38
|
+
* Synchronously validate and insert a plugin (duplicate-name check,
|
|
39
|
+
* dependency check, map insertion, ordering, and hook-index update).
|
|
40
|
+
*/
|
|
41
|
+
private addPlugin;
|
|
42
|
+
/**
|
|
43
|
+
* Run the deferred `onRegister` hooks of plugins passed to the constructor.
|
|
44
|
+
*
|
|
45
|
+
* Idempotent: hooks run at most once, in registration order, and concurrent
|
|
46
|
+
* calls await the same run. The manager also awaits this lazily before
|
|
47
|
+
* registering/unregistering plugins and before dispatching any hooks, so
|
|
48
|
+
* calling it explicitly is optional but lets callers observe (and handle)
|
|
49
|
+
* `onRegister` failures deterministically.
|
|
50
|
+
*
|
|
51
|
+
* A failure is NOT cached: the hooks that already succeeded are unwound via
|
|
52
|
+
* their `onUnregister`, every deferred hook is queued again, and the wrapped
|
|
53
|
+
* error is rethrown, so a later call retries the whole run instead of
|
|
54
|
+
* replaying the boot-time rejection forever.
|
|
55
|
+
*/
|
|
56
|
+
init(): Promise<void>;
|
|
57
|
+
private runPendingOnRegister;
|
|
58
|
+
/**
|
|
59
|
+
* Remove a plugin from the registry, ordering, and every hook dispatch
|
|
60
|
+
* index. The inverse of {@link addPlugin}; it does NOT run `onUnregister`.
|
|
61
|
+
*/
|
|
62
|
+
private removePlugin;
|
|
27
63
|
/**
|
|
28
64
|
* Register a plugin
|
|
65
|
+
*
|
|
66
|
+
* A failing `onRegister` unwinds the insertion: the plugin is removed from
|
|
67
|
+
* the registry and every hook index before the error is rethrown, so a
|
|
68
|
+
* plugin that failed to initialize never has its request hooks dispatched
|
|
69
|
+
* and the same registration can be retried.
|
|
29
70
|
*/
|
|
30
71
|
register(plugin: Plugin): Promise<void>;
|
|
31
72
|
/**
|
|
@@ -69,8 +110,15 @@ export declare class PluginManager {
|
|
|
69
110
|
}, context: PluginContext): Promise<void>;
|
|
70
111
|
/**
|
|
71
112
|
* Execute beforeExecute hooks
|
|
113
|
+
*
|
|
114
|
+
* If a hook returns a {@link GraphQLResponse}, dispatch stops (later
|
|
115
|
+
* `beforeExecute` hooks are skipped) and the response is returned so the
|
|
116
|
+
* caller may use it as the operation result and skip execution — e.g. a
|
|
117
|
+
* caching plugin serving a stored response. Returns `undefined` when no
|
|
118
|
+
* hook short-circuits, in which case the caller proceeds with execution
|
|
119
|
+
* exactly as before.
|
|
72
120
|
*/
|
|
73
|
-
beforeExecute(document: DocumentNode, context: PluginContext): Promise<
|
|
121
|
+
beforeExecute(document: DocumentNode, context: PluginContext): Promise<GraphQLResponse | undefined>;
|
|
74
122
|
/**
|
|
75
123
|
* Execute afterExecute hooks
|
|
76
124
|
*/
|
package/dist/manager.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qBAAqB;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @leaven-graphql/plugins - Plugin types
|
|
3
3
|
*
|
|
4
|
-
* Copyright 2026
|
|
4
|
+
* Copyright 2026 Joseph Quinn
|
|
5
5
|
* Licensed under the Apache License, Version 2.0
|
|
6
6
|
*/
|
|
7
7
|
import type { DocumentNode, GraphQLSchema, GraphQLError } from 'graphql';
|
|
@@ -53,8 +53,14 @@ export type AfterValidateHook = (result: {
|
|
|
53
53
|
}, context: PluginContext) => void | Promise<void>;
|
|
54
54
|
/**
|
|
55
55
|
* Hook called before execution
|
|
56
|
+
*
|
|
57
|
+
* Returning a {@link GraphQLResponse} short-circuits the pipeline: the
|
|
58
|
+
* `PluginManager` stops invoking later `beforeExecute` hooks and surfaces the
|
|
59
|
+
* response to its caller, which may use it as the operation result and skip
|
|
60
|
+
* execution entirely (e.g. to serve a cached response). Returning `void`
|
|
61
|
+
* preserves the previous behavior and lets execution proceed normally.
|
|
56
62
|
*/
|
|
57
|
-
export type BeforeExecuteHook = (document: DocumentNode, context: PluginContext) => void | Promise<void>;
|
|
63
|
+
export type BeforeExecuteHook = (document: DocumentNode, context: PluginContext) => GraphQLResponse | void | Promise<GraphQLResponse | void>;
|
|
58
64
|
/**
|
|
59
65
|
* Hook called after execution
|
|
60
66
|
*/
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,QAAQ,GAAG,OAAO;IAC/C,yBAAyB;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,2BAA2B;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,mBAAmB;IACnB,OAAO,EAAE,QAAQ,CAAC;IAClB,2CAA2C;IAC3C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,KACnB,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,aAAa,KACnB,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,aAAa,KACnB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,MAAM,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,EAC3D,OAAO,EAAE,aAAa,KACnB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,QAAQ,GAAG,OAAO;IAC/C,yBAAyB;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,2BAA2B;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,mBAAmB;IACnB,OAAO,EAAE,QAAQ,CAAC;IAClB,2CAA2C;IAC3C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,KACnB,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,aAAa,KACnB,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;AAExD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,aAAa,KACnB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,MAAM,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,EAC3D,OAAO,EAAE,aAAa,KACnB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,aAAa,KACnB,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,aAAa,KACnB,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,aAAa,KACnB,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,qCAAqC;IACrC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,4CAA4C;IAC5C,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,2CAA2C;IAC3C,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,2CAA2C;IAC3C,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,kCAAkC;IAClC,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,MAAO,SAAQ,WAAW;IACzC,sBAAsB;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,uCAAuC;IACvC,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leaven-graphql/plugins",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Plugin system for Leaven GraphQL",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
14
17
|
"files": [
|
|
15
18
|
"dist",
|
|
16
19
|
"README.md"
|
|
@@ -20,14 +23,15 @@
|
|
|
20
23
|
"bun",
|
|
21
24
|
"plugins"
|
|
22
25
|
],
|
|
23
|
-
"author": "
|
|
26
|
+
"author": "Joseph Quinn",
|
|
24
27
|
"license": "Apache-2.0",
|
|
25
28
|
"dependencies": {
|
|
26
29
|
"graphql": "^16.8.0",
|
|
27
|
-
"@leaven-graphql/core": "0.
|
|
30
|
+
"@leaven-graphql/core": "0.2.0",
|
|
31
|
+
"@leaven-graphql/errors": "0.2.0"
|
|
28
32
|
},
|
|
29
33
|
"devDependencies": {
|
|
30
|
-
"@types/bun": "^1.
|
|
34
|
+
"@types/bun": "^1.3.12",
|
|
31
35
|
"typescript": "^5.3.0"
|
|
32
36
|
},
|
|
33
37
|
"peerDependencies": {
|