@internetarchive/metadata-service 0.1.0 → 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 (125) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +27 -26
  3. package/.prettierignore +2 -0
  4. package/LICENSE +661 -661
  5. package/README.md +64 -64
  6. package/demo/app-root.ts +6 -6
  7. package/demo/index.html +27 -27
  8. package/dist/demo/app-root.d.ts +11 -11
  9. package/dist/demo/app-root.js +41 -41
  10. package/dist/demo/app-root.js.map +1 -1
  11. package/dist/index.d.ts +5 -18
  12. package/dist/index.js +4 -16
  13. package/dist/index.js.map +1 -1
  14. package/dist/src/backend/default-metadata-backend.d.ts +27 -27
  15. package/dist/src/backend/default-metadata-backend.js +100 -100
  16. package/dist/src/backend/default-metadata-backend.js.map +1 -1
  17. package/dist/src/backend/metadata-backend-interface.d.ts +20 -20
  18. package/dist/src/backend/metadata-backend-interface.js +1 -1
  19. package/dist/src/backend/metadata-backend-interface.js.map +1 -1
  20. package/dist/src/metadata-service-error.d.ts +11 -11
  21. package/dist/src/metadata-service-error.js +16 -17
  22. package/dist/src/metadata-service-error.js.map +1 -1
  23. package/dist/src/metadata-service-interface.d.ts +44 -44
  24. package/dist/src/metadata-service-interface.js +1 -1
  25. package/dist/src/metadata-service-interface.js.map +1 -1
  26. package/dist/src/metadata-service.d.ts +18 -18
  27. package/dist/src/metadata-service.js +42 -42
  28. package/dist/src/metadata-service.js.map +1 -1
  29. package/dist/src/responses/metadata-response.d.ts +25 -28
  30. package/dist/src/responses/metadata-response.js +31 -30
  31. package/dist/src/responses/metadata-response.js.map +1 -1
  32. package/dist/test/default-metadata-backend.test.d.ts +1 -1
  33. package/dist/test/default-metadata-backend.test.js +89 -90
  34. package/dist/test/default-metadata-backend.test.js.map +1 -1
  35. package/dist/test/metadata-service.test.d.ts +1 -1
  36. package/dist/test/metadata-service.test.js +98 -98
  37. package/dist/test/metadata-service.test.js.map +1 -1
  38. package/dist/test/mock-response-generator.d.ts +3 -3
  39. package/dist/test/mock-response-generator.js +61 -61
  40. package/eslint.config.mjs +53 -0
  41. package/index.ts +1 -27
  42. package/package.json +76 -77
  43. package/src/backend/default-metadata-backend.ts +11 -11
  44. package/src/backend/metadata-backend-interface.ts +1 -1
  45. package/src/metadata-service-error.ts +2 -2
  46. package/src/metadata-service-interface.ts +3 -3
  47. package/src/metadata-service.ts +7 -7
  48. package/src/responses/metadata-response.ts +29 -22
  49. package/test/default-metadata-backend.test.ts +11 -8
  50. package/test/metadata-service.test.ts +16 -16
  51. package/tsconfig.json +22 -22
  52. package/web-test-runner.config.mjs +7 -7
  53. package/.eslintrc.js +0 -14
  54. package/dist/src/models/file.d.ts +0 -29
  55. package/dist/src/models/file.js +0 -95
  56. package/dist/src/models/file.js.map +0 -1
  57. package/dist/src/models/metadata-fields/field-types/boolean.d.ts +0 -5
  58. package/dist/src/models/metadata-fields/field-types/boolean.js +0 -8
  59. package/dist/src/models/metadata-fields/field-types/boolean.js.map +0 -1
  60. package/dist/src/models/metadata-fields/field-types/byte.d.ts +0 -13
  61. package/dist/src/models/metadata-fields/field-types/byte.js +0 -16
  62. package/dist/src/models/metadata-fields/field-types/byte.js.map +0 -1
  63. package/dist/src/models/metadata-fields/field-types/date.d.ts +0 -5
  64. package/dist/src/models/metadata-fields/field-types/date.js +0 -8
  65. package/dist/src/models/metadata-fields/field-types/date.js.map +0 -1
  66. package/dist/src/models/metadata-fields/field-types/duration.d.ts +0 -14
  67. package/dist/src/models/metadata-fields/field-types/duration.js +0 -17
  68. package/dist/src/models/metadata-fields/field-types/duration.js.map +0 -1
  69. package/dist/src/models/metadata-fields/field-types/list.d.ts +0 -25
  70. package/dist/src/models/metadata-fields/field-types/list.js +0 -34
  71. package/dist/src/models/metadata-fields/field-types/list.js.map +0 -1
  72. package/dist/src/models/metadata-fields/field-types/mediatype.d.ts +0 -5
  73. package/dist/src/models/metadata-fields/field-types/mediatype.js +0 -8
  74. package/dist/src/models/metadata-fields/field-types/mediatype.js.map +0 -1
  75. package/dist/src/models/metadata-fields/field-types/number.d.ts +0 -5
  76. package/dist/src/models/metadata-fields/field-types/number.js +0 -8
  77. package/dist/src/models/metadata-fields/field-types/number.js.map +0 -1
  78. package/dist/src/models/metadata-fields/field-types/page-progression.d.ts +0 -5
  79. package/dist/src/models/metadata-fields/field-types/page-progression.js +0 -8
  80. package/dist/src/models/metadata-fields/field-types/page-progression.js.map +0 -1
  81. package/dist/src/models/metadata-fields/field-types/string.d.ts +0 -5
  82. package/dist/src/models/metadata-fields/field-types/string.js +0 -8
  83. package/dist/src/models/metadata-fields/field-types/string.js.map +0 -1
  84. package/dist/src/models/metadata-fields/metadata-field.d.ts +0 -70
  85. package/dist/src/models/metadata-fields/metadata-field.js +0 -67
  86. package/dist/src/models/metadata-fields/metadata-field.js.map +0 -1
  87. package/dist/src/models/metadata.d.ts +0 -168
  88. package/dist/src/models/metadata.js +0 -618
  89. package/dist/src/models/metadata.js.map +0 -1
  90. package/dist/src/models/review.d.ts +0 -10
  91. package/dist/src/models/review.js +0 -43
  92. package/dist/src/models/review.js.map +0 -1
  93. package/dist/src/models/speech-music-asr-entry.d.ts +0 -10
  94. package/dist/src/models/speech-music-asr-entry.js +0 -2
  95. package/dist/src/models/speech-music-asr-entry.js.map +0 -1
  96. package/dist/test/models/file.test.d.ts +0 -1
  97. package/dist/test/models/file.test.js +0 -9
  98. package/dist/test/models/file.test.js.map +0 -1
  99. package/dist/test/models/metadata-fields/list-field.test.d.ts +0 -1
  100. package/dist/test/models/metadata-fields/list-field.test.js +0 -52
  101. package/dist/test/models/metadata-fields/list-field.test.js.map +0 -1
  102. package/dist/test/models/metadata-fields/metadata-field.test.d.ts +0 -1
  103. package/dist/test/models/metadata-fields/metadata-field.test.js +0 -121
  104. package/dist/test/models/metadata-fields/metadata-field.test.js.map +0 -1
  105. package/dist/test/models/metadata.test.d.ts +0 -1
  106. package/dist/test/models/metadata.test.js +0 -10
  107. package/dist/test/models/metadata.test.js.map +0 -1
  108. package/src/models/file.ts +0 -105
  109. package/src/models/metadata-fields/field-types/boolean.ts +0 -8
  110. package/src/models/metadata-fields/field-types/byte.ts +0 -16
  111. package/src/models/metadata-fields/field-types/date.ts +0 -8
  112. package/src/models/metadata-fields/field-types/duration.ts +0 -17
  113. package/src/models/metadata-fields/field-types/list.ts +0 -44
  114. package/src/models/metadata-fields/field-types/mediatype.ts +0 -8
  115. package/src/models/metadata-fields/field-types/number.ts +0 -8
  116. package/src/models/metadata-fields/field-types/page-progression.ts +0 -14
  117. package/src/models/metadata-fields/field-types/string.ts +0 -8
  118. package/src/models/metadata-fields/metadata-field.ts +0 -108
  119. package/src/models/metadata.ts +0 -457
  120. package/src/models/review.ts +0 -41
  121. package/src/models/speech-music-asr-entry.ts +0 -10
  122. package/test/models/file.test.ts +0 -10
  123. package/test/models/metadata-fields/list-field.test.ts +0 -64
  124. package/test/models/metadata-fields/metadata-field.test.ts +0 -151
  125. package/test/models/metadata.test.ts +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-service.test.js","sourceRoot":"","sources":["../../test/metadata-service.test.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { expect } from '@open-wc/testing';\n\nimport { MockResponseGenerator } from './mock-response-generator';\nimport { MetadataResponse } from '../src/responses/metadata-response';\nimport { Result } from '@internetarchive/result-type';\nimport { MetadataBackendInterface } from '../src/backend/metadata-backend-interface';\nimport {\n MetadataServiceError,\n MetadataServiceErrorType,\n} from '../src/metadata-service-error';\nimport { MetadataService } from '../src/metadata-service';\n\ndescribe('MetadataService', () => {\n it('can request metadata when requested', async () => {\n class MockMetadataBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n const responseGenerator = new MockResponseGenerator();\n const mockResponse =\n responseGenerator.generateMockMetadataResponse(identifier);\n return { success: mockResponse };\n }\n }\n\n const backend = new MockMetadataBackend();\n const service = new MetadataService(backend);\n const result = await service.fetchMetadata('foo');\n expect(result.success?.metadata.identifier).to.equal('foo');\n });\n\n describe('requestMetadataValue', async () => {\n class MockMetadataBackend implements MetadataBackendInterface {\n response: any;\n async fetchMetadata(\n identifier: string,\n keypath?: string\n ): Promise<Result<any, MetadataServiceError>> {\n return {\n success: {\n result: this.response,\n },\n };\n }\n }\n\n it('can request a metadata value', async () => {\n const backend = new MockMetadataBackend();\n const service = new MetadataService(backend);\n\n let expectedResult: any = 'foo';\n backend.response = expectedResult;\n\n let result = await service.fetchMetadataValue<typeof expectedResult>(\n 'foo',\n 'metadata'\n );\n expect(result.success).to.equal(expectedResult);\n\n expectedResult = { foo: 'bar' };\n backend.response = expectedResult;\n\n result = await service.fetchMetadataValue<typeof expectedResult>(\n 'foo',\n 'metadata'\n );\n expect(result.success).to.equal(expectedResult);\n expect(result.success.foo).to.equal('bar');\n });\n });\n\n it('returns an error result if the item is not found', async () => {\n class MockSearchBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n // this is unfortunate.. instead of getting an http 404 error,\n // we get an empty JSON object when an item is not found\n return { success: {} as any };\n }\n }\n\n const backend = new MockSearchBackend();\n const service = new MetadataService(backend);\n const result = await service.fetchMetadata('foo');\n expect(result.error).to.not.equal(undefined);\n expect(result.error?.type).to.equal(MetadataServiceErrorType.itemNotFound);\n\n const valueResult = await service.fetchMetadataValue('foo', 'metadata');\n expect(valueResult.error).to.not.equal(undefined);\n expect(valueResult.error?.type).to.equal(\n MetadataServiceErrorType.itemNotFound\n );\n });\n\n it('returns the network error if one occurs', async () => {\n class MockSearchBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n const error = new MetadataServiceError(\n MetadataServiceErrorType.networkError,\n 'network error'\n );\n return { error };\n }\n }\n\n const backend = new MockSearchBackend();\n const service = new MetadataService(backend);\n const metadataResult = await service.fetchMetadata('foo');\n expect(metadataResult.error).to.not.equal(undefined);\n expect(metadataResult.error?.type).to.equal(\n MetadataServiceErrorType.networkError\n );\n expect(metadataResult.error?.message).to.equal('network error');\n\n const metadataValueResult = await service.fetchMetadataValue('foo', 'bar');\n expect(metadataValueResult.error).to.not.equal(undefined);\n expect(metadataValueResult.error?.type).to.equal(\n MetadataServiceErrorType.networkError\n );\n expect(metadataValueResult.error?.message).to.equal('network error');\n });\n\n it('returns a decoding error if one occurs', async () => {\n class MockSearchBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n const error = new MetadataServiceError(\n MetadataServiceErrorType.decodingError,\n 'decoding error'\n );\n return { error };\n }\n }\n\n const backend = new MockSearchBackend();\n const service = new MetadataService(backend);\n const metadataResult = await service.fetchMetadata('foo');\n expect(metadataResult.error).to.not.equal(undefined);\n expect(metadataResult.error?.type).to.equal(\n MetadataServiceErrorType.decodingError\n );\n expect(metadataResult.error?.message).to.equal('decoding error');\n });\n});\n"]}
1
+ {"version":3,"file":"metadata-service.test.js","sourceRoot":"","sources":["../../test/metadata-service.test.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,uDAAuD;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EACL,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;;QACnD,MAAM,mBAAmB;YACvB,KAAK,CAAC,aAAa,CACjB,UAAkB;gBAElB,MAAM,iBAAiB,GAAG,IAAI,qBAAqB,EAAE,CAAC;gBACtD,MAAM,YAAY,GAChB,iBAAiB,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC;gBAC7D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;YACnC,CAAC;SACF;QAED,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAA,MAAM,CAAC,OAAO,0CAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,mBAAmB;YAEvB,KAAK,CAAC,aAAa,CACjB,UAAkB,EAClB,OAAgB;gBAEhB,OAAO;oBACL,OAAO,EAAE;wBACP,MAAM,EAAE,IAAI,CAAC,QAAQ;qBACtB;iBACF,CAAC;YACJ,CAAC;SACF;QAED,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;YAE7C,IAAI,cAAc,GAAQ,KAAK,CAAC;YAChC,OAAO,CAAC,QAAQ,GAAG,cAAc,CAAC;YAElC,IAAI,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAC3C,KAAK,EACL,UAAU,CACX,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAEhD,cAAc,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,QAAQ,GAAG,cAAc,CAAC;YAElC,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CACvC,KAAK,EACL,UAAU,CACX,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;;QAChE,MAAM,iBAAiB;YACrB,KAAK,CAAC,aAAa,CACjB,UAAkB;gBAElB,8DAA8D;gBAC9D,wDAAwD;gBACxD,OAAO,EAAE,OAAO,EAAE,EAAS,EAAE,CAAC;YAChC,CAAC;SACF;QAED,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAA,MAAM,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;QAE3E,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACxE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,MAAA,WAAW,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CACtC,wBAAwB,CAAC,YAAY,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;;QACvD,MAAM,iBAAiB;YACrB,KAAK,CAAC,aAAa,CACjB,UAAkB;gBAElB,MAAM,KAAK,GAAG,IAAI,oBAAoB,CACpC,wBAAwB,CAAC,YAAY,EACrC,eAAe,CAChB,CAAC;gBACF,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,CAAC;SACF;QAED,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,CAAC,MAAA,cAAc,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CACzC,wBAAwB,CAAC,YAAY,CACtC,CAAC;QACF,MAAM,CAAC,MAAA,cAAc,CAAC,KAAK,0CAAE,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAEhE,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3E,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAA,mBAAmB,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAC9C,wBAAwB,CAAC,YAAY,CACtC,CAAC;QACF,MAAM,CAAC,MAAA,mBAAmB,CAAC,KAAK,0CAAE,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;;QACtD,MAAM,iBAAiB;YACrB,KAAK,CAAC,aAAa,CACjB,UAAkB;gBAElB,MAAM,KAAK,GAAG,IAAI,oBAAoB,CACpC,wBAAwB,CAAC,aAAa,EACtC,gBAAgB,CACjB,CAAC;gBACF,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,CAAC;SACF;QAED,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrD,MAAM,CAAC,MAAA,cAAc,CAAC,KAAK,0CAAE,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CACzC,wBAAwB,CAAC,aAAa,CACvC,CAAC;QACF,MAAM,CAAC,MAAA,cAAc,CAAC,KAAK,0CAAE,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { expect } from '@open-wc/testing';\n\nimport { Result } from '@internetarchive/result-type';\nimport { MetadataBackendInterface } from '../src/backend/metadata-backend-interface';\nimport { MetadataService } from '../src/metadata-service';\nimport {\n MetadataServiceError,\n MetadataServiceErrorType,\n} from '../src/metadata-service-error';\nimport { MetadataResponse } from '../src/responses/metadata-response';\nimport { MockResponseGenerator } from './mock-response-generator';\n\ndescribe('MetadataService', () => {\n it('can request metadata when requested', async () => {\n class MockMetadataBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string,\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n const responseGenerator = new MockResponseGenerator();\n const mockResponse =\n responseGenerator.generateMockMetadataResponse(identifier);\n return { success: mockResponse };\n }\n }\n\n const backend = new MockMetadataBackend();\n const service = new MetadataService(backend);\n const result = await service.fetchMetadata('foo');\n expect(result.success?.metadata.identifier).to.equal('foo');\n });\n\n describe('requestMetadataValue', async () => {\n class MockMetadataBackend implements MetadataBackendInterface {\n response: any;\n async fetchMetadata(\n identifier: string,\n keypath?: string,\n ): Promise<Result<any, MetadataServiceError>> {\n return {\n success: {\n result: this.response,\n },\n };\n }\n }\n\n it('can request a metadata value', async () => {\n const backend = new MockMetadataBackend();\n const service = new MetadataService(backend);\n\n let expectedResult: any = 'foo';\n backend.response = expectedResult;\n\n let result = await service.fetchMetadataValue<typeof expectedResult>(\n 'foo',\n 'metadata',\n );\n expect(result.success).to.equal(expectedResult);\n\n expectedResult = { foo: 'bar' };\n backend.response = expectedResult;\n\n result = await service.fetchMetadataValue<typeof expectedResult>(\n 'foo',\n 'metadata',\n );\n expect(result.success).to.equal(expectedResult);\n expect(result.success.foo).to.equal('bar');\n });\n });\n\n it('returns an error result if the item is not found', async () => {\n class MockSearchBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string,\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n // this is unfortunate.. instead of getting an http 404 error,\n // we get an empty JSON object when an item is not found\n return { success: {} as any };\n }\n }\n\n const backend = new MockSearchBackend();\n const service = new MetadataService(backend);\n const result = await service.fetchMetadata('foo');\n expect(result.error).to.not.equal(undefined);\n expect(result.error?.type).to.equal(MetadataServiceErrorType.itemNotFound);\n\n const valueResult = await service.fetchMetadataValue('foo', 'metadata');\n expect(valueResult.error).to.not.equal(undefined);\n expect(valueResult.error?.type).to.equal(\n MetadataServiceErrorType.itemNotFound,\n );\n });\n\n it('returns the network error if one occurs', async () => {\n class MockSearchBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string,\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n const error = new MetadataServiceError(\n MetadataServiceErrorType.networkError,\n 'network error',\n );\n return { error };\n }\n }\n\n const backend = new MockSearchBackend();\n const service = new MetadataService(backend);\n const metadataResult = await service.fetchMetadata('foo');\n expect(metadataResult.error).to.not.equal(undefined);\n expect(metadataResult.error?.type).to.equal(\n MetadataServiceErrorType.networkError,\n );\n expect(metadataResult.error?.message).to.equal('network error');\n\n const metadataValueResult = await service.fetchMetadataValue('foo', 'bar');\n expect(metadataValueResult.error).to.not.equal(undefined);\n expect(metadataValueResult.error?.type).to.equal(\n MetadataServiceErrorType.networkError,\n );\n expect(metadataValueResult.error?.message).to.equal('network error');\n });\n\n it('returns a decoding error if one occurs', async () => {\n class MockSearchBackend implements MetadataBackendInterface {\n async fetchMetadata(\n identifier: string,\n ): Promise<Result<MetadataResponse, MetadataServiceError>> {\n const error = new MetadataServiceError(\n MetadataServiceErrorType.decodingError,\n 'decoding error',\n );\n return { error };\n }\n }\n\n const backend = new MockSearchBackend();\n const service = new MetadataService(backend);\n const metadataResult = await service.fetchMetadata('foo');\n expect(metadataResult.error).to.not.equal(undefined);\n expect(metadataResult.error?.type).to.equal(\n MetadataServiceErrorType.decodingError,\n );\n expect(metadataResult.error?.message).to.equal('decoding error');\n });\n});\n"]}
@@ -1,3 +1,3 @@
1
- export declare class MockResponseGenerator {
2
- generateMockMetadataResponse(identifier: string): any;
3
- }
1
+ export declare class MockResponseGenerator {
2
+ generateMockMetadataResponse(identifier: string): any;
3
+ }
@@ -1,62 +1,62 @@
1
- /* eslint-disable @typescript-eslint/no-explicit-any */
2
- export class MockResponseGenerator {
3
- generateMockMetadataResponse(identifier) {
4
- return {
5
- created: 1586477049,
6
- d1: 'ia600201.us.archive.org',
7
- d2: 'ia800201.us.archive.org',
8
- dir: '/27/items/rss-383924main_TWAN_09_04_09',
9
- files: [
10
- {
11
- name: 'foo.jpg',
12
- source: 'derivative',
13
- format: 'Thumbnail',
14
- original: 'foo.mp4',
15
- md5: '48067b43a547d3e90cb433a04ba84d5d',
16
- mtime: '1256675427',
17
- size: '1135',
18
- crc32: '40870038',
19
- sha1: '6445c2a6f51c8314c1872ec1f7daf33c5cfabd06',
20
- },
21
- {
22
- name: 'bar.jpg',
23
- source: 'derivative',
24
- format: 'Thumbnail',
25
- original: 'bar.mp4',
26
- md5: '5bf69912d7b796fe309cde32e61230bc',
27
- mtime: '1256675429',
28
- size: '6329',
29
- crc32: 'ba5f361a',
30
- sha1: 'cddab0e2daab29978e5efdeff735240a44aa7c80',
31
- },
32
- ],
33
- files_count: 2,
34
- item_last_updated: 1463797130,
35
- item_size: 99872691,
36
- metadata: {
37
- feed_id: '/0/rss_feeds/NASACast_Video/nasacast_video:sts128_landing/NASAcast_vodcast.rss',
38
- mediatype: 'movies',
39
- title: "NASA TV's This Week @NASA, September 4",
40
- description: "NASA TV's This Week @NASA, September 4",
41
- creator: 'NASA',
42
- source: 'http://www.nasa.gov/multimedia/podcasting/twan_09_04_09.html',
43
- date: '9/4/2009',
44
- year: '2009',
45
- rights: 'Public Domain',
46
- language: 'en-us',
47
- updater: 'BonnieReal',
48
- updatedate: '2009-10-27 20:23:01',
49
- identifier,
50
- uploader: 'bonnie@archive.org',
51
- addeddate: '2009-10-27 20:25:55',
52
- publicdate: '2009-10-27 20:41:27',
53
- collection: ['nasa', 'nasacastvideo'],
54
- backup_location: 'ia903604_7',
55
- },
56
- server: 'ia800201.us.archive.org',
57
- uniq: 162444403,
58
- workable_servers: ['ia800201.us.archive.org', 'ia600201.us.archive.org'],
59
- };
60
- }
61
- }
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ export class MockResponseGenerator {
3
+ generateMockMetadataResponse(identifier) {
4
+ return {
5
+ created: 1586477049,
6
+ d1: 'ia600201.us.archive.org',
7
+ d2: 'ia800201.us.archive.org',
8
+ dir: '/27/items/rss-383924main_TWAN_09_04_09',
9
+ files: [
10
+ {
11
+ name: 'foo.jpg',
12
+ source: 'derivative',
13
+ format: 'Thumbnail',
14
+ original: 'foo.mp4',
15
+ md5: '48067b43a547d3e90cb433a04ba84d5d',
16
+ mtime: '1256675427',
17
+ size: '1135',
18
+ crc32: '40870038',
19
+ sha1: '6445c2a6f51c8314c1872ec1f7daf33c5cfabd06',
20
+ },
21
+ {
22
+ name: 'bar.jpg',
23
+ source: 'derivative',
24
+ format: 'Thumbnail',
25
+ original: 'bar.mp4',
26
+ md5: '5bf69912d7b796fe309cde32e61230bc',
27
+ mtime: '1256675429',
28
+ size: '6329',
29
+ crc32: 'ba5f361a',
30
+ sha1: 'cddab0e2daab29978e5efdeff735240a44aa7c80',
31
+ },
32
+ ],
33
+ files_count: 2,
34
+ item_last_updated: 1463797130,
35
+ item_size: 99872691,
36
+ metadata: {
37
+ feed_id: '/0/rss_feeds/NASACast_Video/nasacast_video:sts128_landing/NASAcast_vodcast.rss',
38
+ mediatype: 'movies',
39
+ title: "NASA TV's This Week @NASA, September 4",
40
+ description: "NASA TV's This Week @NASA, September 4",
41
+ creator: 'NASA',
42
+ source: 'http://www.nasa.gov/multimedia/podcasting/twan_09_04_09.html',
43
+ date: '9/4/2009',
44
+ year: '2009',
45
+ rights: 'Public Domain',
46
+ language: 'en-us',
47
+ updater: 'BonnieReal',
48
+ updatedate: '2009-10-27 20:23:01',
49
+ identifier,
50
+ uploader: 'bonnie@archive.org',
51
+ addeddate: '2009-10-27 20:25:55',
52
+ publicdate: '2009-10-27 20:41:27',
53
+ collection: ['nasa', 'nasacastvideo'],
54
+ backup_location: 'ia903604_7',
55
+ },
56
+ server: 'ia800201.us.archive.org',
57
+ uniq: 162444403,
58
+ workable_servers: ['ia800201.us.archive.org', 'ia600201.us.archive.org'],
59
+ };
60
+ }
61
+ }
62
62
  //# sourceMappingURL=mock-response-generator.js.map
@@ -0,0 +1,53 @@
1
+ import typescriptEslint from '@typescript-eslint/eslint-plugin';
2
+ import html from 'eslint-plugin-html';
3
+ import tsParser from '@typescript-eslint/parser';
4
+ import path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import js from '@eslint/js';
7
+ import { FlatCompat } from '@eslint/eslintrc';
8
+
9
+ const __filename = fileURLToPath(import.meta.url);
10
+ const __dirname = path.dirname(__filename);
11
+ const compat = new FlatCompat({
12
+ baseDirectory: __dirname,
13
+ recommendedConfig: js.configs.recommended,
14
+ allConfig: js.configs.all,
15
+ });
16
+
17
+ export default [
18
+ ...compat.extends('plugin:@typescript-eslint/recommended'),
19
+ {
20
+ plugins: {
21
+ '@typescript-eslint': typescriptEslint,
22
+ html,
23
+ },
24
+
25
+ languageOptions: {
26
+ parser: tsParser,
27
+ },
28
+
29
+ settings: {
30
+ 'import/resolver': {
31
+ node: {
32
+ extensions: ['.ts', '.tsx'],
33
+ moduleDirectory: ['node_modules', 'src', 'demo'],
34
+ },
35
+ },
36
+ },
37
+
38
+ rules: {
39
+ '@typescript-eslint/no-unsafe-function-type': 'warn',
40
+ '@typescript-eslint/no-unused-vars': 'warn',
41
+ '@typescript-eslint/no-explicit-any': 'warn',
42
+ },
43
+ },
44
+ {
45
+ ignores: ['**/*.js', '**/*.mjs', '**/*.d.ts'],
46
+ },
47
+ {
48
+ files: ['**/*.test.ts'],
49
+ rules: {
50
+ '@typescript-eslint/no-unused-expressions': 'off',
51
+ },
52
+ },
53
+ ];
package/index.ts CHANGED
@@ -1,32 +1,6 @@
1
- export { Metadata } from './src/models/metadata';
2
- export { File } from './src/models/file';
3
- export { Review } from './src/models/review';
4
- export { SpeechMusicASREntry } from './src/models/speech-music-asr-entry';
5
-
6
- export { DateField } from './src/models/metadata-fields/field-types/date';
7
-
8
- export { NumberField } from './src/models/metadata-fields/field-types/number';
9
-
10
- export { StringField } from './src/models/metadata-fields/field-types/string';
11
-
12
- export { BooleanField } from './src/models/metadata-fields/field-types/boolean';
13
-
14
- export { ByteField } from './src/models/metadata-fields/field-types/byte';
15
-
16
- export { DurationField } from './src/models/metadata-fields/field-types/duration';
17
-
18
- export { PageProgressionField } from './src/models/metadata-fields/field-types/page-progression';
19
-
20
- export { MediaTypeField } from './src/models/metadata-fields/field-types/mediatype';
21
-
22
- export {
23
- MetadataFieldInterface,
24
- MetadataField,
25
- } from './src/models/metadata-fields/metadata-field';
26
-
27
1
  export { MetadataResponse } from './src/responses/metadata-response';
28
2
 
29
3
  export { DefaultMetadataBackend } from './src/backend/default-metadata-backend';
30
- export { MetadataServiceInterface } from './src/metadata-service-interface';
31
4
  export { MetadataService } from './src/metadata-service';
32
5
  export { MetadataServiceError } from './src/metadata-service-error';
6
+ export { MetadataServiceInterface } from './src/metadata-service-interface';
package/package.json CHANGED
@@ -1,77 +1,76 @@
1
- {
2
- "name": "@internetarchive/metadata-service",
3
- "version": "0.1.0",
4
- "description": "A service for fetching metadata about items in the Internet Archive",
5
- "license": "AGPL-3.0-only",
6
- "main": "dist/index.js",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
- "publishConfig": {
10
- "access": "public"
11
- },
12
- "scripts": {
13
- "start": "concurrently --kill-others --names tsc,web-dev-server \"npm run tsc:watch\" \"web-dev-server --app-index demo/index.html --node-resolve --open --watch\"",
14
- "tsc:watch": "tsc --watch",
15
- "docs": "typedoc ./index.ts",
16
- "prepare": "tsc",
17
- "lint:eslint": "eslint --ext .ts,.html . --ignore-path .gitignore",
18
- "format:eslint": "eslint --ext .ts,.html . --fix --ignore-path .gitignore",
19
- "lint:prettier": "prettier \"**/*.js\" \"**/*.ts\" --check --ignore-path .gitignore",
20
- "format:prettier": "prettier \"**/*.js\" \"**/*.ts\" --write --ignore-path .gitignore",
21
- "lint": "npm run lint:eslint && npm run lint:prettier",
22
- "format": "npm run format:eslint && npm run format:prettier",
23
- "circular": "madge --circular --extensions ts .",
24
- "test": "tsc && npm run lint && npm run circular && web-test-runner --coverage",
25
- "test:watch": "web-test-runner --watch",
26
- "codecov": "npx codecov"
27
- },
28
- "devDependencies": {
29
- "@open-wc/eslint-config": "^4.2.0",
30
- "@open-wc/testing": "^2.0.0",
31
- "@types/node": "13.11.1",
32
- "@typescript-eslint/eslint-plugin": "^4.16.1",
33
- "@typescript-eslint/parser": "^4.16.1",
34
- "@web/dev-server": "^0.0.12",
35
- "@web/test-runner": "^0.13.23",
36
- "concurrently": "^5.1.0",
37
- "eslint": "^7.21.0",
38
- "eslint-config-prettier": "^6.11.0",
39
- "husky": "^1.0.0",
40
- "lint-staged": "^10.0.0",
41
- "lit-element": "^2.4.0",
42
- "lit-html": "^1.3.0",
43
- "madge": "^3.12.0",
44
- "prettier": "^2.0.4",
45
- "tslib": "^1.14.1",
46
- "typedoc": "^0.20.29",
47
- "typescript": "^4.2.2"
48
- },
49
- "eslintConfig": {
50
- "extends": [
51
- "@open-wc/eslint-config",
52
- "eslint-config-prettier"
53
- ]
54
- },
55
- "prettier": {
56
- "singleQuote": true,
57
- "arrowParens": "avoid"
58
- },
59
- "husky": {
60
- "hooks": {
61
- "pre-commit": "lint-staged"
62
- }
63
- },
64
- "lint-staged": {
65
- "*.ts": [
66
- "eslint --fix",
67
- "prettier --write",
68
- "git add"
69
- ]
70
- },
71
- "dependencies": {
72
- "@internetarchive/field-parsers": "^0.1.3",
73
- "@internetarchive/result-type": "^0.0.1",
74
- "decorator-cache-getter": "^1.0.0",
75
- "typescript-memoize": "^1.1.0"
76
- }
77
- }
1
+ {
2
+ "name": "@internetarchive/metadata-service",
3
+ "version": "1.0.0",
4
+ "description": "A service for fetching metadata about items in the Internet Archive",
5
+ "license": "AGPL-3.0-only",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "publishConfig": {
10
+ "access": "public"
11
+ },
12
+ "scripts": {
13
+ "start": "concurrently --kill-others --names tsc,web-dev-server \"npm run tsc:watch\" \"web-dev-server --app-index demo/index.html --node-resolve --open --watch\"",
14
+ "tsc:watch": "tsc --watch",
15
+ "docs": "typedoc ./index.ts",
16
+ "prepare": "tsc",
17
+ "lint:eslint": "eslint .",
18
+ "format:eslint": "eslint . --fix",
19
+ "lint:prettier": "prettier \"**/*.js\" \"**/*.ts\" --check",
20
+ "format:prettier": "prettier \"**/*.js\" \"**/*.ts\" --write",
21
+ "lint": "npm run lint:eslint && npm run lint:prettier",
22
+ "format": "npm run format:eslint && npm run format:prettier",
23
+ "circular": "madge --circular --extensions ts .",
24
+ "test": "tsc && npm run lint && npm run circular && web-test-runner --coverage",
25
+ "test:watch": "web-test-runner --watch",
26
+ "codecov": "npx codecov"
27
+ },
28
+ "dependencies": {
29
+ "@internetarchive/iaux-item-metadata": "^1.0.1",
30
+ "@internetarchive/result-type": "^0.0.1"
31
+ },
32
+ "devDependencies": {
33
+ "@open-wc/eslint-config": "^12.0.3",
34
+ "@open-wc/testing": "^4.0.0",
35
+ "@types/mocha": "^10.0.10",
36
+ "@types/node": "^22.10.6",
37
+ "@typescript-eslint/eslint-plugin": "^8.20.0",
38
+ "@typescript-eslint/parser": "^8.20.0",
39
+ "@web/dev-server": "^0.4.6",
40
+ "@web/test-runner": "^0.19.0",
41
+ "concurrently": "^5.1.0",
42
+ "eslint": "^9.18.0",
43
+ "eslint-config-prettier": "^10.0.1",
44
+ "husky": "^9.1.7",
45
+ "lint-staged": "^10.0.0",
46
+ "lit-element": "^2.4.0",
47
+ "lit-html": "^1.3.0",
48
+ "madge": "^8.0.0",
49
+ "prettier": "^3.4.2",
50
+ "tslib": "^2.8.1",
51
+ "typedoc": "^0.27.6",
52
+ "typescript": "^5.7.3"
53
+ },
54
+ "eslintConfig": {
55
+ "extends": [
56
+ "@open-wc/eslint-config",
57
+ "eslint-config-prettier"
58
+ ]
59
+ },
60
+ "prettier": {
61
+ "singleQuote": true,
62
+ "arrowParens": "avoid"
63
+ },
64
+ "husky": {
65
+ "hooks": {
66
+ "pre-commit": "lint-staged"
67
+ }
68
+ },
69
+ "lint-staged": {
70
+ "*.ts": [
71
+ "eslint --fix",
72
+ "prettier --write",
73
+ "git add"
74
+ ]
75
+ }
76
+ }
@@ -1,10 +1,10 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  import type { Result } from '@internetarchive/result-type';
3
- import { MetadataBackendInterface } from './metadata-backend-interface';
4
3
  import {
5
4
  MetadataServiceError,
6
5
  MetadataServiceErrorType,
7
6
  } from '../metadata-service-error';
7
+ import { MetadataBackendInterface } from './metadata-backend-interface';
8
8
 
9
9
  /**
10
10
  * The DefaultSearchBackend performs a `window.fetch` request to archive.org
@@ -49,7 +49,7 @@ export class DefaultMetadataBackend implements MetadataBackendInterface {
49
49
  /** @inheritdoc */
50
50
  async fetchMetadata(
51
51
  identifier: string,
52
- keypath?: string
52
+ keypath?: string,
53
53
  ): Promise<Result<any, MetadataServiceError>> {
54
54
  const path = keypath ? `/${keypath}` : '';
55
55
  const url = `https://${this.baseUrl}/metadata/${identifier}${path}`;
@@ -71,7 +71,7 @@ export class DefaultMetadataBackend implements MetadataBackendInterface {
71
71
  url: string,
72
72
  options?: {
73
73
  requestOptions?: RequestInit;
74
- }
74
+ },
75
75
  ): Promise<Result<any, MetadataServiceError>> {
76
76
  const finalUrl = new URL(url);
77
77
  if (this.requestScope) {
@@ -90,11 +90,11 @@ export class DefaultMetadataBackend implements MetadataBackendInterface {
90
90
  err instanceof Error
91
91
  ? err.message
92
92
  : typeof err === 'string'
93
- ? err
94
- : 'Unknown error';
93
+ ? err
94
+ : 'Unknown error';
95
95
  return this.getErrorResult(
96
96
  MetadataServiceErrorType.networkError,
97
- message
97
+ message,
98
98
  );
99
99
  }
100
100
 
@@ -109,7 +109,7 @@ export class DefaultMetadataBackend implements MetadataBackendInterface {
109
109
  return this.getErrorResult(
110
110
  MetadataServiceErrorType.searchEngineError,
111
111
  error,
112
- forensics
112
+ forensics,
113
113
  );
114
114
  } else {
115
115
  // success
@@ -120,11 +120,11 @@ export class DefaultMetadataBackend implements MetadataBackendInterface {
120
120
  err instanceof Error
121
121
  ? err.message
122
122
  : typeof err === 'string'
123
- ? err
124
- : 'Unknown error';
123
+ ? err
124
+ : 'Unknown error';
125
125
  return this.getErrorResult(
126
126
  MetadataServiceErrorType.decodingError,
127
- message
127
+ message,
128
128
  );
129
129
  }
130
130
  }
@@ -132,7 +132,7 @@ export class DefaultMetadataBackend implements MetadataBackendInterface {
132
132
  private getErrorResult(
133
133
  errorType: MetadataServiceErrorType,
134
134
  message?: string,
135
- details?: any
135
+ details?: any,
136
136
  ): Result<any, MetadataServiceError> {
137
137
  const error = new MetadataServiceError(errorType, message, details);
138
138
  const result = { error };
@@ -20,6 +20,6 @@ export interface MetadataBackendInterface {
20
20
  */
21
21
  fetchMetadata(
22
22
  identifier: string,
23
- keypath?: string
23
+ keypath?: string,
24
24
  ): Promise<Result<any, MetadataServiceError>>;
25
25
  }
@@ -1,5 +1,3 @@
1
- /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
1
  export enum MetadataServiceErrorType {
4
2
  networkError = 'MetadataService.NetworkError',
5
3
  itemNotFound = 'MetadataService.ItemNotFound',
@@ -10,8 +8,10 @@ export enum MetadataServiceErrorType {
10
8
  export class MetadataServiceError extends Error {
11
9
  type: MetadataServiceErrorType;
12
10
 
11
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
13
12
  details?: any;
14
13
 
14
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
15
15
  constructor(type: MetadataServiceErrorType, message?: string, details?: any) {
16
16
  super(message);
17
17
  this.name = type;
@@ -1,6 +1,6 @@
1
- import type { MetadataResponse } from './responses/metadata-response';
2
1
  import type { Result } from '@internetarchive/result-type';
3
2
  import type { MetadataServiceError } from './metadata-service-error';
3
+ import type { MetadataResponse } from './responses/metadata-response';
4
4
 
5
5
  export interface MetadataServiceInterface {
6
6
  /**
@@ -10,7 +10,7 @@ export interface MetadataServiceInterface {
10
10
  * @returns {Promise<Result<MetadataResponse, MetadataServiceError>>}
11
11
  */
12
12
  fetchMetadata(
13
- identifier: string
13
+ identifier: string,
14
14
  ): Promise<Result<MetadataResponse, MetadataServiceError>>;
15
15
 
16
16
  /**
@@ -46,6 +46,6 @@ export interface MetadataServiceInterface {
46
46
  */
47
47
  fetchMetadataValue<T>(
48
48
  identifier: string,
49
- keypath: string
49
+ keypath: string,
50
50
  ): Promise<Result<T, MetadataServiceError>>;
51
51
  }
@@ -1,12 +1,12 @@
1
- import { MetadataResponse } from './responses/metadata-response';
1
+ import type { Result } from '@internetarchive/result-type';
2
+ import { DefaultMetadataBackend } from './backend/default-metadata-backend';
3
+ import { MetadataBackendInterface } from './backend/metadata-backend-interface';
2
4
  import {
3
5
  MetadataServiceError,
4
6
  MetadataServiceErrorType,
5
7
  } from './metadata-service-error';
6
8
  import type { MetadataServiceInterface } from './metadata-service-interface';
7
- import type { Result } from '@internetarchive/result-type';
8
- import { DefaultMetadataBackend } from './backend/default-metadata-backend';
9
- import { MetadataBackendInterface } from './backend/metadata-backend-interface';
9
+ import { MetadataResponse } from './responses/metadata-response';
10
10
 
11
11
  /**
12
12
  * The Metadata Service is responsible for taking the raw response provided by
@@ -14,7 +14,7 @@ import { MetadataBackendInterface } from './backend/metadata-backend-interface';
14
14
  */
15
15
  export class MetadataService implements MetadataServiceInterface {
16
16
  public static default: MetadataServiceInterface = new MetadataService(
17
- new DefaultMetadataBackend()
17
+ new DefaultMetadataBackend(),
18
18
  );
19
19
 
20
20
  private backend: MetadataBackendInterface;
@@ -25,7 +25,7 @@ export class MetadataService implements MetadataServiceInterface {
25
25
 
26
26
  /** @inheritdoc */
27
27
  async fetchMetadata(
28
- identifier: string
28
+ identifier: string,
29
29
  ): Promise<Result<MetadataResponse, MetadataServiceError>> {
30
30
  const rawResponse = await this.backend.fetchMetadata(identifier);
31
31
  if (rawResponse.error) {
@@ -45,7 +45,7 @@ export class MetadataService implements MetadataServiceInterface {
45
45
  /** @inheritdoc */
46
46
  async fetchMetadataValue<T>(
47
47
  identifier: string,
48
- keypath: string
48
+ keypath: string,
49
49
  ): Promise<Result<T, MetadataServiceError>> {
50
50
  const result = await this.backend.fetchMetadata(identifier, keypath);
51
51
  if (result.error) {