@ogcio/building-blocks-sdk 0.0.10 → 0.0.12

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 (51) hide show
  1. package/README.md +55 -0
  2. package/dist/client/auth/index.d.ts.map +1 -1
  3. package/dist/client/auth/index.js +3 -1
  4. package/dist/client/auth/index.js.map +1 -1
  5. package/dist/client/clients/featureFlags/const.d.ts +3 -0
  6. package/dist/client/clients/featureFlags/const.d.ts.map +1 -0
  7. package/dist/client/clients/featureFlags/const.js +3 -0
  8. package/dist/client/clients/featureFlags/const.js.map +1 -0
  9. package/dist/client/clients/featureFlags/index.d.ts +34 -0
  10. package/dist/client/clients/featureFlags/index.d.ts.map +1 -0
  11. package/dist/client/clients/featureFlags/index.js +55 -0
  12. package/dist/client/clients/featureFlags/index.js.map +1 -0
  13. package/dist/client/clients/featureFlags/index.test.d.ts +2 -0
  14. package/dist/client/clients/featureFlags/index.test.d.ts.map +1 -0
  15. package/dist/client/clients/featureFlags/index.test.js +47 -0
  16. package/dist/client/clients/featureFlags/index.test.js.map +1 -0
  17. package/dist/client/clients/featureFlags/schema.d.ts +33769 -0
  18. package/dist/client/clients/featureFlags/schema.d.ts.map +1 -0
  19. package/dist/client/clients/featureFlags/schema.js +2 -0
  20. package/dist/client/clients/featureFlags/schema.js.map +1 -0
  21. package/dist/client/clients/featureFlags/utils.d.ts +4 -0
  22. package/dist/client/clients/featureFlags/utils.d.ts.map +1 -0
  23. package/dist/client/clients/featureFlags/utils.js +28 -0
  24. package/dist/client/clients/featureFlags/utils.js.map +1 -0
  25. package/dist/client/clients/featureFlags/utils.test.d.ts +2 -0
  26. package/dist/client/clients/featureFlags/utils.test.d.ts.map +1 -0
  27. package/dist/client/clients/featureFlags/utils.test.js +37 -0
  28. package/dist/client/clients/featureFlags/utils.test.js.map +1 -0
  29. package/dist/clients-configurations/clients-configuration.json +8 -0
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +5 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/types/index.d.ts +4 -1
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/types/index.js +1 -0
  36. package/dist/types/index.js.map +1 -1
  37. package/package.json +14 -3
  38. package/src/client/auth/index.ts +3 -1
  39. package/src/client/clients/featureFlags/const.ts +3 -0
  40. package/src/client/clients/featureFlags/index.test.ts +63 -0
  41. package/src/client/clients/featureFlags/index.ts +74 -0
  42. package/src/client/clients/featureFlags/open-api-definition.json +40422 -0
  43. package/src/client/clients/featureFlags/schema.ts +33768 -0
  44. package/src/client/clients/featureFlags/utils.test.ts +51 -0
  45. package/src/client/clients/featureFlags/utils.ts +42 -0
  46. package/src/clients-configurations/clients-configuration.json +8 -0
  47. package/src/index.ts +5 -0
  48. package/src/types/index.ts +5 -1
  49. package/tap.yml +14 -0
  50. package/tsconfig.json +1 -0
  51. package/vitest.config.cts +9 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../src/client/clients/featureFlags/schema.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type FeatureFlags from "./index.js";
