@workos/oagen-emitters 0.18.4 → 0.19.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.
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +7 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{plugin-Cciic50q.mjs → plugin-BXDPA9pJ.mjs} +140 -75
- package/dist/plugin-BXDPA9pJ.mjs.map +1 -0
- package/dist/plugin.mjs +1 -1
- package/package.json +4 -4
- package/src/dotnet/enums.ts +11 -5
- package/src/dotnet/models.ts +11 -5
- package/src/dotnet/resources.ts +3 -3
- package/src/dotnet/tests.ts +3 -3
- package/src/go/resources.ts +3 -3
- package/src/go/tests.ts +3 -3
- package/src/kotlin/enums.ts +21 -11
- package/src/kotlin/models.ts +19 -7
- package/src/kotlin/resources.ts +2 -2
- package/src/kotlin/tests.ts +2 -2
- package/src/node/enums.ts +8 -5
- package/src/node/models.ts +29 -21
- package/src/node/resources.ts +12 -1
- package/src/node/tests.ts +7 -2
- package/src/php/enums.ts +18 -5
- package/src/php/index.ts +11 -3
- package/src/php/models.ts +11 -5
- package/src/php/resources.ts +6 -4
- package/src/php/tests.ts +6 -3
- package/src/python/enums.ts +39 -28
- package/src/python/models.ts +27 -18
- package/src/python/resources.ts +3 -3
- package/src/python/tests.ts +3 -3
- package/src/ruby/enums.ts +28 -19
- package/src/ruby/models.ts +23 -12
- package/src/ruby/rbi.ts +17 -6
- package/src/ruby/resources.ts +2 -2
- package/src/ruby/tests.ts +2 -2
- package/src/rust/enums.ts +9 -1
- package/src/rust/models.ts +18 -5
- package/src/rust/resources.ts +8 -1
- package/src/rust/tests.ts +2 -2
- package/src/shared/resolved-ops.ts +47 -0
- package/test/shared/synthetic-enum-seed.test.ts +79 -0
- package/dist/plugin-Cciic50q.mjs.map +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
|
2
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import type { Enum, Model } from '@workos/oagen';
|
|
6
|
+
import { enrichModelsFromSpec, getSyntheticEnums } from '../../src/shared/model-utils.js';
|
|
7
|
+
|
|
8
|
+
// Regression: an inline oneOf enum whose synthetic name (`Parent_field`)
|
|
9
|
+
// snake-collapses onto an existing IR enum must NOT spawn a duplicate
|
|
10
|
+
// synthetic. `DataIntegrationAccessTokenResponse.error` (-> synthetic
|
|
11
|
+
// `DataIntegrationAccessTokenResponse_error`) and the parser-emitted IR enum
|
|
12
|
+
// `DataIntegrationAccessTokenResponseError` both snake to
|
|
13
|
+
// `data_integration_access_token_response_error`. When both exist, every
|
|
14
|
+
// PascalCase-normalizing emitter (PHP, Ruby, Go, ...) collapses them onto the
|
|
15
|
+
// SAME file path, and which one wins is decided by array order — which differs
|
|
16
|
+
// between a full and a scoped (`--services`) generation, yielding a
|
|
17
|
+
// non-deterministic enum-case order. Seeding `enrichModelsFromSpec` with the
|
|
18
|
+
// IR enum names suppresses the duplicate so the real enum always wins.
|
|
19
|
+
const SPEC = {
|
|
20
|
+
openapi: '3.0.0',
|
|
21
|
+
info: { title: 'fixture', version: '1.0.0' },
|
|
22
|
+
paths: {},
|
|
23
|
+
components: {
|
|
24
|
+
schemas: {
|
|
25
|
+
DataIntegrationAccessTokenResponse: {
|
|
26
|
+
oneOf: [
|
|
27
|
+
{
|
|
28
|
+
type: 'object',
|
|
29
|
+
properties: {
|
|
30
|
+
error: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
enum: ['not_installed', 'needs_reauthorization'],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const SYNTHETIC_NAME = 'DataIntegrationAccessTokenResponse_error';
|
|
43
|
+
const models: Model[] = [{ name: 'DataIntegrationAccessTokenResponse', fields: [] }];
|
|
44
|
+
const collidingEnum: Enum = {
|
|
45
|
+
name: 'DataIntegrationAccessTokenResponseError',
|
|
46
|
+
values: [
|
|
47
|
+
{ name: 'NOT_INSTALLED', value: 'not_installed' },
|
|
48
|
+
{ name: 'NEEDS_REAUTHORIZATION', value: 'needs_reauthorization' },
|
|
49
|
+
],
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
let dir: string;
|
|
53
|
+
|
|
54
|
+
beforeAll(() => {
|
|
55
|
+
dir = mkdtempSync(join(tmpdir(), 'synthetic-enum-seed-'));
|
|
56
|
+
const specPath = join(dir, 'spec.yaml');
|
|
57
|
+
// `loadRawSpec` accepts JSON too (js-yaml parses JSON), so write JSON.
|
|
58
|
+
writeFileSync(specPath, JSON.stringify(SPEC));
|
|
59
|
+
process.env.OPENAPI_SPEC_PATH = specPath;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
afterAll(() => {
|
|
63
|
+
delete process.env.OPENAPI_SPEC_PATH;
|
|
64
|
+
if (dir) rmSync(dir, { recursive: true, force: true });
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe('enrichModelsFromSpec — synthetic enum seed', () => {
|
|
68
|
+
it('emits the inline synthetic enum when no IR enum names are seeded', () => {
|
|
69
|
+
enrichModelsFromSpec(models);
|
|
70
|
+
const names = getSyntheticEnums().map((e) => e.name);
|
|
71
|
+
expect(names).toContain(SYNTHETIC_NAME);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('suppresses the duplicate synthetic when the colliding IR enum is seeded', () => {
|
|
75
|
+
enrichModelsFromSpec(models, [collidingEnum]);
|
|
76
|
+
const names = getSyntheticEnums().map((e) => e.name);
|
|
77
|
+
expect(names).not.toContain(SYNTHETIC_NAME);
|
|
78
|
+
});
|
|
79
|
+
});
|