@bifold/oca 2.4.6 → 2.6.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 (58) hide show
  1. package/package.json +2 -3
  2. package/src/__tests__/__snapshots__/remote.test.ts.snap +0 -293
  3. package/src/__tests__/fixtures/bundle.json +0 -131
  4. package/src/__tests__/fixtures/oca.json +0 -4
  5. package/src/__tests__/fixtures/ocabundles.json +0 -142
  6. package/src/__tests__/remote.test.ts +0 -180
  7. package/src/constants.ts +0 -7
  8. package/src/formatters/credential/CredentialFormatter.ts +0 -20
  9. package/src/formatters/credential/DisplayAttribute.ts +0 -29
  10. package/src/formatters/credential/LocalizedCredential.ts +0 -53
  11. package/src/formatters/credential/index.ts +0 -5
  12. package/src/formatters/index.ts +0 -5
  13. package/src/index.ts +0 -5
  14. package/src/interfaces/data/base/BaseOverlayData.interface.ts +0 -5
  15. package/src/interfaces/data/branding/BrandingOverlayData.interface.ts +0 -13
  16. package/src/interfaces/data/branding/LegacyBrandingOverlayData.interface.ts +0 -16
  17. package/src/interfaces/data/bundle/OverlayBundleData.interface.ts +0 -7
  18. package/src/interfaces/data/capture-base/CaptureBaseData.interface.ts +0 -7
  19. package/src/interfaces/data/index.ts +0 -25
  20. package/src/interfaces/data/semantic/CharacterEncodingOverlayData.interface.ts +0 -8
  21. package/src/interfaces/data/semantic/FormatOverlayData.interface.ts +0 -5
  22. package/src/interfaces/data/semantic/InformationOverlayData.interface.ts +0 -6
  23. package/src/interfaces/data/semantic/LabelOverlayData.interface.ts +0 -8
  24. package/src/interfaces/data/semantic/MetaOverlayData.interface.ts +0 -13
  25. package/src/interfaces/data/semantic/StandardOverlayData.interface.ts +0 -7
  26. package/src/interfaces/index.ts +0 -2
  27. package/src/interfaces/overlay/OverlayBundleAttribute.interface.ts +0 -9
  28. package/src/interfaces/overlay/OverlayBundleMetadata.interface.ts +0 -9
  29. package/src/interfaces/overlay/index.ts +0 -4
  30. package/src/legacy/index.ts +0 -3
  31. package/src/legacy/resolver/oca.ts +0 -377
  32. package/src/legacy/resolver/record.ts +0 -81
  33. package/src/legacy/resolver/remote-oca.ts +0 -661
  34. package/src/types/OverlayTypeMap.ts +0 -25
  35. package/src/types/TypeEnums.ts +0 -20
  36. package/src/types/base/BaseOverlay.ts +0 -18
  37. package/src/types/branding/BrandingOverlay.ts +0 -61
  38. package/src/types/branding/LegacyBrandingOverlay.ts +0 -47
  39. package/src/types/bundle/OverlayBundle.ts +0 -203
  40. package/src/types/capture-base/CaptureBase.ts +0 -22
  41. package/src/types/index.ts +0 -30
  42. package/src/types/semantic/CharacterEncodingOverlay.ts +0 -30
  43. package/src/types/semantic/FormatOverlay.ts +0 -15
  44. package/src/types/semantic/InformationOverlay.ts +0 -18
  45. package/src/types/semantic/LabelOverlay.ts +0 -30
  46. package/src/types/semantic/MetaOverlay.ts +0 -48
  47. package/src/types/semantic/StandardOverlay.ts +0 -24
  48. package/src/utils/color/generateColor.ts +0 -8
  49. package/src/utils/color/hashCode.ts +0 -11
  50. package/src/utils/color/hashToRGBA.ts +0 -22
  51. package/src/utils/color/index.ts +0 -7
  52. package/src/utils/color/luminanceForHexColor.ts +0 -19
  53. package/src/utils/color/mulberry32.ts +0 -15
  54. package/src/utils/color/textColorForBackground.ts +0 -18
  55. package/src/utils/credential-definition.ts +0 -19
  56. package/src/utils/index.ts +0 -1
  57. package/src/utils/logger.ts +0 -14
  58. package/src/utils/schema.ts +0 -16