2
+ declare const waitForConnection: (featureFlags: FeatureFlags, everyMs?: number, timeoutMs?: number) => Promise<void>;
3
+ export { waitForConnection };
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/client/clients/featureFlags/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,YAAY,MAAM,YAAY,CAAC;AAE3C,QAAA,MAAM,iBAAiB,iBACP,YAAY,2CAGzB,OAAO,CAAC,IAAI,CAgCd,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { FEATURE_FLAGS } from "../../../types/index.js";
2
+ const waitForConnection = (featureFlags, everyMs = 10, timeoutMs = 5000) => {
3
+ const fn = (interval, timeout, resolve, startTime) => {
4
+ if (featureFlags.isConnected) {
5
+ const elapsedTime = Date.now() - startTime;
6
+ console.log(`[${FEATURE_FLAGS}] Connected in ${elapsedTime}ms`);
7
+ clearInterval(interval);
8
+ clearTimeout(timeout);
9
+ resolve();
10
+ }
11
+ };
12
+ return new Promise((resolve, reject) => {
13
+ const startTime = Date.now();
14
+ console.log(`[${FEATURE_FLAGS}] Connecting...`);
15
+ const interval = setInterval(() => {
16
+ fn(interval, timeout, resolve, startTime);
17
+ }, everyMs);
18
+ const timeout = setTimeout(() => {
19
+ clearInterval(interval);
20
+ const message = `[${FEATURE_FLAGS}] Connection timed out after ${timeoutMs}ms`;
21
+ console.error(message);
22
+ reject(new Error(message));
23
+ }, timeoutMs);
24
+ fn(interval, timeout, resolve, startTime);
25
+ });
26
+ };
27
+ export { waitForConnection };
28
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/client/clients/featureFlags/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,MAAM,iBAAiB,GAAG,CACxB,YAA0B,EAC1B,OAAO,GAAG,EAAE,EACZ,SAAS,GAAG,IAAI,EACD,EAAE;IACjB,MAAM,EAAE,GAAG,CACT,QAAwB,EACxB,OAAuB,EACvB,OAAmB,EACnB,SAAiB,EACjB,EAAE;QACF,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,kBAAkB,WAAW,IAAI,CAAC,CAAC;YAChE,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,iBAAiB,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC5C,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,aAAa,gCAAgC,SAAS,IAAI,CAAC;YAC/E,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7B,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../../../src/client/clients/featureFlags/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import t from "tap";
2
+ import { FEATURE_FLAGS } from "../../../types/index.js";
3
+ import { waitForConnection } from "./utils.js";
4
+ t.test("waitForConnection", async (t) => {
5
+ t.test("should resolve when featureFlags is connected", async (t) => {
6
+ const mockFeatureFlags = {
7
+ isConnected: false,
8
+ };
9
+ // Simulate connection after 50ms
10
+ setTimeout(() => {
11
+ mockFeatureFlags.isConnected = true;
12
+ }, 50);
13
+ const consoles = t.capture(console, "log");
14
+ const startTime = Date.now();
15
+ await waitForConnection(mockFeatureFlags, 10);
16
+ const elapsedTime = Date.now() - startTime;
17
+ t.ok(elapsedTime >= 50);
18
+ t.match(consoles(), [
19
+ { args: [`[${FEATURE_FLAGS}] Connecting...`] },
20
+ { args: [/Connected in \d+ms/] },
21
+ ]);
22
+ t.end();
23
+ });
24
+ t.test("should throw an error if connection times out", async (t) => {
25
+ const mockFeatureFlags = {
26
+ isConnected: false,
27
+ };
28
+ const consoleLogSpy = t.capture(console, "log");
29
+ const startTime = Date.now();
30
+ await t.rejects(waitForConnection(mockFeatureFlags, 10, 30), `[${FEATURE_FLAGS}] Connection timed out after 30ms`);
31
+ const elapsedTime = Date.now() - startTime;
32
+ t.ok(elapsedTime >= 30);
33
+ t.match(consoleLogSpy(), [{ args: [`[${FEATURE_FLAGS}] Connecting...`] }]);
34
+ t.end();
35
+ });
36
+ });
37
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../../src/client/clients/featureFlags/utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtC,CAAC,CAAC,IAAI,CAAC,+CAA+C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAClE,MAAM,gBAAgB,GAAG;YACvB,WAAW,EAAE,KAAK;SACH,CAAC;QAElB,iCAAiC;QACjC,UAAU,CAAC,GAAG,EAAE;YACd,gBAAgB,CAAC,WAAW,GAAG,IAAI,CAAC;QACtC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,iBAAiB,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAE3C,CAAC,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE;YAClB,EAAE,IAAI,EAAE,CAAC,IAAI,aAAa,iBAAiB,CAAC,EAAE;YAC9C,EAAE,IAAI,EAAE,CAAC,oBAAoB,CAAC,EAAE;SACjC,CAAC,CAAC;QAEH,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC;IAEH,CAAC,CAAC,IAAI,CAAC,+CAA+C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAClE,MAAM,gBAAgB,GAAG;YACvB,WAAW,EAAE,KAAK;SACH,CAAC;QAElB,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,CAAC,CAAC,OAAO,CACb,iBAAiB,CAAC,gBAAgB,EAAE,EAAE,EAAE,EAAE,CAAC,EAC3C,IAAI,aAAa,mCAAmC,CACrD,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAE3C,CAAC,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,aAAa,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3E,CAAC,CAAC,GAAG,EAAE,CAAC;IACV,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -80,6 +80,14 @@
80
80
  "profile:entitlement:*"
