@bifold/oca 1.0.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 (165) hide show
  1. package/README.md +33 -0
  2. package/build/__tests__/remote.test.d.ts +1 -0
  3. package/build/__tests__/remote.test.js +162 -0
  4. package/build/constants.d.ts +4 -0
  5. package/build/constants.js +7 -0
  6. package/build/formatters/credential/CredentialFormatter.d.ts +8 -0
  7. package/build/formatters/credential/CredentialFormatter.js +32 -0
  8. package/build/formatters/credential/DisplayAttribute.d.ts +11 -0
  9. package/build/formatters/credential/DisplayAttribute.js +18 -0
  10. package/build/formatters/credential/LocalizedCredential.d.ts +13 -0
  11. package/build/formatters/credential/LocalizedCredential.js +57 -0
  12. package/build/formatters/credential/index.d.ts +4 -0
  13. package/build/formatters/credential/index.js +12 -0
  14. package/build/formatters/index.d.ts +4 -0
  15. package/build/formatters/index.js +12 -0
  16. package/build/index.d.ts +5 -0
  17. package/build/index.js +34 -0
  18. package/build/interfaces/data/base/BaseOverlayData.interface.d.ts +5 -0
  19. package/build/interfaces/data/base/BaseOverlayData.interface.js +2 -0
  20. package/build/interfaces/data/branding/BrandingOverlayData.interface.d.ts +12 -0
  21. package/build/interfaces/data/branding/BrandingOverlayData.interface.js +2 -0
  22. package/build/interfaces/data/branding/LegacyBrandingOverlayData.interface.d.ts +15 -0
  23. package/build/interfaces/data/branding/LegacyBrandingOverlayData.interface.js +2 -0
  24. package/build/interfaces/data/bundle/OverlayBundleData.interface.d.ts +6 -0
  25. package/build/interfaces/data/bundle/OverlayBundleData.interface.js +2 -0
  26. package/build/interfaces/data/capture-base/CaptureBaseData.interface.d.ts +7 -0
  27. package/build/interfaces/data/capture-base/CaptureBaseData.interface.js +2 -0
  28. package/build/interfaces/data/index.d.ts +12 -0
  29. package/build/interfaces/data/index.js +2 -0
  30. package/build/interfaces/data/semantic/CharacterEncodingOverlayData.interface.d.ts +6 -0
  31. package/build/interfaces/data/semantic/CharacterEncodingOverlayData.interface.js +2 -0
  32. package/build/interfaces/data/semantic/FormatOverlayData.interface.d.ts +4 -0
  33. package/build/interfaces/data/semantic/FormatOverlayData.interface.js +2 -0
  34. package/build/interfaces/data/semantic/InformationOverlayData.interface.d.ts +5 -0
  35. package/build/interfaces/data/semantic/InformationOverlayData.interface.js +2 -0
  36. package/build/interfaces/data/semantic/LabelOverlayData.interface.d.ts +7 -0
  37. package/build/interfaces/data/semantic/LabelOverlayData.interface.js +2 -0
  38. package/build/interfaces/data/semantic/MetaOverlayData.interface.d.ts +12 -0
  39. package/build/interfaces/data/semantic/MetaOverlayData.interface.js +2 -0
  40. package/build/interfaces/data/semantic/StandardOverlayData.interface.d.ts +5 -0
  41. package/build/interfaces/data/semantic/StandardOverlayData.interface.js +2 -0
  42. package/build/interfaces/index.d.ts +2 -0
  43. package/build/interfaces/index.js +18 -0
  44. package/build/interfaces/overlay/OverlayBundleAttribute.interface.d.ts +9 -0
  45. package/build/interfaces/overlay/OverlayBundleAttribute.interface.js +2 -0
  46. package/build/interfaces/overlay/OverlayBundleMetadata.interface.d.ts +9 -0
  47. package/build/interfaces/overlay/OverlayBundleMetadata.interface.js +2 -0
  48. package/build/interfaces/overlay/index.d.ts +3 -0
  49. package/build/interfaces/overlay/index.js +2 -0
  50. package/build/legacy/index.d.ts +3 -0
  51. package/build/legacy/index.js +19 -0
  52. package/build/legacy/resolver/oca.d.ts +99 -0
  53. package/build/legacy/resolver/oca.js +239 -0
  54. package/build/legacy/resolver/record.d.ts +50 -0
  55. package/build/legacy/resolver/record.js +37 -0
  56. package/build/legacy/resolver/remote-oca.d.ts +186 -0
  57. package/build/legacy/resolver/remote-oca.js +536 -0
  58. package/build/types/OverlayTypeMap.d.ts +5 -0
  59. package/build/types/OverlayTypeMap.js +25 -0
  60. package/build/types/TypeEnums.d.ts +19 -0
  61. package/build/types/TypeEnums.js +24 -0
  62. package/build/types/base/BaseOverlay.d.ts +8 -0
  63. package/build/types/base/BaseOverlay.js +28 -0
  64. package/build/types/branding/BrandingOverlay.d.ts +15 -0
  65. package/build/types/branding/BrandingOverlay.js +68 -0
  66. package/build/types/branding/LegacyBrandingOverlay.d.ts +18 -0
  67. package/build/types/branding/LegacyBrandingOverlay.js +51 -0
  68. package/build/types/bundle/OverlayBundle.d.ts +20 -0
  69. package/build/types/bundle/OverlayBundle.js +167 -0
  70. package/build/types/capture-base/CaptureBase.d.ts +10 -0
  71. package/build/types/capture-base/CaptureBase.js +30 -0
  72. package/build/types/index.d.ts +14 -0
  73. package/build/types/index.js +33 -0
  74. package/build/types/semantic/CharacterEncodingOverlay.d.ts +9 -0
  75. package/build/types/semantic/CharacterEncodingOverlay.js +43 -0
  76. package/build/types/semantic/FormatOverlay.d.ts +7 -0
  77. package/build/types/semantic/FormatOverlay.js +30 -0
  78. package/build/types/semantic/InformationOverlay.d.ts +8 -0
  79. package/build/types/semantic/InformationOverlay.js +31 -0
  80. package/build/types/semantic/LabelOverlay.d.ts +10 -0
  81. package/build/types/semantic/LabelOverlay.js +41 -0
  82. package/build/types/semantic/MetaOverlay.d.ts +15 -0
  83. package/build/types/semantic/MetaOverlay.js +54 -0
  84. package/build/types/semantic/StandardOverlay.d.ts +8 -0
  85. package/build/types/semantic/StandardOverlay.js +38 -0
  86. package/build/utils/color/generateColor.d.ts +2 -0
  87. package/build/utils/color/generateColor.js +11 -0
  88. package/build/utils/color/hashCode.d.ts +8 -0
  89. package/build/utils/color/hashCode.js +12 -0
  90. package/build/utils/color/hashToRGBA.d.ts +8 -0
  91. package/build/utils/color/hashToRGBA.js +23 -0
  92. package/build/utils/color/index.d.ts +5 -0
  93. package/build/utils/color/index.js +15 -0
  94. package/build/utils/color/luminanceForHexColor.d.ts +7 -0
  95. package/build/utils/color/luminanceForHexColor.js +18 -0
  96. package/build/utils/color/mulberry32.d.ts +9 -0
  97. package/build/utils/color/mulberry32.js +16 -0
  98. package/build/utils/color/textColorForBackground.d.ts +1 -0
  99. package/build/utils/color/textColorForBackground.js +24 -0
  100. package/build/utils/credential-definition.d.ts +1 -0
  101. package/build/utils/credential-definition.js +21 -0
  102. package/build/utils/index.d.ts +1 -0
  103. package/build/utils/index.js +17 -0
  104. package/build/utils/logger.d.ts +5 -0
  105. package/build/utils/logger.js +17 -0
  106. package/build/utils/schema.d.ts +4 -0
  107. package/build/utils/schema.js +19 -0
  108. package/package.json +53 -0
  109. package/src/__tests__/__snapshots__/remote.test.ts.snap +293 -0
  110. package/src/__tests__/fixtures/bundle.json +131 -0
  111. package/src/__tests__/fixtures/oca.json +4 -0
  112. package/src/__tests__/fixtures/ocabundles.json +142 -0
  113. package/src/__tests__/remote.test.ts +180 -0
  114. package/src/constants.ts +7 -0
  115. package/src/formatters/credential/CredentialFormatter.ts +20 -0
  116. package/src/formatters/credential/DisplayAttribute.ts +29 -0
  117. package/src/formatters/credential/LocalizedCredential.ts +53 -0
  118. package/src/formatters/credential/index.ts +5 -0
  119. package/src/formatters/index.ts +5 -0
  120. package/src/index.ts +5 -0
  121. package/src/interfaces/data/base/BaseOverlayData.interface.ts +5 -0
  122. package/src/interfaces/data/branding/BrandingOverlayData.interface.ts +13 -0
  123. package/src/interfaces/data/branding/LegacyBrandingOverlayData.interface.ts +16 -0
  124. package/src/interfaces/data/bundle/OverlayBundleData.interface.ts +7 -0
  125. package/src/interfaces/data/capture-base/CaptureBaseData.interface.ts +7 -0
  126. package/src/interfaces/data/index.ts +25 -0
  127. package/src/interfaces/data/semantic/CharacterEncodingOverlayData.interface.ts +8 -0
  128. package/src/interfaces/data/semantic/FormatOverlayData.interface.ts +5 -0
  129. package/src/interfaces/data/semantic/InformationOverlayData.interface.ts +6 -0
  130. package/src/interfaces/data/semantic/LabelOverlayData.interface.ts +8 -0
  131. package/src/interfaces/data/semantic/MetaOverlayData.interface.ts +13 -0
  132. package/src/interfaces/data/semantic/StandardOverlayData.interface.ts +7 -0
  133. package/src/interfaces/index.ts +2 -0
  134. package/src/interfaces/overlay/OverlayBundleAttribute.interface.ts +9 -0
  135. package/src/interfaces/overlay/OverlayBundleMetadata.interface.ts +9 -0
  136. package/src/interfaces/overlay/index.ts +4 -0
  137. package/src/legacy/index.ts +3 -0
  138. package/src/legacy/resolver/oca.ts +377 -0
  139. package/src/legacy/resolver/record.ts +81 -0
  140. package/src/legacy/resolver/remote-oca.ts +661 -0
  141. package/src/types/OverlayTypeMap.ts +25 -0
  142. package/src/types/TypeEnums.ts +20 -0
  143. package/src/types/base/BaseOverlay.ts +18 -0
  144. package/src/types/branding/BrandingOverlay.ts +61 -0
  145. package/src/types/branding/LegacyBrandingOverlay.ts +47 -0
  146. package/src/types/bundle/OverlayBundle.ts +203 -0
  147. package/src/types/capture-base/CaptureBase.ts +22 -0
  148. package/src/types/index.ts +30 -0
  149. package/src/types/semantic/CharacterEncodingOverlay.ts +30 -0
  150. package/src/types/semantic/FormatOverlay.ts +15 -0
  151. package/src/types/semantic/InformationOverlay.ts +18 -0
  152. package/src/types/semantic/LabelOverlay.ts +30 -0
  153. package/src/types/semantic/MetaOverlay.ts +48 -0
  154. package/src/types/semantic/StandardOverlay.ts +24 -0
  155. package/src/utils/color/generateColor.ts +8 -0
  156. package/src/utils/color/hashCode.ts +11 -0
  157. package/src/utils/color/hashToRGBA.ts +22 -0
  158. package/src/utils/color/index.ts +7 -0
  159. package/src/utils/color/luminanceForHexColor.ts +19 -0
  160. package/src/utils/color/mulberry32.ts +15 -0
  161. package/src/utils/color/textColorForBackground.ts +18 -0
  162. package/src/utils/credential-definition.ts +19 -0
  163. package/src/utils/index.ts +1 -0
  164. package/src/utils/logger.ts +14 -0
  165. package/src/utils/schema.ts +16 -0
