@workos/oagen-emitters 0.14.0 → 0.14.2
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.
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +18 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{plugin-BxVeu2v9.mjs → plugin-BbSmT2kj.mjs} +266 -64
- package/dist/plugin-BbSmT2kj.mjs.map +1 -0
- package/dist/plugin.mjs +1 -1
- package/package.json +1 -1
- package/src/dotnet/models.ts +31 -6
- package/src/dotnet/type-map.ts +18 -1
- package/src/go/fixtures.ts +6 -2
- package/src/go/models.ts +18 -3
- package/src/kotlin/models.ts +22 -6
- package/src/kotlin/resources.ts +17 -2
- package/src/node/fixtures.ts +13 -3
- package/src/node/index.ts +92 -4
- package/src/node/models.ts +58 -32
- package/src/node/naming.ts +25 -1
- package/src/node/resources.ts +9 -1
- package/src/node/tests.ts +8 -1
- package/src/node/utils.ts +6 -1
- package/src/php/models.ts +11 -2
- package/src/python/fixtures.ts +6 -2
- package/src/python/models.ts +18 -3
- package/src/python/resources.ts +8 -2
- package/src/python/tests.ts +7 -1
- package/src/ruby/index.ts +3 -3
- package/src/ruby/models.ts +13 -3
- package/src/ruby/parameter-groups.ts +4 -2
- package/src/ruby/rbi.ts +1 -0
- package/src/rust/models.ts +5 -1
- package/src/rust/resources.ts +4 -1
- package/src/shared/model-utils.ts +70 -3
- package/test/node/naming.test.ts +45 -1
- package/test/node/tests.test.ts +69 -0
- package/test/rust/models.test.ts +3 -3
- package/test/shared/model-utils.test.ts +97 -0
- package/dist/plugin-BxVeu2v9.mjs.map +0 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import type { Model } from '@workos/oagen';
|
|
3
|
+
import {
|
|
4
|
+
collectReferencedListMetadataModels,
|
|
5
|
+
isListMetadataModel,
|
|
6
|
+
isListWrapperModel,
|
|
7
|
+
} from '../../src/shared/model-utils.js';
|
|
8
|
+
|
|
9
|
+
const listMetadataModel: Model = {
|
|
10
|
+
name: 'ListMetadata',
|
|
11
|
+
fields: [
|
|
12
|
+
{
|
|
13
|
+
name: 'before',
|
|
14
|
+
type: { kind: 'nullable', inner: { kind: 'primitive', type: 'string' } },
|
|
15
|
+
required: false,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'after',
|
|
19
|
+
type: { kind: 'nullable', inner: { kind: 'primitive', type: 'string' } },
|
|
20
|
+
required: false,
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
describe('isListMetadataModel', () => {
|
|
26
|
+
it('matches a two-field nullable-string before/after shape', () => {
|
|
27
|
+
expect(isListMetadataModel(listMetadataModel)).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe('collectReferencedListMetadataModels', () => {
|
|
32
|
+
it('returns nothing when no surviving wrapper references the model', () => {
|
|
33
|
+
// A paginated list wrapper that the SDK pagination machinery unwraps —
|
|
34
|
+
// not in `nonPaginatedRefs`, so it counts as skipped.
|
|
35
|
+
const paginatedWrapper: Model = {
|
|
36
|
+
name: 'OrgList',
|
|
37
|
+
fields: [
|
|
38
|
+
{ name: 'data', type: { kind: 'array', items: { kind: 'model', name: 'Org' } }, required: true },
|
|
39
|
+
{ name: 'list_metadata', type: { kind: 'model', name: 'ListMetadata' }, required: true },
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
const result = collectReferencedListMetadataModels([listMetadataModel, paginatedWrapper], new Set());
|
|
43
|
+
expect(result.size).toBe(0);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('flags the ListMetadata model when a non-paginated wrapper still references it', () => {
|
|
47
|
+
// `VersionListResponse` is shaped like a list envelope but the operation
|
|
48
|
+
// has no pagination params, so it survives the wrapper skip — and its
|
|
49
|
+
// `list_metadata` field needs the `ListMetadata` interface on disk.
|
|
50
|
+
const versionWrapper: Model = {
|
|
51
|
+
name: 'VersionListResponse',
|
|
52
|
+
fields: [
|
|
53
|
+
{ name: 'data', type: { kind: 'array', items: { kind: 'model', name: 'Version' } }, required: true },
|
|
54
|
+
{ name: 'list_metadata', type: { kind: 'model', name: 'ListMetadata' }, required: true },
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
const result = collectReferencedListMetadataModels(
|
|
58
|
+
[listMetadataModel, versionWrapper],
|
|
59
|
+
new Set(['VersionListResponse']),
|
|
60
|
+
);
|
|
61
|
+
expect(result.has('ListMetadata')).toBe(true);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it('flags the ListMetadata model when a non-wrapper IR model references it directly', () => {
|
|
65
|
+
// Defensive: should anything else point at a `ListMetadata`-shape model
|
|
66
|
+
// as a regular field, we still need the file.
|
|
67
|
+
const customModel: Model = {
|
|
68
|
+
name: 'Custom',
|
|
69
|
+
fields: [{ name: 'meta', type: { kind: 'model', name: 'ListMetadata' }, required: true }],
|
|
70
|
+
};
|
|
71
|
+
const result = collectReferencedListMetadataModels([listMetadataModel, customModel], new Set());
|
|
72
|
+
expect(result.has('ListMetadata')).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('returns an empty set when no ListMetadata-shape model exists in the IR', () => {
|
|
76
|
+
const regular: Model = {
|
|
77
|
+
name: 'Foo',
|
|
78
|
+
fields: [{ name: 'bar', type: { kind: 'primitive', type: 'string' }, required: true }],
|
|
79
|
+
};
|
|
80
|
+
const result = collectReferencedListMetadataModels([regular], new Set());
|
|
81
|
+
expect(result.size).toBe(0);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe('isListWrapperModel + isListMetadataModel — sanity', () => {
|
|
86
|
+
it('does not classify a wrapper as a metadata model', () => {
|
|
87
|
+
const wrapper: Model = {
|
|
88
|
+
name: 'OrgList',
|
|
89
|
+
fields: [
|
|
90
|
+
{ name: 'data', type: { kind: 'array', items: { kind: 'model', name: 'Org' } }, required: true },
|
|
91
|
+
{ name: 'list_metadata', type: { kind: 'model', name: 'ListMetadata' }, required: true },
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
expect(isListWrapperModel(wrapper)).toBe(true);
|
|
95
|
+
expect(isListMetadataModel(wrapper)).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
});
|