diff --git a/.changeset/fix-collection-native-array-methods.md b/.changeset/fix-collection-native-array-methods.md new file mode 100644 index 000000000..03f4d49d3 --- /dev/null +++ b/.changeset/fix-collection-native-array-methods.md @@ -0,0 +1,5 @@ +--- +"@asyncapi/parser": patch +--- + +fix: support native array methods on collections diff --git a/packages/parser/src/models/collection.ts b/packages/parser/src/models/collection.ts index e7a290cfe..012716d81 100644 --- a/packages/parser/src/models/collection.ts +++ b/packages/parser/src/models/collection.ts @@ -15,6 +15,12 @@ export abstract class Collection item.name()); + + expect(mapped).toEqual(['name1', 'name2']); + expect(Array.isArray(mapped)).toEqual(true); + expect(mapped).not.toBeInstanceOf(Collection); + expect(mapped).not.toBeInstanceOf(Model); + expect(d.meta('pointer')).toEqual('/items'); + expect(d.all()).toEqual([item1, item2]); + }); + + it('should return a plain array from .filter()', function() { + const item1 = new ItemModel({ name: 'keep' }); + const item2 = new ItemModel({ name: 'drop' }); + const d = new Model([item1, item2]); + + const filtered = d.filter(item => item.name() === 'keep'); + + expect(filtered).toEqual([item1]); + expect(Array.isArray(filtered)).toEqual(true); + expect(filtered).not.toBeInstanceOf(Collection); + expect(filtered).not.toBeInstanceOf(Model); + }); + + it('should return a plain array from .slice() without mutating the source', function() { + const item1 = new ItemModel({ name: 'name1' }); + const item2 = new ItemModel({ name: 'name2' }); + const d = new Model([item1, item2], { pointer: '/items' }); + + const sliced = d.slice(0, 1); + + expect(sliced).toEqual([item1]); + expect(Array.isArray(sliced)).toEqual(true); + expect(sliced).not.toBeInstanceOf(Collection); + expect(sliced).not.toBeInstanceOf(Model); + expect(d.length).toEqual(2); + expect(d.meta('pointer')).toEqual('/items'); + }); + }); }); diff --git a/packages/parser/test/models/v2/security-requirements.spec.ts b/packages/parser/test/models/v2/security-requirements.spec.ts index d684f981a..98c08dc9b 100644 --- a/packages/parser/test/models/v2/security-requirements.spec.ts +++ b/packages/parser/test/models/v2/security-requirements.spec.ts @@ -39,4 +39,15 @@ describe('SecurityRequirements model', function () { expect(requirements.has('anotherId')).toEqual(false); }); }); + + describe('native Array transforms', function () { + it('should support .map() without throwing', function () { + const requirements = new SecurityRequirements([requirementItem]); + const mapped = requirements.map(requirement => requirement.meta('id' as any)); + + expect(mapped).toEqual(['test']); + expect(Array.isArray(mapped)).toEqual(true); + expect(mapped).not.toBeInstanceOf(SecurityRequirements); + }); + }); }); \ No newline at end of file