81
81
  ],
82
82
  "updateDefinitions": true
83
+ },
84
+ {
85
+ "name": "featureFlags",
86
+ "openApiDefinitionUrl": "https://app.unleash-hosted.com/demo/docs/openapi.json",
87
+ "openApiDefinitionFormat": "json",
88
+ "citizenPermissions": [],
89
+ "publicServantPermissions": [],
90
+ "updateDefinitions": true
83
91
  }
84
92
  ]
85
93
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EAElB,MAAM,kBAAkB,CAAC;AAE1B,QAAA,MAAM,mBAAmB,WACf,sBAAsB,KAC7B,iBA4BF,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EAElB,MAAM,kBAAkB,CAAC;AAE1B,QAAA,MAAM,mBAAmB,WACf,sBAAsB,KAC7B,iBAgCF,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Analytics } from "@ogcio/analytics-sdk";
2
+ import FeatureFlags from "./client/clients/featureFlags/index.js";
2
3
  import Messaging from "./client/clients/messaging/index.js";
3
4
  import Payments from "./client/clients/payments/index.js";
4
5
  import Profile from "./client/clients/profile/index.js";
@@ -32,6 +33,10 @@ const getBuildingBlockSDK = (params) => {
32
33
  ...services.upload,
33
34
  getTokenFn,
34
35
  }),
36
+ featureFlags: new FeatureFlags({
37
+ ...services.featureFlags,
38
+ getTokenFn,
39
+ }),
35
40
  };
36
41
  };
37
42
  export default getBuildingBlockSDK;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,OAAO,SAAS,MAAM,qCAAqC,CAAC;AAC5D,OAAO,QAAQ,MAAM,oCAAoC,CAAC;AAC1D,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,SAAS,MAAM,qCAAqC,CAAC;AAC5D,OAAO,MAAM,MAAM,kCAAkC,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAQvD,MAAM,mBAAmB,GAAG,CAC1B,MAA8B,EACX,EAAE;IACrB,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IACxC,OAAO;QACL,SAAS,EAAE,IAAI,SAAS,CAAC;YACvB,GAAG,QAAQ,CAAC,SAAS;YACrB,UAAU;SACX,CAAC;QACF,SAAS,EAAE,IAAI,SAAS,CAAC;YACvB,GAAG,QAAQ,CAAC,SAAS;YACrB,UAAU;SACX,CAAC;QACF,QAAQ,EAAE,IAAI,QAAQ,CAAC;YACrB,GAAG,QAAQ,CAAC,QAAQ;YACpB,UAAU;SACX,CAAC;QACF,OAAO,EAAE,IAAI,OAAO,CAAC;YACnB,GAAG,QAAQ,CAAC,OAAO;YACnB,UAAU;SACX,CAAC;QACF,SAAS,EAAE,IAAI,SAAS,CAAC;YACvB,GAAG,QAAQ,CAAC,SAAS;YACrB,UAAU;SACX,CAAC;QACF,MAAM,EAAE,IAAI,MAAM,CAAC;YACjB,GAAG,QAAQ,CAAC,MAAM;YAClB,UAAU;SACX,CAAC;KACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,YAAY,MAAM,wCAAwC,CAAC;AAElE,OAAO,SAAS,MAAM,qCAAqC,CAAC;AAC5D,OAAO,QAAQ,MAAM,oCAAoC,CAAC;AAC1D,OAAO,OAAO,MAAM,mCAAmC,CAAC;AACxD,OAAO,SAAS,MAAM,qCAAqC,CAAC;AAC5D,OAAO,MAAM,MAAM,kCAAkC,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAQvD,MAAM,mBAAmB,GAAG,CAC1B,MAA8B,EACX,EAAE;IACrB,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IACxC,OAAO;QACL,SAAS,EAAE,IAAI,SAAS,CAAC;YACvB,GAAG,QAAQ,CAAC,SAAS;YACrB,UAAU;SACX,CAAC;QACF,SAAS,EAAE,IAAI,SAAS,CAAC;YACvB,GAAG,QAAQ,CAAC,SAAS;YACrB,UAAU;SACX,CAAC;QACF,QAAQ,EAAE,IAAI,QAAQ,CAAC;YACrB,GAAG,QAAQ,CAAC,QAAQ;YACpB,UAAU;SACX,CAAC;QACF,OAAO,EAAE,IAAI,OAAO,CAAC;YACnB,GAAG,QAAQ,CAAC,OAAO;YACnB,UAAU;SACX,CAAC;QACF,SAAS,EAAE,IAAI,SAAS,CAAC;YACvB,GAAG,QAAQ,CAAC,SAAS;YACrB,UAAU;SACX,CAAC;QACF,MAAM,EAAE,IAAI,MAAM,CAAC;YACjB,GAAG,QAAQ,CAAC,MAAM;YAClB,UAAU;SACX,CAAC;QACF,YAAY,EAAE,IAAI,YAAY,CAAC;YAC7B,GAAG,QAAQ,CAAC,YAAY;YACxB,UAAU;SACX,CAAC;KACH,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { Analytics } from "@ogcio/analytics-sdk";