package/README.md ADDED
@@ -0,0 +1,33 @@
1
+ <p align="center">
2
+ <br />
3
+ <img
4
+ alt="Hyperledger Aries logo"
5
+ src="https://raw.githubusercontent.com/hyperledger/aries-framework-javascript/aa31131825e3331dc93694bc58414d955dcb1129/images/aries-logo.png"
6
+ height="250px"
7
+ />
8
+ </p>
9
+ <h1 align="center"><b>Aries Bifold - OCA</b></h1>
10
+ <p align="center">
11
+ <a
12
+ href="https://raw.githubusercontent.com/hyperledger/aries-mobile-agent-react-native/main/LICENSE"
13
+ ><img
14
+ alt="License"
15
+ src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"
16
+ /></a>
17
+ <a href="https://www.typescriptlang.org/"
18
+ ><img
19
+ alt="typescript"
20
+ src="https://img.shields.io/badge/%3C%2F%3E-TypeScript-%230074c1.svg"
21
+ /></a>
22
+ <a href="https://www.npmjs.com/package/@aries-bifold/oca"
23
+ ><img
24
+ alt="@aries-bifold/oca version"
25
+ src="https://img.shields.io/npm/v/@aries-bifold/oca"
26
+ /></a>
27
+
28
+ </p>
29
+ <br />
30
+
31
+ Aries Bifold OCA provides an interpreter for OCA ([Overlay Capture Architecture](https://humancolossus.foundation/blog/cjzegoi58xgpfzwxyrqlroy48dihwz)) bundles. More details to come.
32
+
33
+ _Package structure inspired / adapted from the [credo-ts](https://github.com/openwallet-foundation/credo-ts) project_
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const axios_1 = __importDefault(require("axios"));
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const react_native_fs_1 = require("react-native-fs");
9
+ const constants_1 = require("../constants");
10
+ const remote_oca_1 = require("../legacy/resolver/remote-oca");
11
+ const bundleFileName = 'bundle.json';
12
+ const ocaPath = `${__dirname}/fixtures/${constants_1.ocaCacheDataFileName}`;
13
+ const ocaAsString = fs_1.default.readFileSync(ocaPath, 'utf8');
14
+ const indexPath = `${__dirname}/fixtures/${constants_1.defaultBundleIndexFileName}`;
15
+ const indexAsString = fs_1.default.readFileSync(indexPath, 'utf8');
16
+ const bundlePath = `${__dirname}/fixtures/${bundleFileName}`;
17
+ const bundleAsString = fs_1.default.readFileSync(bundlePath, 'utf8');
18
+ const initialEtag = '3379dc5c38ac34ab';
19
+ const changedEtag = '4c0afc9bfdb3bf6b';
20
+ const keysToUpdated = [
21
+ '79e343ab4362d93974cdf78b00a916a5b3659178dfd170fcff90f1b5f10ceb72',
22
+ '29bf8f8729f235450980d0b273f9ca49b7ab73b7358467bf52b311bf40464bb0',
23
+ ];
24
+ // Testing person credential as an example
25
+ const personSha = '9187f651eab59811d8ec1c1257628c08f6daa1eb520bf379f022425f3a9701cf';
26
+ const qualifiedCredDefId = 'did:indy:candy:RGjWbW1eycP7FrMf4QJvX8/anoncreds/v0/CLAIM_DEF/13/Person';
27
+ const qualifiedSchemaId = 'did:indy:candy:RGjWbW1eycP7FrMf4QJvX8/anoncreds/v0/SCHEMA/Person/1.0';
28
+ const getMock = jest.fn().mockImplementation((url) => {
29
+ const fileName = url.split('/').pop();
30
+ switch (fileName) {
31
+ case 'ocabundles.json':
32
+ return Promise.resolve({
33
+ status: 200,
34
+ data: JSON.parse(indexAsString),
35
+ headers: { etag: initialEtag },
36
+ });
37
+ case 'OCABundle.json':
38
+ return Promise.resolve({
39
+ status: 200,
40
+ data: JSON.parse(bundleAsString),
41
+ });
42
+ default:
43
+ return Promise.reject(new Error('Not Found'));
44
+ }
45
+ });
46
+ jest.mock('axios', () => ({
47
+ create: jest.fn().mockReturnValue({
48
+ get: jest.fn(),
49
+ }),
50
+ }));
51
+ jest.useFakeTimers({ legacyFakeTimers: true });
52
+ jest.mock('react-native-fs', () => ({
53
+ exists: jest.fn().mockResolvedValue(true),
54
+ mkdir: jest.fn().mockResolvedValue(true),
55
+ readFile: jest.fn().mockImplementation((filePath) => {
56
+ const fileName = filePath.split('/').pop();
57
+ switch (fileName) {
58
+ case constants_1.ocaCacheDataFileName: {
59
+ return Promise.resolve(ocaAsString);
60
+ }
61
+ case constants_1.defaultBundleIndexFileName:
62
+ return Promise.resolve(indexAsString);
63
+ case personSha:
64
+ return Promise.resolve(bundleAsString);
65
+ default:
66
+ return Promise.resolve('{}');
67
+ }
68
+ }),
69
+ writeFile: jest.fn().mockResolvedValue(true),
70
+ unlink: jest.fn().mockResolvedValue(true),
71
+ }));
72
+ describe('RemoteOCABundleResolver', () => {
73
+ let resolver;
74
+ beforeEach(() => {
75
+ resolver = new remote_oca_1.RemoteOCABundleResolver('http://example.com');
76
+ // resolver.log = new MiniLogger()
77
+ jest.clearAllMocks();
78
+ // @ts-expect-error some weird type
79
+ axios_1.default.create().get.mockImplementation(getMock);
80
+ });
81
+ it('should be created', async () => {
82
+ expect(resolver).toBeTruthy();
83
+ expect(resolver).toBeInstanceOf(remote_oca_1.RemoteOCABundleResolver);
84
+ expect(resolver).toHaveProperty('indexFileName', constants_1.defaultBundleIndexFileName);
85
+ expect(resolver).toHaveProperty('cacheDataFileName', constants_1.ocaCacheDataFileName);
86
+ expect(resolver['axiosInstance']).not.toBeNull();
87
+ expect(axios_1.default.create().get).toHaveBeenCalledTimes(0);
88
+ expect(resolver.indexFileEtag).toEqual('');
89
+ expect(resolver['indexFile']).toMatchSnapshot();
90
+ });
91
+ it('should update demand', async () => {
92
+ await resolver.checkForUpdates();
93
+ expect(axios_1.default.create().get).toHaveBeenCalledTimes(16); // 1 index + 15 bundles
94
+ expect(react_native_fs_1.writeFile).toHaveBeenCalledTimes(17); // 1 index + 15 bundles + 1 cache
95
+ expect(react_native_fs_1.readFile).toHaveBeenCalledTimes(1); // 1 cache
96
+ expect(react_native_fs_1.unlink).toHaveBeenCalledTimes(0); // 0 deletes
97
+ expect(react_native_fs_1.exists).toHaveBeenCalledTimes(3); // 1 index + 1 cache + 1 directory
98
+ expect(react_native_fs_1.mkdir).toHaveBeenCalledTimes(0); // mock always return true
99
+ expect(resolver.indexFileEtag).toEqual(initialEtag);
100
+ expect(resolver['indexFile']).toMatchSnapshot();
101
+ });
102
+ it.skip('should check index periodically', async () => {
103
+ await resolver.checkForUpdates();
104
+ await resolver.checkForUpdates();
105
+ await resolver.checkForUpdates();
106
+ expect(axios_1.default.create().get).toHaveBeenCalledTimes(18); // 3 index + 15 bundles
107
+ expect(react_native_fs_1.writeFile).toHaveBeenCalledTimes(17); // 1 index + 15 bundles + 1 cache
108
+ expect(react_native_fs_1.readFile).toHaveBeenCalledTimes(1);
109
+ expect(react_native_fs_1.unlink).toHaveBeenCalledTimes(0);
110
+ expect(react_native_fs_1.exists).toHaveBeenCalledTimes(5);
111
+ expect(react_native_fs_1.mkdir).toHaveBeenCalledTimes(0);
112
+ });
113
+ it('should check fetch updated bundles', async () => {
114
+ await resolver.checkForUpdates();
115
+ expect(axios_1.default.create().get).toHaveBeenCalledTimes(16); // 1 index + 15 bundles
116
+ expect(resolver.indexFileEtag).toEqual(initialEtag);
117
+ const newIndexAsJSON = JSON.parse(indexAsString);
118
+ for (const key of Object.keys(newIndexAsJSON)) {
119
+ if (keysToUpdated.includes(newIndexAsJSON[key].sha256)) {
120
+ newIndexAsJSON[key].sha256 = newIndexAsJSON[key].sha256.slice(0, 7);
121
+ }
122
+ }
123
+ // @ts-expect-error some weird type
124
+ axios_1.default.create().get.mockImplementation((url) => {
125
+ const fileName = url.split('/').pop();
126
+ switch (fileName) {
127
+ case 'ocabundles.json':
128
+ return Promise.resolve({
129
+ status: 200,
130
+ data: newIndexAsJSON,
131
+ headers: { etag: changedEtag },
132
+ });
133
+ case 'OCABundle.json':
134
+ return Promise.resolve({
135
+ status: 200,
136
+ data: JSON.parse(bundleAsString),
137
+ });
138
+ default:
139
+ return Promise.reject(new Error('Not Found'));
140
+ }
141
+ });
142
+ await resolver.checkForUpdates();
143
+ expect(axios_1.default.create().get).toHaveBeenCalledTimes(19); // 2 index + 17 bundles
144
+ expect(react_native_fs_1.writeFile).toHaveBeenCalledTimes(21); // 2 index + 17 bundles + 2 cache
145
+ expect(react_native_fs_1.readFile).toHaveBeenCalledTimes(1);
146
+ expect(react_native_fs_1.unlink).toHaveBeenCalledTimes(2); // 2 deletes
147
+ expect(react_native_fs_1.exists).toHaveBeenCalledTimes(4); // 2 index + 1 cache + 1 directory
148
+ expect(react_native_fs_1.mkdir).toHaveBeenCalledTimes(0);
149
+ expect(resolver.indexFileEtag).toEqual(changedEtag);
150
+ expect(resolver['indexFile']).toMatchSnapshot();
151
+ });
152
+ it('should check unqualified cred def id as key if given qualified cred def id', async () => {
153
+ await resolver.checkForUpdates();
154
+ const bundle = await resolver.resolve({ identifiers: { credentialDefinitionId: qualifiedCredDefId } });
155
+ expect(bundle).toBeDefined();
156
+ });
157
+ it('should check unqualified schema id as key if given qualified schema id', async () => {
158
+ await resolver.checkForUpdates();
159
+ const bundle = await resolver.resolve({ identifiers: { schemaId: qualifiedSchemaId } });
160
+ expect(bundle).toBeDefined();
161
+ });
162
+ });
@@ -0,0 +1,4 @@
1
+ export declare const ocaBundleStorageDirectory = "oca";
2
+ export declare const ocaCacheDataFileName = "oca.json";
3
+ export declare const defaultBundleIndexFileName = "ocabundles.json";
4
+ export declare const defaultBundleLanguage = "en";
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultBundleLanguage = exports.defaultBundleIndexFileName = exports.ocaCacheDataFileName = exports.ocaBundleStorageDirectory = void 0;
4
+ exports.ocaBundleStorageDirectory = 'oca';
5
+ exports.ocaCacheDataFileName = 'oca.json';
6
+ exports.defaultBundleIndexFileName = 'ocabundles.json';
7
+ exports.defaultBundleLanguage = 'en';
@@ -0,0 +1,8 @@
1
+ import { CredentialExchangeRecord } from '@credo-ts/core';
2
+ import { OverlayBundle } from '../../types';
3
+ import LocalizedCredential from './LocalizedCredential';
4
+ export default class CredentialFormatter {
5
+ #private;
6
+ constructor(bundle: OverlayBundle, record: CredentialExchangeRecord);
7
+ localizedCredential(language: string): LocalizedCredential | undefined;
8
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ var _CredentialFormatter_credentials;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const LocalizedCredential_1 = __importDefault(require("./LocalizedCredential"));
19
+ class CredentialFormatter {
20
+ constructor(bundle, record) {
21
+ _CredentialFormatter_credentials.set(this, void 0);
22
+ __classPrivateFieldSet(this, _CredentialFormatter_credentials, bundle.languages.reduce((credentials, language) => {
23
+ credentials[language] = new LocalizedCredential_1.default(bundle, record, language);
24
+ return credentials;
25
+ }, {}), "f");
26
+ }
27
+ localizedCredential(language) {
28
+ return __classPrivateFieldGet(this, _CredentialFormatter_credentials, "f")[language];
29
+ }
30
+ }
31
+ _CredentialFormatter_credentials = new WeakMap();
32
+ exports.default = CredentialFormatter;
@@ -0,0 +1,11 @@
1
+ import { CredentialPreviewAttribute, CredentialPreviewAttributeOptions } from '@credo-ts/core';
2
+ import { IOverlayBundleAttribute as OverlayBundleAttributeOptions } from '../../interfaces/overlay';
3
+ export default class DisplayAttribute extends CredentialPreviewAttribute {
4
+ characterEncoding: string | undefined;
5
+ standard: string | undefined;
6
+ format: string | undefined;
7
+ information: string | undefined;
8
+ label: string | undefined;
9
+ constructor(options: CredentialPreviewAttributeOptions, overlayOptions: OverlayBundleAttributeOptions, language: string);
10
+ toJSON(): Record<string, unknown>;
11
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@credo-ts/core");
4
+ class DisplayAttribute extends core_1.CredentialPreviewAttribute {
5
+ constructor(options, overlayOptions, language) {
6
+ var _a, _b;
7
+ super(options);
8
+ this.characterEncoding = overlayOptions.characterEncoding;
9
+ this.standard = overlayOptions.standard;
10
+ this.format = overlayOptions.format;
11
+ this.information = (_a = overlayOptions.information) === null || _a === void 0 ? void 0 : _a[language];
12
+ this.label = (_b = overlayOptions.label) === null || _b === void 0 ? void 0 : _b[language];
13
+ }
14
+ toJSON() {
15
+ return Object.assign(Object.assign({}, super.toJSON()), { format: this.format, information: this.information, label: this.label });
16
+ }
17
+ }
18
+ exports.default = DisplayAttribute;
@@ -0,0 +1,13 @@
1
+ import { CredentialExchangeRecord } from '@credo-ts/core';
2
+ import { OverlayBundle } from '../../types';
3
+ import DisplayAttribute from './DisplayAttribute';
4
+ export default class LocalizedCredential {
5
+ #private;
6
+ issuer: string;
7
+ name: string;
8
+ attributes: DisplayAttribute[];
9
+ constructor(bundle: OverlayBundle, record: CredentialExchangeRecord, language: string);
10
+ get primaryAttribute(): DisplayAttribute | undefined;
11
+ get secondaryAttribute(): DisplayAttribute | undefined;
12
+ getAttribute(attributeName?: string): DisplayAttribute | undefined;
13
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ var _LocalizedCredential_bundle;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const core_1 = require("@credo-ts/core");
19
+ const DisplayAttribute_1 = __importDefault(require("./DisplayAttribute"));
20
+ class LocalizedCredential {
21
+ constructor(bundle, record, language) {
22
+ var _a, _b, _c, _d;
23
+ _LocalizedCredential_bundle.set(this, void 0);
24
+ if (!language) {
25
+ throw new Error('language is required');
26
+ }
27
+ __classPrivateFieldSet(this, _LocalizedCredential_bundle, bundle, "f");
28
+ this.issuer = (_a = bundle.metadata.issuer) === null || _a === void 0 ? void 0 : _a[language];
29
+ this.name = (_b = bundle.metadata.name) === null || _b === void 0 ? void 0 : _b[language];
30
+ // If no record attributes are present then grab default attributes from the bundle
31
+ const credentialAttributes = ((_c = record.credentialAttributes) === null || _c === void 0 ? void 0 : _c.length)
32
+ ? record.credentialAttributes
33
+ : bundle.attributes.map((attribute) => {
34
+ return new core_1.CredentialPreviewAttribute(Object.assign(Object.assign({}, attribute), { value: '' }));
35
+ });
36
+ this.attributes =
37
+ (_d = credentialAttributes === null || credentialAttributes === void 0 ? void 0 : credentialAttributes.filter((attribute) => bundle.getAttribute(attribute.name)).map((attribute) => new DisplayAttribute_1.default(attribute, { name: attribute.name, type: '' }, language))) !== null && _d !== void 0 ? _d : [];
38
+ }
39
+ get primaryAttribute() {
40
+ var _a;
41
+ const name = (_a = __classPrivateFieldGet(this, _LocalizedCredential_bundle, "f").branding) === null || _a === void 0 ? void 0 : _a.primaryAttribute;
42
+ return this.getAttribute(name);
43
+ }
44
+ get secondaryAttribute() {
45
+ var _a;
46
+ const name = (_a = __classPrivateFieldGet(this, _LocalizedCredential_bundle, "f").branding) === null || _a === void 0 ? void 0 : _a.secondaryAttribute;
47
+ return this.getAttribute(name);
48
+ }
49
+ getAttribute(attributeName) {
50
+ if (!attributeName) {
51
+ return undefined;
52
+ }
53
+ return this.attributes.find((attribute) => attribute.name === attributeName);
54
+ }
55
+ }
56
+ _LocalizedCredential_bundle = new WeakMap();
57
+ exports.default = LocalizedCredential;
@@ -0,0 +1,4 @@
1
+ import CredentialFormatter from './CredentialFormatter';
2
+ import DisplayAttribute from './DisplayAttribute';
3
+ import LocalizedCredential from './LocalizedCredential';
4
+ export { CredentialFormatter, DisplayAttribute, LocalizedCredential };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LocalizedCredential = exports.DisplayAttribute = exports.CredentialFormatter = void 0;
7
+ const CredentialFormatter_1 = __importDefault(require("./CredentialFormatter"));
8
+ exports.CredentialFormatter = CredentialFormatter_1.default;
9
+ const DisplayAttribute_1 = __importDefault(require("./DisplayAttribute"));
10
+ exports.DisplayAttribute = DisplayAttribute_1.default;
11
+ const LocalizedCredential_1 = __importDefault(require("./LocalizedCredential"));
12
+ exports.LocalizedCredential = LocalizedCredential_1.default;
@@ -0,0 +1,4 @@
1
+ import CredentialFormatter from './credential/CredentialFormatter';
2
+ import DisplayAttribute from './credential/DisplayAttribute';
3
+ import LocalizedCredential from './credential/LocalizedCredential';
4
+ export { CredentialFormatter, DisplayAttribute, LocalizedCredential };
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LocalizedCredential = exports.DisplayAttribute = exports.CredentialFormatter = void 0;
7
+ const CredentialFormatter_1 = __importDefault(require("./credential/CredentialFormatter"));
8
+ exports.CredentialFormatter = CredentialFormatter_1.default;
9
+ const DisplayAttribute_1 = __importDefault(require("./credential/DisplayAttribute"));
10
+ exports.DisplayAttribute = DisplayAttribute_1.default;
11
+ const LocalizedCredential_1 = __importDefault(require("./credential/LocalizedCredential"));
12
+ exports.LocalizedCredential = LocalizedCredential_1.default;
@@ -0,0 +1,5 @@
1
+ export * from './formatters';
2
+ export * from './interfaces';
3
+ export * from './types';
4
+ export * from './utils';
5
+ export * as legacy from './legacy';
package/build/index.js ADDED
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ var __importStar = (this && this.__importStar) || function (mod) {
22
+ if (mod && mod.__esModule) return mod;
23
+ var result = {};
24
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
25
+ __setModuleDefault(result, mod);
26
+ return result;
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.legacy = void 0;
30
+ __exportStar(require("./formatters"), exports);
31
+ __exportStar(require("./interfaces"), exports);
32
+ __exportStar(require("./types"), exports);
33
+ __exportStar(require("./utils"), exports);
34
+ exports.legacy = __importStar(require("./legacy"));
@@ -0,0 +1,5 @@
1
+ export default interface IBaseOverlayData {
2
+ type: string;
3
+ capture_base: string;
4
+ digest?: string;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ import IBaseOverlayData from '../base/BaseOverlayData.interface';
2
+ export default interface IBrandingOverlayData extends IBaseOverlayData {
3
+ logo?: string;
4
+ background_image?: string;
5
+ background_image_slice?: string;
6
+ primary_background_color?: string;
7
+ secondary_background_color?: string;
8
+ primary_attribute?: string;
9
+ secondary_attribute?: string;
10
+ issued_date_attribute?: string;
11
+ expiry_date_attribute?: string;
12
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,15 @@
1
+ import IBaseOverlayData from '../base/BaseOverlayData.interface';
2
+ export default interface ILegacyBrandingOverlayData extends IBaseOverlayData {
3
+ background_color?: string;
4
+ image_source?: string;
5
+ header?: {
6
+ color?: string;
7
+ background_color?: string;
8
+ image_source?: string;
9
+ hide_issuer?: boolean;
10
+ };
11
+ footer?: {
12
+ color?: string;
13
+ background_color?: string;
14
+ };
15
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import IBaseOverlayData from '../base/BaseOverlayData.interface';
2
+ import ICaptureBaseData from '../capture-base/CaptureBaseData.interface';
3
+ export default interface IOverlayBundleData {
4
+ capture_base: ICaptureBaseData;
5
+ overlays: IBaseOverlayData[];
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ export default interface ICaptureBaseData {
2
+ type: string;
3
+ classification: string;
4
+ attributes: Record<string, string>;
5
+ flagged_attributes: string[];
6
+ digest?: string;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ import IBaseOverlayData from './base/BaseOverlayData.interface';
2
+ import IBrandingOverlayData from './branding/BrandingOverlayData.interface';
3
+ import ILegacyBrandingOverlayData from './branding/LegacyBrandingOverlayData.interface';
4
+ import IOverlayBundleData from './bundle/OverlayBundleData.interface';
5
+ import ICaptureBaseData from './capture-base/CaptureBaseData.interface';
6
+ import ICharacterEncodingOverlayData from './semantic/CharacterEncodingOverlayData.interface';
7
+ import IFormatOverlayData from './semantic/FormatOverlayData.interface';
8
+ import IInformationOverlayData from './semantic/InformationOverlayData.interface';
9
+ import ILabelOverlayData from './semantic/LabelOverlayData.interface';
10
+ import IMetaOverlayData from './semantic/MetaOverlayData.interface';
11
+ import IStandardOverlayData from './semantic/StandardOverlayData.interface';
12
+ export { IBaseOverlayData, ICaptureBaseData, IOverlayBundleData, IBrandingOverlayData, ILegacyBrandingOverlayData, ICharacterEncodingOverlayData, IFormatOverlayData, IInformationOverlayData, ILabelOverlayData, IMetaOverlayData, IStandardOverlayData, };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,6 @@
1
+ import IBaseOverlayData from '../base/BaseOverlayData.interface';
2
+ export default interface ICharacterEncodingOverlayData extends IBaseOverlayData {
3
+ default_character_encoding: string;
4
+ attr_character_encoding: Record<string, string>;
5
+ attribute_character_encoding: Record<string, string>;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ import IBaseOverlayData from '../base/BaseOverlayData.interface';
2
+ export default interface IFormatOverlayData extends IBaseOverlayData {
3
+ attribute_formats: Record<string, string>;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ import IBaseOverlayData from '../base/BaseOverlayData.interface';
2
+ export default interface IInformationOverlayData extends IBaseOverlayData {
3
+ language: string;
4
+ attribute_information: Record<string, string>;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ import IBaseOverlayData from '../base/BaseOverlayData.interface';
2
+ export default interface ILabelOverlayData extends IBaseOverlayData {
3
+ language: string;
4
+ attribute_labels: Record<string, string>;
5
+ attribute_categories: string[];
6
+ category_labels: Record<string, string>;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ import IBaseOverlayData from '../base/BaseOverlayData.interface';
2
+ export default interface IMetaOverlayData extends IBaseOverlayData {
3
+ language: string;
4
+ name: string;
5
+ description: string;
6
+ credential_help_text: string;
7
+ credential_support_url: string;
8
+ issuer: string;
9
+ issuer_description: string;
10
+ issuer_url: string;
11
+ watermark?: string;
12
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ import IBaseOverlayData from '../base/BaseOverlayData.interface';
2
+ export default interface IStandardOverlayData extends IBaseOverlayData {
3
+ attr_standards: Record<string, string>;
4
+ attribute_standards: Record<string, string>;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ export * from './data';
2
+ export * from './overlay';