@plantops/iam-client 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +11 -0
  2. package/dist/auth.d.ts +135 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +168 -0
  5. package/dist/client.d.ts +110 -0
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/client.js +135 -0
  8. package/dist/endpoints/applications.d.ts +48 -0
  9. package/dist/endpoints/applications.d.ts.map +1 -0
  10. package/dist/endpoints/applications.js +30 -0
  11. package/dist/endpoints/audit.d.ts +43 -0
  12. package/dist/endpoints/audit.d.ts.map +1 -0
  13. package/dist/endpoints/audit.js +41 -0
  14. package/dist/endpoints/auth.d.ts +56 -0
  15. package/dist/endpoints/auth.d.ts.map +1 -0
  16. package/dist/endpoints/auth.js +88 -0
  17. package/dist/endpoints/authz.d.ts +31 -0
  18. package/dist/endpoints/authz.d.ts.map +1 -0
  19. package/dist/endpoints/authz.js +39 -0
  20. package/dist/endpoints/bindings.d.ts +17 -0
  21. package/dist/endpoints/bindings.d.ts.map +1 -0
  22. package/dist/endpoints/bindings.js +16 -0
  23. package/dist/endpoints/clients.d.ts +35 -0
  24. package/dist/endpoints/clients.d.ts.map +1 -0
  25. package/dist/endpoints/clients.js +31 -0
  26. package/dist/endpoints/entitlements.d.ts +40 -0
  27. package/dist/endpoints/entitlements.d.ts.map +1 -0
  28. package/dist/endpoints/entitlements.js +43 -0
  29. package/dist/endpoints/index.d.ts +22 -0
  30. package/dist/endpoints/index.d.ts.map +1 -0
  31. package/dist/endpoints/index.js +21 -0
  32. package/dist/endpoints/navigation.d.ts +25 -0
  33. package/dist/endpoints/navigation.d.ts.map +1 -0
  34. package/dist/endpoints/navigation.js +24 -0
  35. package/dist/endpoints/roles.d.ts +25 -0
  36. package/dist/endpoints/roles.d.ts.map +1 -0
  37. package/dist/endpoints/roles.js +21 -0
  38. package/dist/endpoints/scopes.d.ts +19 -0
  39. package/dist/endpoints/scopes.d.ts.map +1 -0
  40. package/dist/endpoints/scopes.js +18 -0
  41. package/dist/endpoints/service-accounts.d.ts +19 -0
  42. package/dist/endpoints/service-accounts.d.ts.map +1 -0
  43. package/dist/endpoints/service-accounts.js +19 -0
  44. package/dist/endpoints/users.d.ts +39 -0
  45. package/dist/endpoints/users.d.ts.map +1 -0
  46. package/dist/endpoints/users.js +24 -0
  47. package/dist/errors.d.ts +70 -0
  48. package/dist/errors.d.ts.map +1 -0
  49. package/dist/errors.js +113 -0
  50. package/dist/http.d.ts +113 -0
  51. package/dist/http.d.ts.map +1 -0
  52. package/dist/http.js +164 -0
  53. package/dist/index.d.ts +36 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +35 -0
  56. package/dist/lib/iam-client.d.ts +2 -0
  57. package/dist/lib/iam-client.d.ts.map +1 -0
  58. package/dist/lib/iam-client.js +3 -0
  59. package/dist/resolve-cache.d.ts +65 -0
  60. package/dist/resolve-cache.d.ts.map +1 -0
  61. package/dist/resolve-cache.js +98 -0
  62. package/dist/testing/mock-server.d.ts +65 -0
  63. package/dist/testing/mock-server.d.ts.map +1 -0
  64. package/dist/testing/mock-server.js +107 -0
  65. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  66. package/package.json +40 -0