2
+ import type FeatureFlags from "../client/clients/featureFlags/index.js";
2
3
  import type Messaging from "../client/clients/messaging/index.js";
3
4
  import type Payments from "../client/clients/payments/index.js";
4
5
  import type Profile from "../client/clients/profile/index.js";
@@ -10,7 +11,8 @@ export declare const PAYMENTS: "payments";
10
11
  export declare const PROFILE: "profile";
11
12
  export declare const SCHEDULER: "scheduler";
12
13
  export declare const UPLOAD: "upload";
13
- export type SERVICE_NAME = typeof ANALYTICS | typeof MESSAGING | typeof PAYMENTS | typeof PROFILE | typeof SCHEDULER | typeof UPLOAD;
14
+ export declare const FEATURE_FLAGS: "featureFlags";
15
+ export type SERVICE_NAME = typeof ANALYTICS | typeof MESSAGING | typeof PAYMENTS | typeof PROFILE | typeof SCHEDULER | typeof UPLOAD | typeof FEATURE_FLAGS;
14
16
  export type TokenFunction = (serviceName: SERVICE_NAME) => Promise<string> | string;
15
17
  export type M2MParams = {
16
18
  getOrganizationTokenParams?: GetOrganizationTokenParams;
@@ -34,6 +36,7 @@ type ServiceClients = {
34
36
  profile: typeof Profile;
35
37
  scheduler: typeof Scheduler;
36
38
  upload: typeof Upload;
39
+ featureFlags: typeof FeatureFlags;
37
40
  };
38
41
  export type BuildingBlocksSDK = {
39
42
  [key in keyof ServiceClients]: InstanceType<ServiceClients[key]>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,SAAS,MAAM,sCAAsC,CAAC;AAClE,OAAO,KAAK,QAAQ,MAAM,qCAAqC,CAAC;AAChE,OAAO,KAAK,OAAO,MAAM,oCAAoC,CAAC;AAC9D,OAAO,KAAK,SAAS,MAAM,sCAAsC,CAAC;AAClE,OAAO,KAAK,MAAM,MAAM,mCAAmC,CAAC;AAE5D,eAAO,MAAM,SAAS,aAAuB,CAAC;AAC9C,eAAO,MAAM,SAAS,aAAuB,CAAC;AAC9C,eAAO,MAAM,QAAQ,YAAsB,CAAC;AAC5C,eAAO,MAAM,OAAO,WAAqB,CAAC;AAC1C,eAAO,MAAM,SAAS,aAAuB,CAAC;AAC9C,eAAO,MAAM,MAAM,UAAoB,CAAC;AAExC,MAAM,MAAM,YAAY,GACpB,OAAO,SAAS,GAChB,OAAO,SAAS,GAChB,OAAO,QAAQ,GACf,OAAO,OAAO,GACd,OAAO,SAAS,GAChB,OAAO,MAAM,CAAC;AAElB,MAAM,MAAM,aAAa,GAAG,CAC1B,WAAW,EAAE,YAAY,KACtB,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAE9B,MAAM,MAAM,SAAS,GAAG;IACtB,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE;SACP,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,SAAS;KAClC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG;IAClD,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,EAAE,OAAO,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;KAC7B,GAAG,IAAI,MAAM,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE;SACP,GAAG,IAAI,MAAM,cAAc,CAAC,CAAC,EAAE,qBAAqB,CACnD,cAAc,CAAC,GAAG,CAAC,CACpB,CAAC,CAAC,CAAC;KACL,CAAC;IACF,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,kBAAkB;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,cAAc,EAAE,MAAM,CAAC;CACxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,YAAY,MAAM,yCAAyC,CAAC;AACxE,OAAO,KAAK,SAAS,MAAM,sCAAsC,CAAC;AAClE,OAAO,KAAK,QAAQ,MAAM,qCAAqC,CAAC;AAChE,OAAO,KAAK,OAAO,MAAM,oCAAoC,CAAC;AAC9D,OAAO,KAAK,SAAS,MAAM,sCAAsC,CAAC;AAClE,OAAO,KAAK,MAAM,MAAM,mCAAmC,CAAC;AAE5D,eAAO,MAAM,SAAS,aAAuB,CAAC;AAC9C,eAAO,MAAM,SAAS,aAAuB,CAAC;AAC9C,eAAO,MAAM,QAAQ,YAAsB,CAAC;AAC5C,eAAO,MAAM,OAAO,WAAqB,CAAC;AAC1C,eAAO,MAAM,SAAS,aAAuB,CAAC;AAC9C,eAAO,MAAM,MAAM,UAAoB,CAAC;AACxC,eAAO,MAAM,aAAa,gBAA0B,CAAC;AAErD,MAAM,MAAM,YAAY,GACpB,OAAO,SAAS,GAChB,OAAO,SAAS,GAChB,OAAO,QAAQ,GACf,OAAO,OAAO,GACd,OAAO,SAAS,GAChB,OAAO,MAAM,GACb,OAAO,aAAa,CAAC;AAEzB,MAAM,MAAM,aAAa,GAAG,CAC1B,WAAW,EAAE,YAAY,KACtB,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAE9B,MAAM,MAAM,SAAS,GAAG;IACtB,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE;SACP,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,SAAS;KAClC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG;IAClD,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,QAAQ,EAAE,OAAO,QAAQ,CAAC;IAC1B,OAAO,EAAE,OAAO,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,YAAY,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;KAC7B,GAAG,IAAI,MAAM,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,EAAE;SACP,GAAG,IAAI,MAAM,cAAc,CAAC,CAAC,EAAE,qBAAqB,CACnD,cAAc,CAAC,GAAG,CAAC,CACpB,CAAC,CAAC,CAAC;KACL,CAAC;IACF,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,kBAAkB;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA2B,SAAQ,kBAAkB;IACpE,cAAc,EAAE,MAAM,CAAC;CACxB"}
@@ -4,4 +4,5 @@ export const PAYMENTS = "payments";
4
4
  export const PROFILE = "profile";
5
5
  export const SCHEDULER = "scheduler";
6
6
  export const UPLOAD = "upload";
7
+ export const FEATURE_FLAGS = "featureFlags";
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,SAAS,GAAG,WAAoB,CAAC;AAC9C,MAAM,CAAC,MAAM,SAAS,GAAG,WAAoB,CAAC;AAC9C,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAmB,CAAC;AAC5C,MAAM,CAAC,MAAM,OAAO,GAAG,SAAkB,CAAC;AAC1C,MAAM,CAAC,MAAM,SAAS,GAAG,WAAoB,CAAC;AAC9C,MAAM,CAAC,MAAM,MAAM,GAAG,QAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,SAAS,GAAG,WAAoB,CAAC;AAC9C,MAAM,CAAC,MAAM,SAAS,GAAG,WAAoB,CAAC;AAC9C,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAmB,CAAC;AAC5C,MAAM,CAAC,MAAM,OAAO,GAAG,SAAkB,CAAC;AAC1C,MAAM,CAAC,MAAM,SAAS,GAAG,WAAoB,CAAC;AAC9C,MAAM,CAAC,MAAM,MAAM,GAAG,QAAiB,CAAC;AACxC,MAAM,CAAC,MAAM,aAAa,GAAG,cAAuB,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,15 @@
1
1
  {
2
2
  "name": "@ogcio/building-blocks-sdk",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
7
7
  "scripts": {
8
- "test": "echo \"Error: no test specified\" && exit 1",
8
+ "test": "TAP_RCFILE=tap.yml tap --reporter junit --reporter-file results.xml",
9
+ "test:local": "TAP_RCFILE=tap.yml tap",
10
+ "test:e2e": "cd ./e2e && bru run --env local",
11
+ "test:smoke:e2e": "echo \"Error: no test specified\" && exit 0",
12
+ "test:regression:e2e": "cd ./e2e && mkdir -p test-results && bru run --env dev --output ./test-results/results.xml --format junit",
9
13
  "build": "rm -rf dist && tsc -p tsconfig.prod.json",
10
14
  "clients:update": "node --import=tsx src/cli/index.ts clients:update -c src/clients-configurations/clients-configuration.json",
11
15
  "clients:outdated": "node --import=tsx src/cli/index.ts clients:outdated -c src/clients-configurations/clients-configuration.json",
@@ -32,15 +36,22 @@
32
36
  "@types/http-errors": "^2.0.4",
33
37
  "commitlint": "^19.5.0",
34
38
  "husky": "^9.1.6",
39
+ "tap": "^21.0.1",
40
+ "testdouble": "^3.20.2",
41
+ "vitest": "^2.1.3",
35
42
  "tsx": "^4.19.2",
36
43
  "typescript": "^5.6.3"
37
44
  },
38
45
  "peerDependencies": {
39
- "@logto/node": "2.5.5"
46
+ "@logto/node": "2.5.5",
47
+ "unleash-client": "^6.1.1"
40
48
  },
41
49
  "peerDependenciesMeta": {
42
50
  "@logto/node": {
43
51
  "optional": true
52
+ },
53
+ "unleash-client": {
54
+ "optional": true
44
55
  }
45
56
  },
46
57
  "keywords": [],
@@ -1,4 +1,6 @@
1
- import configFile from "../../clients-configurations/clients-configuration.json";
1
+ import configFile from "../../clients-configurations/clients-configuration.json" with {
2
+ type: "json",
3
+ };
2
4
  import type {
3
5
  GetAccessTokenParams,
4
6
  GetOrganizationTokenParams,
@@ -0,0 +1,3 @@
1
+ const DEFAULT_PROJECT_ID = "default";
2
+
3
+ export { DEFAULT_PROJECT_ID };
@@ -0,0 +1,63 @@
1
+ import t from "tap";
2
+ import * as td from "testdouble";
3
+ import FeatureFlags from "./index.js";
4
+
5
+ let isEnabled = true;
6
+
7
+ await td.replaceEsm("unleash-client", {
8
+ initialize: td.func(),
9
+ InMemStorageProvider: td.func(),
10
+ });
11
+
12
+ let fetchResponse = {};
13
+
14
+ global.fetch = async () =>
15
+ ({
16
+ ok: true,
17
+ status: 200,
18
+ json: async () => fetchResponse,
19
+ headers: new Headers(),
20
+ }) as Response;
21
+
22
+ t.test("FeatureFlags", async (t) => {
23
+ const baseUrl = "http://fakehost";
24
+ const getTokenFn = () => "test-token";
25
+ let featureFlags: FeatureFlags;
26
+
27
+ t.beforeEach(async () => {
28
+ featureFlags = new FeatureFlags({ baseUrl, getTokenFn });
29
+ });
30
+
31
+ t.test(
32
+ "should initialize unleash client with correct parameters",
33
+ async (t) => {
34
+ t.ok(featureFlags.isConnected);
35
+ },
36
+ );
37
+
38
+ t.test("should return false if flag is not enabled", async (t) => {
39
+ isEnabled = false;
40
+ const result = await featureFlags.isFlagEnabled("test-flag");
41
+ t.equal(result, isEnabled);
42
+ });
43
+
44
+ t.test("should return true if flag is enabled", async (t) => {
45
+ isEnabled = true;
46
+ const result = await featureFlags.isFlagEnabled("test-flag");
47
+ t.equal(result, isEnabled);
48
+ });
49
+
50
+ t.test(
51
+ "should call GET method on client when getFeatureFlags is called",
52
+ async () => {
53
+ fetchResponse = { data: { features: [] }, metadata: {} };
54
+ const result = await featureFlags.getFeatureFlags();
55
+ t.ok(result);
56
+ t.same(result, {
57
+ data: [],
58
+ metadata: {},
59
+ error: null,
60
+ });
61
+ },
62
+ );
63
+ });
@@ -0,0 +1,74 @@
1
+ import type createClient from "openapi-fetch";
2
+ import {
3
+ type Context,
4
+ InMemStorageProvider,
5
+ type Unleash,
6
+ initialize,
7
+ } from "unleash-client";
8
+ import type { BaseApiClientParams } from "../../../types/index.js";
9
+ import { FEATURE_FLAGS } from "../../../types/index.js";
10
+ import BaseClient from "../../base-client.js";
11
+ import { DEFAULT_PROJECT_ID } from "./const.js";
12
+ import type { components, paths } from "./schema.js";
13
+ import { waitForConnection } from "./utils.js";
14
+
15
+ class FeatureFlags extends BaseClient<paths> {
16
+ declare client: ReturnType<typeof createClient<paths>>;
17
+ protected serviceName = FEATURE_FLAGS;
18
+
19
+ private unleashClient: Unleash | null = null;
20
+ public isConnected = false;
21
+
22
+ constructor({ baseUrl, getTokenFn }: BaseApiClientParams) {
23
+ super({ baseUrl, getTokenFn });
24
+ const token = getTokenFn ? (getTokenFn(FEATURE_FLAGS) as string) : "";
25
+ this.unleashClient = initialize({
26
+ appName: this.serviceName,
27
+ url: `${baseUrl}/api`,
28
+ refreshInterval: 1000,
29
+ customHeaders: {
30
+ Authorization: token,
31
+ },
32
+ storageProvider: new InMemStorageProvider(),
33
+ });
34
+ this.unleashClient.on("error", console.error);
35
+ this.unleashClient.on("synchronized", () => {
36
+ this.isConnected = true;
37
+ });
38
+ }
39
+
40
+ async isFlagEnabled(name: string, context?: Context) {
41
+ await this.waitForConnection();
42
+ return this.unleashClient?.isEnabled(name, context, () => false) ?? false;
43
+ }
44
+
45
+ async getFeatureFlags(projectId = DEFAULT_PROJECT_ID) {
46
+ return await this.client
47
+ .GET("/api/admin/projects/{projectId}/features", {
48
+ params: {
49
+ path: {
50
+ projectId,
51
+ },
52
+ },
53
+ })
54
+ .then(
55
+ (response) => {
56
+ // @ts-expect-error: TODO: fix me
57
+ const { data, metadata, error } = this.formatResponse(response);
58
+ return {
59
+ data: data?.features as components["schemas"]["projectFeatureSchema"][],
60
+ metadata,
61
+ error,
62
+ };
63
+ },
64
+ (reason) => this.formatError(reason),
65
+ );
66
+ }
67
+
68
+ private async waitForConnection(everyMs = 10) {
69
+ return waitForConnection(this, everyMs);
70
+ }
71
+ }
72
+
73
+ export default FeatureFlags;
74
+ export type { Context as FeatureFlagsEvaluationContext };