@@ -1,180 +0,0 @@
1
- import axios from 'axios'
2
- import fs from 'fs'
3
- import { readFile, writeFile, exists, mkdir, unlink } from 'react-native-fs'
4
-
5
- import { ocaCacheDataFileName, defaultBundleIndexFileName } from '../constants'
6
- import { RemoteOCABundleResolver } from '../legacy/resolver/remote-oca'
7
-
8
- const bundleFileName = 'bundle.json'
9
- const ocaPath = `${__dirname}/fixtures/${ocaCacheDataFileName}`
10
- const ocaAsString = fs.readFileSync(ocaPath, 'utf8')
11
- const indexPath = `${__dirname}/fixtures/${defaultBundleIndexFileName}`
12
- const indexAsString = fs.readFileSync(indexPath, 'utf8')
13
- const bundlePath = `${__dirname}/fixtures/${bundleFileName}`
14
- const bundleAsString = fs.readFileSync(bundlePath, 'utf8')
15
-
16
- const initialEtag = '3379dc5c38ac34ab'
17
- const changedEtag = '4c0afc9bfdb3bf6b'
18
- const keysToUpdated = [
19
- '79e343ab4362d93974cdf78b00a916a5b3659178dfd170fcff90f1b5f10ceb72',
20
- '29bf8f8729f235450980d0b273f9ca49b7ab73b7358467bf52b311bf40464bb0',
21
- ]
22
- // Testing person credential as an example
23
- const personSha = '9187f651eab59811d8ec1c1257628c08f6daa1eb520bf379f022425f3a9701cf'
24
- const qualifiedCredDefId = 'did:indy:candy:RGjWbW1eycP7FrMf4QJvX8/anoncreds/v0/CLAIM_DEF/13/Person'
25
- const qualifiedSchemaId = 'did:indy:candy:RGjWbW1eycP7FrMf4QJvX8/anoncreds/v0/SCHEMA/Person/1.0'
26
-
27
- const getMock = jest.fn().mockImplementation((url) => {
28
- const fileName = url.split('/').pop()
29
- switch (fileName) {
30
- case 'ocabundles.json':
31
- return Promise.resolve({
32
- status: 200,
33
- data: JSON.parse(indexAsString),
34
- headers: { etag: initialEtag },
35
- })
36
- case 'OCABundle.json':
37
- return Promise.resolve({
38
- status: 200,
39
- data: JSON.parse(bundleAsString),
40
- })
41
- default:
42
- return Promise.reject(new Error('Not Found'))
43
- }
44
- })
45
-
46
- jest.mock('axios', () => ({
47
- create: jest.fn().mockReturnValue({
48
- get: jest.fn(),
49
- }),
50
- }))
51
-
52
- jest.useFakeTimers({ legacyFakeTimers: true })
53
-
54
- jest.mock('react-native-fs', () => ({
55
- exists: jest.fn().mockResolvedValue(true),
56
- mkdir: jest.fn().mockResolvedValue(true),
57
- readFile: jest.fn().mockImplementation((filePath) => {
58
- const fileName = filePath.split('/').pop()
59
- switch (fileName) {
60
- case ocaCacheDataFileName: {
61
- return Promise.resolve(ocaAsString)
62
- }
63
- case defaultBundleIndexFileName:
64
- return Promise.resolve(indexAsString)
65
- case personSha:
66
- return Promise.resolve(bundleAsString)
67
- default:
68
- return Promise.resolve('{}')
69
- }
70
- }),
71
- writeFile: jest.fn().mockResolvedValue(true),
72
- unlink: jest.fn().mockResolvedValue(true),
73
- }))
74
-
75
- describe('RemoteOCABundleResolver', () => {
76
- let resolver: RemoteOCABundleResolver
77
-
78
- beforeEach(() => {
79
- resolver = new RemoteOCABundleResolver('http://example.com')
80
- // resolver.log = new MiniLogger()
81
-
82
- jest.clearAllMocks()
83
- // @ts-expect-error some weird type
84
- axios.create().get.mockImplementation(getMock)
85
- })
86
-
87
- it('should be created', async () => {
88
- expect(resolver).toBeTruthy()
89
- expect(resolver).toBeInstanceOf(RemoteOCABundleResolver)
90
- expect(resolver).toHaveProperty('indexFileName', defaultBundleIndexFileName)
91
- expect(resolver).toHaveProperty('cacheDataFileName', ocaCacheDataFileName)
92
- expect(resolver['axiosInstance']).not.toBeNull()
93
- expect(axios.create().get).toHaveBeenCalledTimes(0)
94
- expect(resolver.indexFileEtag).toEqual('')
95
- expect(resolver['indexFile']).toMatchSnapshot()
96
- })
97
-
98
- it('should update demand', async () => {
99
- await resolver.checkForUpdates()
100
-
101
- expect(axios.create().get).toHaveBeenCalledTimes(16) // 1 index + 15 bundles
102
- expect(writeFile).toHaveBeenCalledTimes(17) // 1 index + 15 bundles + 1 cache
103
- expect(readFile).toHaveBeenCalledTimes(1) // 1 cache
104
- expect(unlink).toHaveBeenCalledTimes(0) // 0 deletes
105
- expect(exists).toHaveBeenCalledTimes(3) // 1 index + 1 cache + 1 directory
106
- expect(mkdir).toHaveBeenCalledTimes(0) // mock always return true
107
- expect(resolver.indexFileEtag).toEqual(initialEtag)
108
- expect(resolver['indexFile']).toMatchSnapshot()
109
- })
110
-
111
- it.skip('should check index periodically', async () => {
112
- await resolver.checkForUpdates()
113
- await resolver.checkForUpdates()
114
- await resolver.checkForUpdates()
115
-
116
- expect(axios.create().get).toHaveBeenCalledTimes(18) // 3 index + 15 bundles
117
- expect(writeFile).toHaveBeenCalledTimes(17) // 1 index + 15 bundles + 1 cache
118
- expect(readFile).toHaveBeenCalledTimes(1)
119
- expect(unlink).toHaveBeenCalledTimes(0)
120
- expect(exists).toHaveBeenCalledTimes(5)
121
- expect(mkdir).toHaveBeenCalledTimes(0)
122
- })
123
-
124
- it('should check fetch updated bundles', async () => {
125
- await resolver.checkForUpdates()
126
-
127
- expect(axios.create().get).toHaveBeenCalledTimes(16) // 1 index + 15 bundles
128
- expect(resolver.indexFileEtag).toEqual(initialEtag)
129
-
130
- const newIndexAsJSON = JSON.parse(indexAsString)
131
- for (const key of Object.keys(newIndexAsJSON)) {
132
- if (keysToUpdated.includes(newIndexAsJSON[key].sha256)) {
133
- newIndexAsJSON[key].sha256 = newIndexAsJSON[key].sha256.slice(0, 7)
134
- }
135
- }
136
-
137
- // @ts-expect-error some weird type
138
- axios.create().get.mockImplementation((url) => {
139
- const fileName = url.split('/').pop()
140
- switch (fileName) {
141
- case 'ocabundles.json':
142
- return Promise.resolve({
143
- status: 200,
144
- data: newIndexAsJSON,
145
- headers: { etag: changedEtag },
146
- })
147
- case 'OCABundle.json':
148
- return Promise.resolve({
149
- status: 200,
150
- data: JSON.parse(bundleAsString),
151
- })
152
- default:
153
- return Promise.reject(new Error('Not Found'))
154
- }
155
- })
156
-
157
- await resolver.checkForUpdates()
158
-
159
- expect(axios.create().get).toHaveBeenCalledTimes(19) // 2 index + 17 bundles
160
- expect(writeFile).toHaveBeenCalledTimes(21) // 2 index + 17 bundles + 2 cache
161
- expect(readFile).toHaveBeenCalledTimes(1)
162
- expect(unlink).toHaveBeenCalledTimes(2) // 2 deletes
163
- expect(exists).toHaveBeenCalledTimes(4) // 2 index + 1 cache + 1 directory
164
- expect(mkdir).toHaveBeenCalledTimes(0)
165
- expect(resolver.indexFileEtag).toEqual(changedEtag)
166
- expect(resolver['indexFile']).toMatchSnapshot()
167
- })
168
-
169
- it('should check unqualified cred def id as key if given qualified cred def id', async () => {
170
- await resolver.checkForUpdates()
171
- const bundle = await resolver.resolve({ identifiers: { credentialDefinitionId: qualifiedCredDefId } })
172
- expect(bundle).toBeDefined()
173
- })
174
-
175
- it('should check unqualified schema id as key if given qualified schema id', async () => {
176
- await resolver.checkForUpdates()
177
- const bundle = await resolver.resolve({ identifiers: { schemaId: qualifiedSchemaId } })
178
- expect(bundle).toBeDefined()
179
- })
180
- })
package/src/constants.ts DELETED
@@ -1,7 +0,0 @@
1
- export const ocaBundleStorageDirectory = 'oca'
2
-
3
- export const ocaCacheDataFileName = 'oca.json'
4
-
5
- export const defaultBundleIndexFileName = 'ocabundles.json'
6
-
7
- export const defaultBundleLanguage = 'en'
@@ -1,20 +0,0 @@
1
- import { CredentialExchangeRecord } from '@credo-ts/core'
2
-
3
- import { OverlayBundle } from '../../types'
4
-
5
- import LocalizedCredential from './LocalizedCredential'
6
-
7
- export default class CredentialFormatter {
8
- #credentials!: Record<string, LocalizedCredential>
9
-
10
- constructor(bundle: OverlayBundle, record: CredentialExchangeRecord) {
11
- this.#credentials = bundle.languages.reduce((credentials, language) => {
12
- credentials[language] = new LocalizedCredential(bundle, record, language)
13
- return credentials
14
- }, {} as Record<string, LocalizedCredential>)
15
- }
16
-
17
- localizedCredential(language: string): LocalizedCredential | undefined {
18
- return this.#credentials[language]
19
- }
20
- }
@@ -1,29 +0,0 @@
1
- import { CredentialPreviewAttribute, CredentialPreviewAttributeOptions } from '@credo-ts/core'
2
-
3
- import { IOverlayBundleAttribute as OverlayBundleAttributeOptions } from '../../interfaces/overlay'
4
-
5
- export default class DisplayAttribute extends CredentialPreviewAttribute {
6
- characterEncoding: string | undefined
7
- standard: string | undefined
8
- format: string | undefined
9
- information: string | undefined
10
- label: string | undefined
11
-
12
- constructor(
13
- options: CredentialPreviewAttributeOptions,
14
- overlayOptions: OverlayBundleAttributeOptions,
15
- language: string
16
- ) {
17
- super(options)
18
-
19
- this.characterEncoding = overlayOptions.characterEncoding
20
- this.standard = overlayOptions.standard
21
- this.format = overlayOptions.format
22
- this.information = overlayOptions.information?.[language]
23
- this.label = overlayOptions.label?.[language]
24
- }
25
-
26
- toJSON(): Record<string, unknown> {
27
- return { ...super.toJSON(), format: this.format, information: this.information, label: this.label }
28
- }
29
- }
@@ -1,53 +0,0 @@
1
- import { CredentialExchangeRecord, CredentialPreviewAttribute } from '@credo-ts/core'
2
-
3
- import { OverlayBundle } from '../../types'
4
-
5
- import DisplayAttribute from './DisplayAttribute'
6
-
7
- export default class LocalizedCredential {
8
- #bundle!: OverlayBundle
9
-
10
- issuer: string
11
- name: string
12
- attributes!: DisplayAttribute[]
13
-
14
- constructor(bundle: OverlayBundle, record: CredentialExchangeRecord, language: string) {
15
- if (!language) {
16
- throw new Error('language is required')
17
- }
18
-
19
- this.#bundle = bundle
20
-
21
- this.issuer = bundle.metadata.issuer?.[language]
22
- this.name = bundle.metadata.name?.[language]
23
-
24
- // If no record attributes are present then grab default attributes from the bundle
25
- const credentialAttributes = record.credentialAttributes?.length
26
- ? record.credentialAttributes
27
- : bundle.attributes.map((attribute) => {
28
- return new CredentialPreviewAttribute({ ...attribute, value: '' })
29
- })
30
-
31
- this.attributes =
32
- credentialAttributes
33
- ?.filter((attribute) => bundle.getAttribute(attribute.name))
34
- .map((attribute) => new DisplayAttribute(attribute, { name: attribute.name, type: '' }, language)) ?? []
35
- }
36
-
37
- get primaryAttribute(): DisplayAttribute | undefined {
38
- const name = this.#bundle.branding?.primaryAttribute
39
- return this.getAttribute(name)
40
- }
41
-
42
- get secondaryAttribute(): DisplayAttribute | undefined {
43
- const name = this.#bundle.branding?.secondaryAttribute
44
- return this.getAttribute(name)
45
- }
46
-
47
- getAttribute(attributeName?: string): DisplayAttribute | undefined {
48
- if (!attributeName) {
49
- return undefined
50
- }
51
- return this.attributes.find((attribute) => attribute.name === attributeName)
52
- }
53
- }
@@ -1,5 +0,0 @@
1
- import CredentialFormatter from './CredentialFormatter'
2
- import DisplayAttribute from './DisplayAttribute'
3
- import LocalizedCredential from './LocalizedCredential'
4
-
5
- export { CredentialFormatter, DisplayAttribute, LocalizedCredential }
@@ -1,5 +0,0 @@
1
- import CredentialFormatter from './credential/CredentialFormatter'
2
- import DisplayAttribute from './credential/DisplayAttribute'
3
- import LocalizedCredential from './credential/LocalizedCredential'
4
-
5
- export { CredentialFormatter, DisplayAttribute, LocalizedCredential }
package/src/index.ts DELETED
@@ -1,5 +0,0 @@
1
- export * from './formatters'
2
- export * from './interfaces'
3
- export * from './types'
4
- export * from './utils'
5
- export * as legacy from './legacy'
@@ -1,5 +0,0 @@
1
- export default interface IBaseOverlayData {
2
- type: string
3
- capture_base: string
4
- digest?: string
5
- }
@@ -1,13 +0,0 @@
1
- import IBaseOverlayData from '../base/BaseOverlayData.interface'
2
-
3
- export default interface IBrandingOverlayData extends IBaseOverlayData {
4
- logo?: string
5
- background_image?: string
6
- background_image_slice?: string
7
- primary_background_color?: string
8
- secondary_background_color?: string
9
- primary_attribute?: string
10
- secondary_attribute?: string
11
- issued_date_attribute?: string
12
- expiry_date_attribute?: string
13
- }
@@ -1,16 +0,0 @@
1
- import IBaseOverlayData from '../base/BaseOverlayData.interface'
2
-
3
- export default interface ILegacyBrandingOverlayData extends IBaseOverlayData {
4
- background_color?: string
5
- image_source?: string
6
- header?: {
7
- color?: string
8
- background_color?: string
9
- image_source?: string
10
- hide_issuer?: boolean
11
- }
12
- footer?: {
13
- color?: string
14
- background_color?: string
15
- }
16
- }
@@ -1,7 +0,0 @@
1
- import IBaseOverlayData from '../base/BaseOverlayData.interface'
2
- import ICaptureBaseData from '../capture-base/CaptureBaseData.interface'
3
-
4
- export default interface IOverlayBundleData {
5
- capture_base: ICaptureBaseData
6
- overlays: IBaseOverlayData[]
7
- }
@@ -1,7 +0,0 @@
1
- export default interface ICaptureBaseData {
2
- type: string
3
- classification: string
4
- attributes: Record<string, string>
5
- flagged_attributes: string[]
6
- digest?: string
7
- }
@@ -1,25 +0,0 @@
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
-
13
- export {
14
- IBaseOverlayData,
15
- ICaptureBaseData,
16
- IOverlayBundleData,
17
- IBrandingOverlayData,
18
- ILegacyBrandingOverlayData,
19
- ICharacterEncodingOverlayData,
20
- IFormatOverlayData,
21
- IInformationOverlayData,
22
- ILabelOverlayData,
23
- IMetaOverlayData,
24
- IStandardOverlayData,
25
- }
@@ -1,8 +0,0 @@
1
- import IBaseOverlayData from '../base/BaseOverlayData.interface'
2
-
3
- export default interface ICharacterEncodingOverlayData extends IBaseOverlayData {
4
- default_character_encoding: string
5
- // DEPRECATED - Use attribute_character_encoding instead
6
- attr_character_encoding: Record<string, string>
7
- attribute_character_encoding: Record<string, string>
8
- }
@@ -1,5 +0,0 @@
1
- import IBaseOverlayData from '../base/BaseOverlayData.interface'
2
-
3
- export default interface IFormatOverlayData extends IBaseOverlayData {
4
- attribute_formats: Record<string, string>
5
- }
@@ -1,6 +0,0 @@
1
- import IBaseOverlayData from '../base/BaseOverlayData.interface'
2
-
3
- export default interface IInformationOverlayData extends IBaseOverlayData {
4
- language: string
5
- attribute_information: Record<string, string>
6
- }
@@ -1,8 +0,0 @@
1
- import IBaseOverlayData from '../base/BaseOverlayData.interface'
2
-
3
- export default interface ILabelOverlayData extends IBaseOverlayData {
4
- language: string
5
- attribute_labels: Record<string, string>
6
- attribute_categories: string[]
7
- category_labels: Record<string, string>
8
- }
@@ -1,13 +0,0 @@
1
- import IBaseOverlayData from '../base/BaseOverlayData.interface'
2
-
3
- export default interface IMetaOverlayData extends IBaseOverlayData {
4
- language: string
5
- name: string
6
- description: string
7
- credential_help_text: string
8
- credential_support_url: string
9
- issuer: string
10
- issuer_description: string
11
- issuer_url: string
12
- watermark?: string
13
- }
@@ -1,7 +0,0 @@
1
- import IBaseOverlayData from '../base/BaseOverlayData.interface'
2
-
3
- export default interface IStandardOverlayData extends IBaseOverlayData {
4
- // DEPRECATED - Use attribute_standards instead
5
- attr_standards: Record<string, string>
6
- attribute_standards: Record<string, string>
7
- }
@@ -1,2 +0,0 @@
1
- export * from './data'
2
- export * from './overlay'
@@ -1,9 +0,0 @@
1
- export default interface IOverlayBundleAttribute {
2
- name: string
3
- type: string
4
- information?: Record<string, string>
5
- label?: Record<string, string>
6
- format?: string
7
- characterEncoding?: string
8
- standard?: string
9
- }
@@ -1,9 +0,0 @@
1
- export default interface IOverlayBundleMetadata {
2
- name: Record<string, string>
3
- description: Record<string, string>
4
- credentialHelpText?: Record<string, string>
5
- credentialSupportUrl?: Record<string, string>
6
- issuer: Record<string, string>
7
- issuerDescription?: Record<string, string>
8
- issuerUrl?: Record<string, string>
9
- }
@@ -1,4 +0,0 @@
1
- import IOverlayBundleAttribute from './OverlayBundleAttribute.interface'
2
- import IOverlayBundleMetadata from './OverlayBundleMetadata.interface'
3
-
4
- export { IOverlayBundleAttribute, IOverlayBundleMetadata }
@@ -1,3 +0,0 @@
1
- export * from './resolver/oca'
2
- export * from './resolver/record'
3
- export * from './resolver/remote-oca'