@@ -0,0 +1,36 @@
1
+ /**
2
+ * `@plantops/iam-client` — the typed way to call the PlantOps IAM (Doc 08 §2).
3
+ *
4
+ * `admin-web` consumes it today; every future operational module consumes it
5
+ * instead of writing its own HTTP against `/iam/*`. It depends on
6
+ * `@plantops/contracts` and nothing else — not on Nest, not on a fetch library,
7
+ * not on the IAM's database layer — so the same build runs in a Node service and
8
+ * in a browser.
9
+ *
10
+ * ```ts
11
+ * const iam = new IamClient({ baseUrl: 'https://iam.plantops.example' });
12
+ * await iam.auth.login({ email, password, client_slug: 'acme' });
13
+ * const menu = await iam.navigation.tree();
14
+ * const grants = await iam.grants(); // cached resolve
15
+ * ```
16
+ *
17
+ * Three things it does that a hand-written `fetch` wrapper would not:
18
+ *
19
+ * - **Token lifecycle.** Login stores the pair, every request carries it, an
20
+ * expiring one is renewed before it is used, and a `401` is retried once after
21
+ * a *single* refresh no matter how many calls raced into it (`auth.ts`).
22
+ * - **Typed both ways.** Requests take the request interfaces of
23
+ * `@plantops/contracts` and responses come back as its DTOs, so a change to
24
+ * the contract breaks the consumer at compile time rather than at runtime.
25
+ * - **The error model.** Every failure is an {@link IamApiError} carrying the
26
+ * closed `IamErrorCode` table of Doc 06 §2 and the `requestId` that correlates
27
+ * it with the server's logs — including when something in front of the API
28
+ * answered instead.
29
+ */
30
+ export * from './auth.js';
31
+ export * from './client.js';
32
+ export * from './endpoints/index.js';
33
+ export * from './errors.js';
34
+ export * from './http.js';
35
+ export * from './resolve-cache.js';
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `@plantops/iam-client` — the typed way to call the PlantOps IAM (Doc 08 §2).
3
+ *
4
+ * `admin-web` consumes it today; every future operational module consumes it
5
+ * instead of writing its own HTTP against `/iam/*`. It depends on
6
+ * `@plantops/contracts` and nothing else — not on Nest, not on a fetch library,
7
+ * not on the IAM's database layer — so the same build runs in a Node service and
8
+ * in a browser.
9
+ *
10
+ * ```ts
11
+ * const iam = new IamClient({ baseUrl: 'https://iam.plantops.example' });
12
+ * await iam.auth.login({ email, password, client_slug: 'acme' });
13
+ * const menu = await iam.navigation.tree();
14
+ * const grants = await iam.grants(); // cached resolve
15
+ * ```
16
+ *
17
+ * Three things it does that a hand-written `fetch` wrapper would not:
18
+ *
19
+ * - **Token lifecycle.** Login stores the pair, every request carries it, an
20
+ * expiring one is renewed before it is used, and a `401` is retried once after
21
+ * a *single* refresh no matter how many calls raced into it (`auth.ts`).
22
+ * - **Typed both ways.** Requests take the request interfaces of
23
+ * `@plantops/contracts` and responses come back as its DTOs, so a change to
24
+ * the contract breaks the consumer at compile time rather than at runtime.
25
+ * - **The error model.** Every failure is an {@link IamApiError} carrying the
26
+ * closed `IamErrorCode` table of Doc 06 §2 and the `requestId` that correlates
27
+ * it with the server's logs — including when something in front of the API
28
+ * answered instead.
29
+ */
30
+ export * from './auth.js';
31
+ export * from './client.js';
32
+ export * from './endpoints/index.js';
33
+ export * from './errors.js';
34
+ export * from './http.js';
35
+ export * from './resolve-cache.js';
@@ -0,0 +1,2 @@
1
+ export declare function iamClient(): string;
2
+ //# sourceMappingURL=iam-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-client.d.ts","sourceRoot":"","sources":["../../src/lib/iam-client.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
@@ -0,0 +1,3 @@
1
+ export function iamClient() {
2
+ return 'iam-client';
3
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The client-side half of the grants cache (Doc 06 §11).
3
+ *
4
+ * `GET /iam/permissions/resolve` is the hot path of the whole system: a module
5
+ * authorizing a request needs the caller's grants, and `auth-kit`'s
6
+ * `PermissionGuard` asks for them on every gated call (Doc 08 §4). Answering
7
+ * each one over HTTP would put the IAM back on the per-request critical path,
8
+ * which is exactly what Doc 06 §11 says not to do.
9
+ *
10
+ * ## Why the TTL here is short, and the server's is not
11
+ *
12
+ * The IAM's Redis cache holds grants for ten minutes because it is *versioned*:
13
+ * a mutation bumps the subject's counter and the next read misses (Doc 04 §6–7),
14
+ * so a stale answer is impossible rather than merely unlikely. This cache has no
15
+ * such channel. It is a plain TTL, and the TTL is the entire window in which a
16
+ * revoked permission still appears to be held. Sixty seconds keeps that window
17
+ * roughly an order of magnitude shorter than the ten minutes the versioned cache
18
+ * can afford, and still absorbs the burst of calls one screen or one request
19
+ * fan-out produces, which is all a client cache is for.
20
+ *
21
+ * A consumer that *does* have an invalidation channel — a module subscribed to
22
+ * `perms.invalidated` — should call {@link ResolveCache.invalidate} from it and
23
+ * may then raise the TTL. That is why the entry point is a method rather than a
24
+ * private detail.
25
+ *
26
+ * ## Single flight, per key
27
+ *
28
+ * Two concurrent authorizations for the same subject must produce one HTTP call,
29
+ * for the same reason the token refresh does: the burst is the normal case, not
30
+ * the exception. In-flight requests are shared and only the settled result is
31
+ * cached, so a failed resolve leaves nothing behind to serve.
32
+ */
33
+ import type { ResolvedGrants, ResolveQuery } from '@plantops/contracts';
34
+ export interface ResolveCacheOptions {
35
+ /** Default 60. Zero disables caching without changing any call site. */
36
+ ttlSeconds?: number;
37
+ /** Injectable clock, so expiry is tested without timers. */
38
+ now?: () => number;
39
+ }
40
+ export declare class ResolveCache {
41
+ /** The uncached call — `GET /iam/permissions/resolve`. */
42
+ private readonly load;
43
+ private readonly ttlMs;
44
+ private readonly now;
45
+ private readonly entries;
46
+ private readonly inFlight;
47
+ constructor(
48
+ /** The uncached call — `GET /iam/permissions/resolve`. */
49
+ load: (query: ResolveQuery) => Promise<ResolvedGrants>, options?: ResolveCacheOptions);
50
+ /** The subject's grants, from cache when fresh. */
51
+ get(query?: ResolveQuery): Promise<ResolvedGrants>;
52
+ /** Fetches unconditionally, and repopulates. Concurrent callers still share it. */
53
+ reload(query?: ResolveQuery): Promise<ResolvedGrants>;
54
+ /**
55
+ * Drops one application's slice, or — with no argument — everything.
56
+ *
57
+ * Called on every token change: a new subject's grants have nothing to do
58
+ * with the last one's, and serving them across a login would be the one
59
+ * caching bug that hands a user somebody else's menu.
60
+ */
61
+ invalidate(applicationId?: string): void;
62
+ /** Everything, including the unfiltered entry. */
63
+ clear(): void;
64
+ }
65
+ //# sourceMappingURL=resolve-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-cache.d.ts","sourceRoot":"","sources":["../src/resolve-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExE,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAYD,qBAAa,YAAY;IAOrB,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;;IAGrE,0DAA0D;IACzC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,cAAc,CAAC,EACvE,OAAO,GAAE,mBAAwB;IAMnC,mDAAmD;IAC7C,GAAG,CAAC,KAAK,GAAE,YAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAa5D,mFAAmF;IACnF,MAAM,CAAC,KAAK,GAAE,YAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAoBzD;;;;;;OAMG;IACH,UAAU,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAQxC,kDAAkD;IAClD,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * The client-side half of the grants cache (Doc 06 §11).
3
+ *
4
+ * `GET /iam/permissions/resolve` is the hot path of the whole system: a module
5
+ * authorizing a request needs the caller's grants, and `auth-kit`'s
6
+ * `PermissionGuard` asks for them on every gated call (Doc 08 §4). Answering
7
+ * each one over HTTP would put the IAM back on the per-request critical path,
8
+ * which is exactly what Doc 06 §11 says not to do.
9
+ *
10
+ * ## Why the TTL here is short, and the server's is not
11
+ *
12
+ * The IAM's Redis cache holds grants for ten minutes because it is *versioned*:
13
+ * a mutation bumps the subject's counter and the next read misses (Doc 04 §6–7),
14
+ * so a stale answer is impossible rather than merely unlikely. This cache has no
15
+ * such channel. It is a plain TTL, and the TTL is the entire window in which a
16
+ * revoked permission still appears to be held. Sixty seconds keeps that window
17
+ * roughly an order of magnitude shorter than the ten minutes the versioned cache
18
+ * can afford, and still absorbs the burst of calls one screen or one request
19
+ * fan-out produces, which is all a client cache is for.
20
+ *
21
+ * A consumer that *does* have an invalidation channel — a module subscribed to
22
+ * `perms.invalidated` — should call {@link ResolveCache.invalidate} from it and
23
+ * may then raise the TTL. That is why the entry point is a method rather than a
24
+ * private detail.
25
+ *
26
+ * ## Single flight, per key
27
+ *
28
+ * Two concurrent authorizations for the same subject must produce one HTTP call,
29
+ * for the same reason the token refresh does: the burst is the normal case, not
30
+ * the exception. In-flight requests are shared and only the settled result is
31
+ * cached, so a failed resolve leaves nothing behind to serve.
32
+ */
33
+ /** Doc 06 §11's optional narrowing, plus the "whole grant set" case. */
34
+ const keyOf = (query) => query.applicationId ?? '*';
35
+ const DEFAULT_TTL_SECONDS = 60;
36
+ export class ResolveCache {
37
+ load;
38
+ ttlMs;
39
+ now;
40
+ entries = new Map();
41
+ inFlight = new Map();
42
+ constructor(
43
+ /** The uncached call — `GET /iam/permissions/resolve`. */
44
+ load, options = {}) {
45
+ this.load = load;
46
+ this.ttlMs = (options.ttlSeconds ?? DEFAULT_TTL_SECONDS) * 1000;
47
+ this.now = options.now ?? (() => Date.now());
48
+ }
49
+ /** The subject's grants, from cache when fresh. */
50
+ async get(query = {}) {
51
+ const key = keyOf(query);
52
+ const cached = this.entries.get(key);
53
+ if (cached !== undefined && cached.expiresAt > this.now())
54
+ return cached.grants;
55
+ this.entries.delete(key);
56
+ const flight = this.inFlight.get(key);
57
+ if (flight !== undefined)
58
+ return flight;
59
+ return this.reload(query);
60
+ }
61
+ /** Fetches unconditionally, and repopulates. Concurrent callers still share it. */
62
+ reload(query = {}) {
63
+ const key = keyOf(query);
64
+ const existing = this.inFlight.get(key);
65
+ if (existing !== undefined)
66
+ return existing;
67
+ const flight = this.load(query)
68
+ .then((grants) => {
69
+ if (this.ttlMs > 0) {
70
+ this.entries.set(key, { grants, expiresAt: this.now() + this.ttlMs });
71
+ }
72
+ return grants;
73
+ })
74
+ .finally(() => {
75
+ this.inFlight.delete(key);
76
+ });
77
+ this.inFlight.set(key, flight);
78
+ return flight;
79
+ }
80
+ /**
81
+ * Drops one application's slice, or — with no argument — everything.
82
+ *
83
+ * Called on every token change: a new subject's grants have nothing to do
84
+ * with the last one's, and serving them across a login would be the one
85
+ * caching bug that hands a user somebody else's menu.
86
+ */
87
+ invalidate(applicationId) {
88
+ if (applicationId === undefined) {
89
+ this.entries.clear();
90
+ return;
91
+ }
92
+ this.entries.delete(applicationId);
93
+ }
94
+ /** Everything, including the unfiltered entry. */
95
+ clear() {
96
+ this.entries.clear();
97
+ }
98
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The mocked server the unit tests run against.
3
+ *
4
+ * Not exported from the package barrel: it is test scaffolding, and a consumer
5
+ * that wants a fake IAM should be given the real one in a container rather than
6
+ * this. It lives in `src/` all the same so the type checker holds it to the same
7
+ * standard as the code it exercises — a fixture that has drifted from
8
+ * {@link FetchLike} is a fixture that proves nothing.
9
+ *
10
+ * It implements {@link FetchLike} directly instead of pulling in an HTTP mocking
11
+ * library, which is possible only because `http.ts` asks for four properties and
12
+ * one method rather than for the whole of `Response`. Routes are matched on
13
+ * method and pathname; every call is recorded with its query, headers and parsed
14
+ * body, so a test can assert *what was sent* and not merely what came back.
15
+ */
16
+ import { type IamErrorCode } from '@plantops/contracts';
17
+ import type { FetchLike } from '../http.js';
18
+ export interface MockRequest {
19
+ method: string;
20
+ /** Pathname only — the query is parsed out into {@link MockRequest.query}. */
21
+ path: string;
22
+ query: Record<string, string>;
23
+ /** Lower-cased header names, as the transport sends them. */
24
+ headers: Record<string, string>;
25
+ /** The parsed JSON body, or `undefined` when none was sent. */
26
+ body: unknown;
27
+ }
28
+ export interface MockReply {
29
+ /** Defaults to 200 with a body, 204 without one. */
30
+ status?: number;
31
+ body?: unknown;
32
+ /** Sent instead of `body`, verbatim — for the not-JSON cases. */
33
+ text?: string;
34
+ headers?: Record<string, string>;
35
+ }
36
+ export type MockHandler = (request: MockRequest) => MockReply | Promise<MockReply>;
37
+ /** The Doc 06 §2 envelope, for the tests that assert on error mapping. */
38
+ export declare function errorReply(code: IamErrorCode, message?: string, extra?: {
39
+ requestId?: string;
40
+ details?: {
41
+ field: string;
42
+ message: string;
43
+ }[];
44
+ }): MockReply;
45
+ export declare class MockIamServer {
46
+ /** Every request that reached the server, in order. */
47
+ readonly calls: MockRequest[];
48
+ private readonly routes;
49
+ /** Answers this route for as long as the test runs. */
50
+ on(method: string, path: string, reply: MockHandler | MockReply): this;
51
+ /**
52
+ * Answers this route once, then falls through to any standing route.
53
+ *
54
+ * What the refresh tests are built on: the first `GET /iam/users` is a `401`,
55
+ * the second — after the client has renewed — is the real answer.
56
+ */
57
+ once(method: string, path: string, reply: MockHandler | MockReply): this;
58
+ /** Requests to `path`, in order. */
59
+ callsTo(method: string, path: string): MockRequest[];
60
+ countOf(method: string, path: string): number;
61
+ readonly fetch: FetchLike;
62
+ private add;
63
+ private match;
64
+ }
65
+ //# sourceMappingURL=mock-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.d.ts","sourceRoot":"","sources":["../../src/testing/mock-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,KAAK,EAAE,SAAS,EAAqC,MAAM,YAAY,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,+DAA+D;IAC/D,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAUnF,0EAA0E;AAC1E,wBAAgB,UAAU,CACxB,IAAI,EAAE,YAAY,EAClB,OAAO,SAAY,EACnB,KAAK,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAO,GACjF,SAAS,CAYX;AAED,qBAAa,aAAa;IACxB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,CAAM;IAEnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IAEtC,uDAAuD;IACvD,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI;IAItE;;;;;OAKG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI;IAIxE,oCAAoC;IACpC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE;IAMpD,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAI7C,QAAQ,CAAC,KAAK,EAAE,SAAS,CA2BvB;IAEF,OAAO,CAAC,GAAG;IAYX,OAAO,CAAC,KAAK;CASd"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * The mocked server the unit tests run against.
3
+ *
4
+ * Not exported from the package barrel: it is test scaffolding, and a consumer
5
+ * that wants a fake IAM should be given the real one in a container rather than
6
+ * this. It lives in `src/` all the same so the type checker holds it to the same
7
+ * standard as the code it exercises — a fixture that has drifted from
8
+ * {@link FetchLike} is a fixture that proves nothing.
9
+ *
10
+ * It implements {@link FetchLike} directly instead of pulling in an HTTP mocking
11
+ * library, which is possible only because `http.ts` asks for four properties and
12
+ * one method rather than for the whole of `Response`. Routes are matched on
13
+ * method and pathname; every call is recorded with its query, headers and parsed
14
+ * body, so a test can assert *what was sent* and not merely what came back.
15
+ */
16
+ import { IAM_ERROR_HTTP_STATUS } from '@plantops/contracts';
17
+ /** The Doc 06 §2 envelope, for the tests that assert on error mapping. */
18
+ export function errorReply(code, message = 'refused', extra = {}) {
19
+ return {
20
+ status: IAM_ERROR_HTTP_STATUS[code],
21
+ body: {
22
+ error: {
23
+ code,
24
+ message,
25
+ requestId: extra.requestId ?? 'req-test',
26
+ ...(extra.details === undefined ? {} : { details: extra.details }),
27
+ },
28
+ },
29
+ };
30
+ }
31
+ export class MockIamServer {
32
+ /** Every request that reached the server, in order. */
33
+ calls = [];
34
+ routes = [];
35
+ /** Answers this route for as long as the test runs. */
36
+ on(method, path, reply) {
37
+ return this.add(method, path, reply, false);
38
+ }
39
+ /**
40
+ * Answers this route once, then falls through to any standing route.
41
+ *
42
+ * What the refresh tests are built on: the first `GET /iam/users` is a `401`,
43
+ * the second — after the client has renewed — is the real answer.
44
+ */
45
+ once(method, path, reply) {
46
+ return this.add(method, path, reply, true);
47
+ }
48
+ /** Requests to `path`, in order. */
49
+ callsTo(method, path) {
50
+ return this.calls.filter((call) => call.method === method.toUpperCase() && call.path === path);
51
+ }
52
+ countOf(method, path) {
53
+ return this.callsTo(method, path).length;
54
+ }
55
+ fetch = async (url, init) => {
56
+ const parsed = new URL(url);
57
+ const request = {
58
+ method: init.method.toUpperCase(),
59
+ path: parsed.pathname,
60
+ query: Object.fromEntries(parsed.searchParams.entries()),
61
+ headers: lowerCased(init.headers),
62
+ body: init.body === undefined ? undefined : JSON.parse(init.body),
63
+ };
64
+ this.calls.push(request);
65
+ if (init.signal?.aborted === true) {
66
+ throw new DOMExceptionLike('This operation was aborted');
67
+ }
68
+ const route = this.match(request);
69
+ if (route === undefined) {
70
+ throw new Error(`MockIamServer has no route for ${request.method} ${request.path}`);
71
+ }
72
+ route.spent = true;
73
+ return respond(await route.handler(request));
74
+ };
75
+ add(method, path, reply, once) {
76
+ const handler = typeof reply === 'function' ? reply : () => reply;
77
+ this.routes.push({ method: method.toUpperCase(), path, handler, once, spent: false });
78
+ return this;
79
+ }
80
+ match(request) {
81
+ // One-shots first, so `once()` genuinely precedes a standing `on()`.
82
+ const matches = (route) => route.method === request.method && route.path === request.path;
83
+ return (this.routes.find((route) => route.once && !route.spent && matches(route)) ??
84
+ this.routes.find((route) => !route.once && matches(route)));
85
+ }
86
+ }
87
+ function respond(reply) {
88
+ const status = reply.status ?? (reply.body === undefined && reply.text === undefined ? 204 : 200);
89
+ const text = reply.text ?? (reply.body === undefined ? '' : JSON.stringify(reply.body));
90
+ const headers = lowerCased(reply.headers ?? {});
91
+ return {
92
+ ok: status >= 200 && status < 300,
93
+ status,
94
+ headers: { get: (name) => headers[name.toLowerCase()] ?? null },
95
+ text: () => Promise.resolve(text),
96
+ };
97
+ }
98
+ function lowerCased(headers) {
99
+ return Object.fromEntries(Object.entries(headers).map(([name, value]) => [name.toLowerCase(), value]));
100
+ }
101
+ /** `DOMException` is not in every runtime's Node typings; the name is what matters. */
102
+ class DOMExceptionLike extends Error {
103
+ constructor(message) {
104
+ super(message);
105
+ this.name = 'AbortError';
106
+ }
107
+ }
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2025.float16.d.ts","../../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/tslib/tslib.d.ts","../../../node_modules/tslib/modules/index.d.ts","../../contracts/dist/pagination.d.ts","../../contracts/dist/audit.d.ts","../../contracts/dist/jwt.d.ts","../../contracts/dist/bindings.d.ts","../../contracts/dist/clients.d.ts","../../contracts/dist/constants.d.ts","../../contracts/dist/entitlements.d.ts","../../contracts/dist/errors.d.ts","../../contracts/dist/grants.d.ts","../../contracts/dist/nav.d.ts","../../contracts/dist/manifest.d.ts","../../contracts/dist/registry.d.ts","../../contracts/dist/roles.d.ts","../../contracts/dist/scopes.d.ts","../../contracts/dist/service-accounts.d.ts","../../contracts/dist/users.d.ts","../../contracts/dist/type-assertions.d.ts","../../contracts/dist/index.d.ts","../src/auth.ts","../src/errors.ts","../src/http.ts","../src/endpoints/applications.ts","../src/endpoints/audit.ts","../src/endpoints/auth.ts","../src/endpoints/authz.ts","../src/endpoints/bindings.ts","../src/endpoints/clients.ts","../src/endpoints/entitlements.ts","../src/endpoints/navigation.ts","../src/endpoints/roles.ts","../src/endpoints/scopes.ts","../src/endpoints/service-accounts.ts","../src/endpoints/users.ts","../src/endpoints/index.ts","../src/resolve-cache.ts","../src/client.ts","../src/index.ts","../src/testing/mock-server.ts","../../../node_modules/@types/node/compatibility/iterators.d.ts","../../../node_modules/@types/node/globals.typedarray.d.ts","../../../node_modules/@types/node/buffer.buffer.d.ts","../../../node_modules/@types/node/globals.d.ts","../../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../../node_modules/@types/node/web-globals/crypto.d.ts","../../../node_modules/@types/node/web-globals/domexception.d.ts","../../../node_modules/@types/node/web-globals/events.d.ts","../../../node_modules/undici-types/utility.d.ts","../../../node_modules/undici-types/header.d.ts","../../../node_modules/undici-types/readable.d.ts","../../../node_modules/undici-types/fetch.d.ts","../../../node_modules/undici-types/formdata.d.ts","../../../node_modules/undici-types/connector.d.ts","../../../node_modules/undici-types/client-stats.d.ts","../../../node_modules/undici-types/client.d.ts","../../../node_modules/undici-types/errors.d.ts","../../../node_modules/undici-types/dispatcher.d.ts","../../../node_modules/undici-types/global-dispatcher.d.ts","../../../node_modules/undici-types/global-origin.d.ts","../../../node_modules/undici-types/pool-stats.d.ts","../../../node_modules/undici-types/pool.d.ts","../../../node_modules/undici-types/handlers.d.ts","../../../node_modules/undici-types/balanced-pool.d.ts","../../../node_modules/undici-types/round-robin-pool.d.ts","../../../node_modules/undici-types/h2c-client.d.ts","../../../node_modules/undici-types/agent.d.ts","../../../node_modules/undici-types/mock-interceptor.d.ts","../../../node_modules/undici-types/mock-call-history.d.ts","../../../node_modules/undici-types/mock-agent.d.ts","../../../node_modules/undici-types/mock-client.d.ts","../../../node_modules/undici-types/mock-pool.d.ts","../../../node_modules/undici-types/snapshot-agent.d.ts","../../../node_modules/undici-types/mock-errors.d.ts","../../../node_modules/undici-types/proxy-agent.d.ts","../../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../../node_modules/undici-types/retry-handler.d.ts","../../../node_modules/undici-types/retry-agent.d.ts","../../../node_modules/undici-types/api.d.ts","../../../node_modules/undici-types/cache-interceptor.d.ts","../../../node_modules/undici-types/interceptors.d.ts","../../../node_modules/undici-types/util.d.ts","../../../node_modules/undici-types/cookies.d.ts","../../../node_modules/undici-types/patch.d.ts","../../../node_modules/undici-types/websocket.d.ts","../../../node_modules/undici-types/eventsource.d.ts","../../../node_modules/undici-types/diagnostics-channel.d.ts","../../../node_modules/undici-types/content-type.d.ts","../../../node_modules/undici-types/cache.d.ts","../../../node_modules/undici-types/index.d.ts","../../../node_modules/@types/node/web-globals/fetch.d.ts","../../../node_modules/@types/node/web-globals/navigator.d.ts","../../../node_modules/@types/node/web-globals/storage.d.ts","../../../node_modules/@types/node/web-globals/streams.d.ts","../../../node_modules/@types/node/assert.d.ts","../../../node_modules/@types/node/assert/strict.d.ts","../../../node_modules/@types/node/async_hooks.d.ts","../../../node_modules/@types/node/buffer.d.ts","../../../node_modules/@types/node/child_process.d.ts","../../../node_modules/@types/node/cluster.d.ts","../../../node_modules/@types/node/console.d.ts","../../../node_modules/@types/node/constants.d.ts","../../../node_modules/@types/node/crypto.d.ts","../../../node_modules/@types/node/dgram.d.ts","../../../node_modules/@types/node/diagnostics_channel.d.ts","../../../node_modules/@types/node/dns.d.ts","../../../node_modules/@types/node/dns/promises.d.ts","../../../node_modules/@types/node/domain.d.ts","../../../node_modules/@types/node/events.d.ts","../../../node_modules/@types/node/fs.d.ts","../../../node_modules/@types/node/fs/promises.d.ts","../../../node_modules/@types/node/http.d.ts","../../../node_modules/@types/node/http2.d.ts","../../../node_modules/@types/node/https.d.ts","../../../node_modules/@types/node/inspector.d.ts","../../../node_modules/@types/node/inspector.generated.d.ts","../../../node_modules/@types/node/module.d.ts","../../../node_modules/@types/node/net.d.ts","../../../node_modules/buffer/index.d.ts","../../../node_modules/@types/node/os.d.ts","../../../node_modules/@types/node/path.d.ts","../../../node_modules/@types/node/perf_hooks.d.ts","../../../node_modules/@types/node/process.d.ts","../../../node_modules/@types/node/punycode.d.ts","../../../node_modules/@types/node/querystring.d.ts","../../../node_modules/@types/node/readline.d.ts","../../../node_modules/@types/node/readline/promises.d.ts","../../../node_modules/@types/node/repl.d.ts","../../../node_modules/@types/node/sea.d.ts","../../../node_modules/@types/node/sqlite.d.ts","../../../node_modules/@types/node/stream.d.ts","../../../node_modules/@types/node/stream/promises.d.ts","../../../node_modules/@types/node/stream/consumers.d.ts","../../../node_modules/@types/node/stream/web.d.ts","../../../node_modules/@types/node/string_decoder.d.ts","../../../node_modules/@types/node/test.d.ts","../../../node_modules/@types/node/timers.d.ts","../../../node_modules/@types/node/timers/promises.d.ts","../../../node_modules/@types/node/tls.d.ts","../../../node_modules/@types/node/trace_events.d.ts","../../../node_modules/@types/node/tty.d.ts","../../../node_modules/@types/node/url.d.ts","../../../node_modules/@types/node/util.d.ts","../../../node_modules/@types/node/v8.d.ts","../../../node_modules/@types/node/vm.d.ts","../../../node_modules/@types/node/wasi.d.ts","../../../node_modules/@types/node/worker_threads.d.ts","../../../node_modules/@types/node/zlib.d.ts","../../../node_modules/@types/node/index.d.ts"],"fileIdsList":[[62,102,157,174,175],[62,64,102,157,174,175],[102,157,174,175],[64,102,157,174,175],[62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,102,157,174,175],[71,102,157,174,175],[61,79,102,157,174,175],[61,79,80,82,95,96,102,157,174,175],[61,79,82,102,157,174,175],[61,79,80,82,102,157,174,175],[61,83,84,85,86,87,88,89,90,91,92,93,94,102,157,174,175],[61,81,102,157,174,175],[61,80,81,82,95,96,97,102,157,174,175],[102,154,155,157,174,175],[102,156,157,174,175],[157,174,175],[102,157,162,174,175,193],[102,157,158,163,168,174,175,177,190,201],[102,157,158,159,168,174,175,177],[102,157,160,174,175,202],[102,157,161,162,169,174,175,179],[102,157,162,174,175,190,198],[102,157,163,165,168,174,175,177],[102,156,157,164,174,175],[102,157,165,166,174,175],[102,157,167,168,174,175],[102,156,157,168,174,175],[102,157,168,169,170,174,175,190,201],[102,157,168,169,170,174,175,185,190,193],[102,149,157,165,168,171,174,175,177,190,201],[102,157,168,169,171,172,174,175,177,190,198,201],[102,157,171,173,174,175,190,198,201],[100,101,102,103,104,105,106,107,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207],[102,157,168,174,175],[102,157,174,175,176,201],[102,157,165,168,174,175,177,190],[102,157,174,175,179],[102,157,174,175,180],[102,156,157,174,175,181],[102,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207],[102,157,174,175,183],[102,157,174,175,184],[102,157,168,174,175,185,186],[102,157,174,175,185,187,202,204],[102,157,169,174,175],[102,157,168,174,175,190,191,193],[102,157,174,175,192,193],[102,157,174,175,190,191],[102,157,174,175,193],[102,157,174,175,194],[102,154,157,174,175,190,195,201],[102,157,168,174,175,196,197],[102,157,174,175,196,197],[102,157,162,174,175,177,190,198],[102,157,174,175,199],[102,157,174,175,177,200],[102,157,171,174,175,184,201],[102,157,162,174,175,202],[102,157,174,175,190,203],[102,157,174,175,176,204],[102,157,174,175,205],[102,157,162,174,175],[102,149,157,174,175],[102,157,174,175,206],[102,149,157,168,170,174,175,181,190,193,201,203,204,206],[102,157,174,175,190,207],[60,102,157,174,175],[102,114,117,120,121,157,174,175,201],[102,117,157,174,175,190,201],[102,117,121,157,174,175,201],[102,157,174,175,190],[102,111,157,174,175],[102,115,157,174,175],[102,113,114,117,157,174,175,201],[102,157,174,175,177,198],[102,157,174,175,208],[102,111,157,174,175,208],[102,113,117,157,174,175,177,201],[102,108,109,110,112,116,157,168,174,175,190,201],[102,117,126,134,157,174,175],[102,109,115,157,174,175],[102,117,143,144,157,174,175],[102,109,112,117,157,174,175,193,201,208],[102,117,157,174,175],[102,113,117,157,174,175,201],[102,108,157,174,175],[102,111,112,113,115,116,117,118,119,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,144,145,146,147,148,157,174,175],[102,117,136,139,157,165,174,175],[102,117,126,127,128,157,174,175],[102,115,117,127,129,157,174,175],[102,116,157,174,175],[102,109,111,117,157,174,175],[102,117,121,127,129,157,174,175],[102,121,157,174,175],[102,115,117,120,157,174,175,201],[102,109,113,117,126,157,174,175],[102,117,136,157,174,175],[102,129,157,174,175],[102,111,117,143,157,174,175,193,206,208]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"f128dae7c44d8f35ee42e0a437000a57c9f06cc04f8b4fb42eebf44954d53dc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ecb8e347cb6b2a8927c09b86263663289418df375f5e68e11a0ae683776978f","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"b8f34dd1757f68e03262b1ca3ddfa668a855b872f8bdd5224d6f993a7b37dc2c","impliedFormat":99},{"version":"0787bad8965f33e14c457c927a9414f089358230ab013ace14d628672e9f1371","impliedFormat":99},{"version":"e1e1e6e0a027d1733330893d8bcff10ffa4bee5e9cf7830a2e30f6e1425f2769","impliedFormat":99},{"version":"ecc87f9707c193354f6d0d17a99f9c783b0bfd04c46de55fb55def8b9e2b282c","impliedFormat":99},{"version":"ddf71d20f14b99cc79742baf0931f3ad4ae77b6da4eaf4d96cc4df6376866614","impliedFormat":99},{"version":"894acbdbba0549194448cbc16b7939ba33029c6789ec6aaafd15cb627363a167","impliedFormat":99},{"version":"0809b080db435bb7eaf782371ed4d96454082e76a82f348f2f9893d5255abcaf","impliedFormat":99},{"version":"6fa457d5200d8bab3e0db67e04b5cea88f1691c2d88519a9353ac1684ac3f761","impliedFormat":99},{"version":"28c9aa6bb48decc48555e6526168ea26a02e119fda5b139d74f88ffc15ab41e7","impliedFormat":99},{"version":"4ba594355c13972e44fcb30a457c40c461467745a8e571a15e14eda7da2257b3","impliedFormat":99},{"version":"7724ca0fde7516f715d26728512db8c9eeb6336eaa1d355fee3f5fe773d9c349","impliedFormat":99},{"version":"16d05cc4333b2868cd5ca4c4504cc08c2d60f134092cab3e0abe36cdc936e7d3","impliedFormat":99},{"version":"4d1d4f9da536b54034fb6c3f9721a78b4b660709f582490f3c516ae8ce239dd1","impliedFormat":99},{"version":"ed43432219cc28fd013f14b5ccd2c75e04aa1bfddd6e66cd757f7cef1e70795f","impliedFormat":99},{"version":"7e781d0ce396f49c8767e893df4b159b2c77d0f7559c3953fa17ad4672c35435","impliedFormat":99},{"version":"960d673592fd09c39a9a3eb99d42491232853f31bd827dcdbc524dda0ddd3998","impliedFormat":99},{"version":"50db98ac542637161ba738c4f94a4c3a66275d044636bc989c809efa3b6d5c4e","impliedFormat":99},{"version":"53fde18368af57fa8e0712889fd3ceee35f86c21b858d148401cd193e20c7355","impliedFormat":99},{"version":"bb675cd786baef8bd4d5ca3cfcf22cb25052be4bf31b5979fa24972eb8dbce0e","impliedFormat":99},{"version":"402a40f0ec1b8c419c95ab09931bf1afbf416957b5e7a24df40b6b3c1eb43061","signature":"d460fe899ccdbda638963e00a88edecba507f54e0fc8aafb55567f74a0f00348","impliedFormat":99},{"version":"677a9492faf6599fdb73550957708a9b4f892da4a545abf5e886697a4987ece1","signature":"f22c4398e78ceec3dfa00b6dca89444138bf039e0f5aef9f91c4f10181858bb2","impliedFormat":99},{"version":"cc35d0fc20609c2d347a81347bec2f139e24e2ca371bc5f061e08201a5143555","signature":"894cf97dd3769060d792827942a5a1ba83ea3f344a83b26f88e14205a9f9768e","impliedFormat":99},{"version":"2ba37521260febf35886e39ef1830d35d8dd71aec20fc27eeb28fb38f14c31d8","signature":"f20f44ae2edd6474a017ec553ff5469d20999eb66cc1c37cda0fe49a2037041a","impliedFormat":99},{"version":"e69649efd681427882d52cfba2e9b68dacf7d0b25451a74acd8b8a401c29733c","signature":"5fe63d28089b32abe8e14eb2fa4e2aca2477f68ede79bf654403ea75f5abfea1","impliedFormat":99},{"version":"2d1ad2f7a594a6fde3f3fb90b079171b18c1957a03569f233520325d52f64ac4","signature":"539324ed252d5f383e1d380dfba4dd363c147381faaf00c1a96d78786cc3b62f","impliedFormat":99},{"version":"f0e854fd720bab2026c02deeef6c66b738df0fb2d2541a8d993e66e2a733f6eb","signature":"dc633cab6fd1d0d06edd64efd2a61ca6eda40a7aa2ec3c30db3f88fed8dcbe1a","impliedFormat":99},{"version":"4cc494ce18563f66a0c8ead0276cea3a097fa06f6bbf51a781f408f6242c152f","signature":"86fcd313c96847a4d0ca97f701efd5196c4509763700c5e16e308c73f8f4df6a","impliedFormat":99},{"version":"97c05d146a0de74510d3c56809e8ad6f1d1f61a370da7a7ede6b59e8e9f5cb05","signature":"462dec388a64cecbbe77071cf658788dbdb03bad83ec97d7a3d09cbb2ebb2473","impliedFormat":99},{"version":"fb26f097597cd7f936d632d529a7e84753503d01782bdb4157711dfd0c487d39","signature":"edc5808d1bc68dbce9d0af75eb0ffd43a2850649b1e5684906d24f0a2eea7b83","impliedFormat":99},{"version":"8357da070b4142b308049aa9ebde9b5c67e34ace9f9b5c98f3fcdd337585e9aa","signature":"1a58e0a044f49c0e5ad6a599a827417d0c016d6edb6cd2fa35e4b9106cc7fb89","impliedFormat":99},{"version":"f016e5891740c6e3c360c1f50ba03561c55831c1cab1b1b0e77fe7f7aa4754f2","signature":"db111c4082a393a149f0a9cd763aa8854bad90fb0f2605b6b9107b55849cc3c2","impliedFormat":99},{"version":"580a7017fe383c0bf655dc611cddd5fee4a3304dcbbf3421f13fd7d9efd64640","signature":"1d0f8201792f8c7d0d15ce33424491258025499273a49e9df9dc8d05b12949fa","impliedFormat":99},{"version":"c075376f662179d9ff55dfe5fe1ebf9c270b875041e789ad4b4f32fba8470e34","signature":"57c7a229a8503faddb4fa6cc861cdde77387aea3ebb445a743e98b4d45a61f1f","impliedFormat":99},{"version":"596e83f213a6e5b4de9ebfc2f57453d753f9891bf4bbcdfa84c3ab87e2422b82","signature":"7fd3f83f5bae3bce83ffbcba315ffc67a2000204ec6492d8f4e71ec2d047401b","impliedFormat":99},{"version":"0e16df810c4ab5069227cf1080f0fc594b03935b2cb8700c82beba1a1bc67c04","signature":"7f6bf52b5317b31fee3f24c0051475234e2dfde2ee8425855b8e8652093bcca4","impliedFormat":99},{"version":"7997b689d3e0e1a649d668edef746c9597215254a89789a95d61e037df1b6bd3","signature":"98c8c3c50148d550506af27b1372a9c246703e7c26f06b6f3fdc8e7937ea9c00","impliedFormat":99},{"version":"5f59719826ddfe1f0e13a0bed19a6a7df963341ef085279b27967989ae7e4501","signature":"56e598f786fe040e50c26a973fab9855e2eff499c15b6c7593494325b7c59c43","impliedFormat":99},{"version":"45513c740cdc5c1bd4ecf47d0ba4234c03d54b4f106d478f0a6ba75a3095e451","signature":"ddfe2e8fd02496116f2b219c139d7b8e2fa6f6919d85152134fd16c2000b0834","impliedFormat":99},{"version":"8d71b5e1df11a8fefd175c4f8c131894ed5eaa798cac63c115a0eda0fc9cdf24","signature":"08d10d1bec8ed23d329842484f60327819a742b9bedad84bc77dc8de4d4e3339","impliedFormat":99},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"378281aa35786c27d5811af7e6bcaa492eebd0c7013d48137c35bbc69a2b9751","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"1b2dd1cbeb0cc6ae20795958ba5950395ebb2849b7c8326853dd15530c77ab0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"10ec5e82144dfac6f04fa5d1d6c11763b3e4dbbac6d99101427219ab3e2ae887","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"074de5b2fdead0165a2757e3aaef20f27a6347b1c36adea27d51456795b37682","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"24371e69a38fc33e268d4a8716dbcda430d6c2c414a99ff9669239c4b8f40dea","impliedFormat":1},{"version":"ccab02f3920fc75c01174c47fcf67882a11daf16baf9e81701d0a94636e94556","impliedFormat":1},{"version":"3e11fce78ad8c0e1d1db4ba5f0652285509be3acdd519529bc8fcef85f7dafd9","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"9c32412007b5662fd34a8eb04292fb5314ec370d7016d1c2fb8aa193c807fe22","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"6ebe8ebb8659aaa9d1acbf3710d7dae3e923e97610238b9511c25dc39023a166","impliedFormat":1},{"version":"e85d7f8068f6a26710bff0cc8c0fc5e47f71089c3780fbede05857331d2ddec9","impliedFormat":1},{"version":"7befaf0e76b5671be1d47b77fcc65f2b0aad91cc26529df1904f4a7c46d216e9","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"5b03a034c72146b61573aab280f295b015b9168470f2df05f6080a2122f9b4df","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"c63b9ada8c72f95aac5db92aea07e5e87ec810353cdf63b2d78f49a58662cf6c","impliedFormat":1},{"version":"1cc2a09e1a61a5222d4174ab358a9f9de5e906afe79dbf7363d871a7edda3955","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"b64d4d1c5f877f9c666e98e833f0205edb9384acc46e98a1fef344f64d6aba44","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"c9381908473a1c92cb8c516b184e75f4d226dad95c3a85a5af35f670064d9a2f","impliedFormat":1},{"version":"f724236417941ea77ec8d38c6b7021f5fb7f8521c7f8c1538e87661f2c6a0774","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ea15fd99b2e34cb25fe8346c955000bb70c8b423ae4377a972ef46bfb37f595","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"f9b4137a0d285bd77dba2e6e895530112264310ae47e07bf311feae428fb8b61","affectsGlobalScope":true,"impliedFormat":1},{"version":"c06b2652ffeb89afd0f1c52c165ced77032f9cd09bc481153fbd6b5504c69494","impliedFormat":1},{"version":"51aecd2df90a3cffea1eb4696b33b2d78594ea2aa2138e6b9471ec4841c6c2ee","impliedFormat":1},{"version":"9d8f9e63e29a3396285620908e7f14d874d066caea747dc4b2c378f0599166b4","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"612422d5ba6b4a5c4537f423e9199645468ad80a689801da63ab7edb43f7b835","impliedFormat":1},{"version":"db9ada976f9e52e13f7ae8b9a320f4b67b87685938c5879187d8864b2fbe97f3","impliedFormat":1},{"version":"9f39e70a354d0fba29ac3cdf6eca00b7f9e96f64b2b2780c432e8ea27f133743","impliedFormat":1},{"version":"0dace96cc0f7bc6d0ee2044921bdf19fe42d16284dbcc8ae200800d1c9579335","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"1cbdcdef62bf42688e5d825898c3a59458466c48ad8a4ef3f88d8a1cd04310d6","impliedFormat":1},{"version":"c64e1888baaa3253ca4405b455e4bf44f76357868a1bd0a52998ade9a092ad78","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc8c6f5322961b56d9906601b20798725df60baeab45ec014fba9f795d5596fd","impliedFormat":1},{"version":"67e435fa530778903f5525904e6645b7368eb5ac622055febd19bb399e328ccd","impliedFormat":1},{"version":"060d305fe4494d8cb2b99d620928d369d1ee55c1645f5e729a2aca07d0f108cb","impliedFormat":1},{"version":"5b22bf96be06fca1e134e3a85351ffe7aa2edf0c9a5bd175b7239ee48186dbf5","impliedFormat":1},{"version":"0c50296ee73dae94efc3f0da4936b1146ca6ce2217acfabb44c19c9a33fa30e5","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"5b48cc670da1dfe926036deaf349085caf822def460a6d50de23f1cc12a5f8cd","impliedFormat":1},{"version":"418f34087d52d001e2688a6282a5de9bf583ff771ed5546af0ae36e4f60a458b","affectsGlobalScope":true,"impliedFormat":1},{"version":"036c9a03b01281f99f8251fdc7088e894566be44b3f139a9d48501a978b611df","impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"ff65b8a8bd380c6d129becc35de02f7c29ad7ce03300331ca91311fb4044d1a9","impliedFormat":1},{"version":"04bf1aa481d1adfb16d93d76e44ce71c51c8ef68039d849926551199489637f6","impliedFormat":1},{"version":"2c9adcc85574b002c9a6311ff2141055769e0071856ec979d92ff989042b1f1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1569ad5969ae0de6ad0bdfaaab0dabcd8878bc3147ab096206eed2019bb84e7f","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"42a350ce4f6f291198dc89833afcc4fd078248b4e1fdc9d05c846c66a670f710","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"5fb39858b2459864b139950a09adae4f38dad87c25bf572ce414f10e4bd7baab","impliedFormat":1},{"version":"b03754211d839cdc48979996525a32eb62130682c2f9801dfc2f25533ce7238d","impliedFormat":1},{"version":"3910dab597c40e173bf0e0d419d3ce9682c54ebf6ae84849f9b829b1451a17ec","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"486c074a5c0f2254345c0d1c9540380f5463999e42d7e1a159305ea823d3c4b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"c119835edf36415081dfd9ed15fc0cd37aaa28d232be029ad073f15f3d88c323","impliedFormat":1},{"version":"f4d99ac08c4097a3cc202bec2c7198c19dcdd80d4ec6c62d1356b10d03b119d5","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"ca77e83162eccec633513723d178d4203bdd5465297267696be08013bab0aa1d","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"f61c153d5abbe4381a1fba0d41be0babdd5de51c626ee7ff14cede14dedc33f1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7803171d745ab18e77f16bf82e742268ff72b7f7382ab191e4277527580c2d89","affectsGlobalScope":true,"impliedFormat":1},{"version":"0e9ba65cd3d6d194bdda7343f9f2917f7144ead96a924ca58d1a14919992dc20","impliedFormat":1},{"version":"255d948f87f24ffd57bcb2fdf95792fd418a2e1f712a98cf2cce88744d75085c","impliedFormat":1},{"version":"0d5b085f36e6dc55bc6332ecb9c733be3a534958c238fb8d8d18d4a2b6f2a15a","impliedFormat":1},{"version":"0b0dfb2d3e8420ead06f6a11acfb02ddcec42257e6ce391993e895ba0af86de4","affectsGlobalScope":true,"impliedFormat":1},{"version":"bfd3b3c21a56104693183942e221c1896ee23bcb8f8d91ab0b941f7b32985411","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1}],"root":[[80,99]],"options":{"composite":true,"declarationMap":true,"emitDeclarationOnly":false,"esModuleInterop":false,"importHelpers":true,"module":199,"noEmitOnError":true,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUncheckedSideEffectImports":false,"noUnusedLocals":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./tsconfig.lib.tsbuildinfo"},"referencedMap":[[63,1],[65,2],[66,3],[67,3],[68,3],[69,3],[70,4],[79,5],[64,3],[72,6],[71,3],[62,3],[73,6],[74,3],[75,3],[76,3],[78,3],[77,3],[80,7],[97,8],[83,9],[84,9],[85,10],[86,9],[87,9],[88,9],[89,9],[95,11],[90,9],[91,9],[92,9],[93,9],[94,9],[81,7],[82,12],[98,13],[96,7],[99,9],[154,14],[155,14],[156,15],[102,16],[157,17],[158,18],[159,19],[100,3],[160,20],[161,21],[162,22],[163,23],[164,24],[165,25],[166,25],[167,26],[168,27],[169,28],[170,29],[103,3],[101,3],[171,30],[172,31],[173,32],[208,33],[174,34],[175,3],[176,35],[177,36],[179,37],[180,38],[181,39],[182,40],[183,41],[184,42],[185,43],[186,43],[187,44],[188,3],[189,45],[190,46],[192,47],[191,48],[193,49],[194,50],[195,51],[196,52],[197,53],[198,54],[199,55],[200,56],[201,57],[202,58],[203,59],[204,60],[205,61],[104,3],[105,62],[106,3],[107,3],[150,63],[151,64],[152,3],[153,49],[206,65],[207,66],[178,3],[61,67],[60,3],[58,3],[59,3],[11,3],[10,3],[2,3],[12,3],[13,3],[14,3],[15,3],[16,3],[17,3],[18,3],[19,3],[3,3],[20,3],[21,3],[4,3],[22,3],[26,3],[23,3],[24,3],[25,3],[27,3],[28,3],[29,3],[5,3],[30,3],[31,3],[32,3],[33,3],[6,3],[37,3],[34,3],[35,3],[36,3],[38,3],[7,3],[39,3],[44,3],[45,3],[40,3],[41,3],[42,3],[43,3],[8,3],[49,3],[46,3],[47,3],[48,3],[50,3],[9,3],[51,3],[52,3],[53,3],[55,3],[54,3],[56,3],[1,3],[57,3],[126,68],[138,69],[123,70],[139,71],[148,72],[114,73],[115,74],[113,75],[147,76],[142,77],[146,78],[117,79],[135,80],[116,81],[145,82],[111,83],[112,77],[118,84],[119,3],[125,85],[122,84],[109,86],[149,87],[140,88],[129,89],[128,84],[130,90],[133,91],[127,92],[131,93],[143,76],[120,94],[121,95],[134,96],[110,71],[137,97],[136,84],[124,95],[132,98],[141,3],[108,3],[144,99]],"latestChangedDtsFile":"./endpoints/clients.d.ts","version":"6.0.3"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@plantops/iam-client",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ "./package.json": "./package.json",
11
+ ".": {
12
+ "@plantops/source": "./src/index.ts",
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "nx": {
19
+ "tags": [
20
+ "type:lib",
21
+ "scope:client"
22
+ ]
23
+ },
24
+ "dependencies": {
25
+ "@plantops/contracts": "^0.1.0",
26
+ "tslib": "^2.3.0"
27
+ },
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/dileepraghumajji/plant-ops.git",
32
+ "directory": "libs/iam-client"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "files": [
38
+ "dist"
39
+ ]
40
+ }