@decohere/create 0.0.1-dev.37 → 0.0.1-dev.38

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.
@@ -0,0 +1,168 @@
1
+ /** Minimal OpenAPI 3 document shape used for Postman conversion. */ /**
2
+ * Canonical Hello WebAPI OpenAPI document used to generate Postman requests.
3
+ * Keep paths aligned with scaffolded HelloController (`/hello`, `/hello/{id}`).
4
+ */ export function buildHelloOpenApiDocument(projectName) {
5
+ return {
6
+ openapi: "3.0.3",
7
+ info: {
8
+ title: `${projectName} WebAPI`,
9
+ version: "1.0.0",
10
+ description: "Generated from OpenAPI for Postman. Auth/env overlays are applied separately."
11
+ },
12
+ servers: [
13
+ {
14
+ url: "{{baseUrl}}"
15
+ }
16
+ ],
17
+ paths: {
18
+ "/hello": {
19
+ get: {
20
+ operationId: "HelloController.getAll",
21
+ summary: "List (anonymous)",
22
+ tags: [
23
+ "Hello"
24
+ ],
25
+ parameters: [
26
+ {
27
+ name: "filter",
28
+ in: "query",
29
+ required: false,
30
+ schema: {
31
+ type: "string"
32
+ }
33
+ }
34
+ ],
35
+ responses: {
36
+ "200": {
37
+ description: "Successful response"
38
+ }
39
+ }
40
+ },
41
+ post: {
42
+ operationId: "HelloController.create",
43
+ summary: "Create",
44
+ tags: [
45
+ "Hello"
46
+ ],
47
+ requestBody: {
48
+ required: true,
49
+ content: {
50
+ "application/json": {
51
+ schema: {
52
+ type: "object",
53
+ properties: {
54
+ message: {
55
+ type: "string"
56
+ }
57
+ },
58
+ required: [
59
+ "message"
60
+ ],
61
+ example: {
62
+ message: "hello"
63
+ }
64
+ }
65
+ }
66
+ }
67
+ },
68
+ responses: {
69
+ "200": {
70
+ description: "Successful response"
71
+ }
72
+ }
73
+ }
74
+ },
75
+ "/hello/{id}": {
76
+ get: {
77
+ operationId: "HelloController.getOne",
78
+ summary: "Get by id",
79
+ tags: [
80
+ "Hello"
81
+ ],
82
+ parameters: [
83
+ {
84
+ name: "id",
85
+ in: "path",
86
+ required: true,
87
+ schema: {
88
+ type: "string"
89
+ }
90
+ }
91
+ ],
92
+ responses: {
93
+ "200": {
94
+ description: "Successful response"
95
+ }
96
+ }
97
+ },
98
+ put: {
99
+ operationId: "HelloController.update",
100
+ summary: "Update",
101
+ tags: [
102
+ "Hello"
103
+ ],
104
+ parameters: [
105
+ {
106
+ name: "id",
107
+ in: "path",
108
+ required: true,
109
+ schema: {
110
+ type: "string"
111
+ }
112
+ }
113
+ ],
114
+ requestBody: {
115
+ required: true,
116
+ content: {
117
+ "application/json": {
118
+ schema: {
119
+ type: "object",
120
+ properties: {
121
+ message: {
122
+ type: "string"
123
+ }
124
+ },
125
+ required: [
126
+ "message"
127
+ ],
128
+ example: {
129
+ message: "updated"
130
+ }
131
+ }
132
+ }
133
+ }
134
+ },
135
+ responses: {
136
+ "200": {
137
+ description: "Successful response"
138
+ }
139
+ }
140
+ },
141
+ delete: {
142
+ operationId: "HelloController.remove",
143
+ summary: "Delete",
144
+ tags: [
145
+ "Hello"
146
+ ],
147
+ parameters: [
148
+ {
149
+ name: "id",
150
+ in: "path",
151
+ required: true,
152
+ schema: {
153
+ type: "string"
154
+ }
155
+ }
156
+ ],
157
+ responses: {
158
+ "200": {
159
+ description: "Successful response"
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
165
+ };
166
+ }
167
+
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL3Bvc3RtYW4vaGVsbG8tb3BlbmFwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogTWluaW1hbCBPcGVuQVBJIDMgZG9jdW1lbnQgc2hhcGUgdXNlZCBmb3IgUG9zdG1hbiBjb252ZXJzaW9uLiAqL1xuZXhwb3J0IHR5cGUgU2NhZmZvbGRPcGVuQXBpRG9jdW1lbnQgPSB7XG5cdG9wZW5hcGk6IFwiMy4wLjNcIjtcblx0aW5mbzogeyB0aXRsZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH07XG5cdHNlcnZlcnM/OiBBcnJheTx7IHVybDogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZyB9Pjtcblx0cGF0aHM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn07XG5cbi8qKlxuICogQ2Fub25pY2FsIEhlbGxvIFdlYkFQSSBPcGVuQVBJIGRvY3VtZW50IHVzZWQgdG8gZ2VuZXJhdGUgUG9zdG1hbiByZXF1ZXN0cy5cbiAqIEtlZXAgcGF0aHMgYWxpZ25lZCB3aXRoIHNjYWZmb2xkZWQgSGVsbG9Db250cm9sbGVyIChgL2hlbGxvYCwgYC9oZWxsby97aWR9YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEhlbGxvT3BlbkFwaURvY3VtZW50KHByb2plY3ROYW1lOiBzdHJpbmcpOiBTY2FmZm9sZE9wZW5BcGlEb2N1bWVudCB7XG5cdHJldHVybiB7XG5cdFx0b3BlbmFwaTogXCIzLjAuM1wiLFxuXHRcdGluZm86IHtcblx0XHRcdHRpdGxlOiBgJHtwcm9qZWN0TmFtZX0gV2ViQVBJYCxcblx0XHRcdHZlcnNpb246IFwiMS4wLjBcIixcblx0XHRcdGRlc2NyaXB0aW9uOlxuXHRcdFx0XHRcIkdlbmVyYXRlZCBmcm9tIE9wZW5BUEkgZm9yIFBvc3RtYW4uIEF1dGgvZW52IG92ZXJsYXlzIGFyZSBhcHBsaWVkIHNlcGFyYXRlbHkuXCIsXG5cdFx0fSxcblx0XHRzZXJ2ZXJzOiBbeyB1cmw6IFwie3tiYXNlVXJsfX1cIiB9XSxcblx0XHRwYXRoczoge1xuXHRcdFx0XCIvaGVsbG9cIjoge1xuXHRcdFx0XHRnZXQ6IHtcblx0XHRcdFx0XHRvcGVyYXRpb25JZDogXCJIZWxsb0NvbnRyb2xsZXIuZ2V0QWxsXCIsXG5cdFx0XHRcdFx0c3VtbWFyeTogXCJMaXN0IChhbm9ueW1vdXMpXCIsXG5cdFx0XHRcdFx0dGFnczogW1wiSGVsbG9cIl0sXG5cdFx0XHRcdFx0cGFyYW1ldGVyczogW1xuXHRcdFx0XHRcdFx0eyBuYW1lOiBcImZpbHRlclwiLCBpbjogXCJxdWVyeVwiLCByZXF1aXJlZDogZmFsc2UsIHNjaGVtYTogeyB0eXBlOiBcInN0cmluZ1wiIH0gfSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdHJlc3BvbnNlczogeyBcIjIwMFwiOiB7IGRlc2NyaXB0aW9uOiBcIlN1Y2Nlc3NmdWwgcmVzcG9uc2VcIiB9IH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHBvc3Q6IHtcblx0XHRcdFx0XHRvcGVyYXRpb25JZDogXCJIZWxsb0NvbnRyb2xsZXIuY3JlYXRlXCIsXG5cdFx0XHRcdFx0c3VtbWFyeTogXCJDcmVhdGVcIixcblx0XHRcdFx0XHR0YWdzOiBbXCJIZWxsb1wiXSxcblx0XHRcdFx0XHRyZXF1ZXN0Qm9keToge1xuXHRcdFx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRjb250ZW50OiB7XG5cdFx0XHRcdFx0XHRcdFwiYXBwbGljYXRpb24vanNvblwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0c2NoZW1hOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcIm9iamVjdFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydGllczogeyBtZXNzYWdlOiB7IHR5cGU6IFwic3RyaW5nXCIgfSB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0cmVxdWlyZWQ6IFtcIm1lc3NhZ2VcIl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRleGFtcGxlOiB7IG1lc3NhZ2U6IFwiaGVsbG9cIiB9LFxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cmVzcG9uc2VzOiB7IFwiMjAwXCI6IHsgZGVzY3JpcHRpb246IFwiU3VjY2Vzc2Z1bCByZXNwb25zZVwiIH0gfSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRcIi9oZWxsby97aWR9XCI6IHtcblx0XHRcdFx0Z2V0OiB7XG5cdFx0XHRcdFx0b3BlcmF0aW9uSWQ6IFwiSGVsbG9Db250cm9sbGVyLmdldE9uZVwiLFxuXHRcdFx0XHRcdHN1bW1hcnk6IFwiR2V0IGJ5IGlkXCIsXG5cdFx0XHRcdFx0dGFnczogW1wiSGVsbG9cIl0sXG5cdFx0XHRcdFx0cGFyYW1ldGVyczogW3sgbmFtZTogXCJpZFwiLCBpbjogXCJwYXRoXCIsIHJlcXVpcmVkOiB0cnVlLCBzY2hlbWE6IHsgdHlwZTogXCJzdHJpbmdcIiB9IH1dLFxuXHRcdFx0XHRcdHJlc3BvbnNlczogeyBcIjIwMFwiOiB7IGRlc2NyaXB0aW9uOiBcIlN1Y2Nlc3NmdWwgcmVzcG9uc2VcIiB9IH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHB1dDoge1xuXHRcdFx0XHRcdG9wZXJhdGlvbklkOiBcIkhlbGxvQ29udHJvbGxlci51cGRhdGVcIixcblx0XHRcdFx0XHRzdW1tYXJ5OiBcIlVwZGF0ZVwiLFxuXHRcdFx0XHRcdHRhZ3M6IFtcIkhlbGxvXCJdLFxuXHRcdFx0XHRcdHBhcmFtZXRlcnM6IFt7IG5hbWU6IFwiaWRcIiwgaW46IFwicGF0aFwiLCByZXF1aXJlZDogdHJ1ZSwgc2NoZW1hOiB7IHR5cGU6IFwic3RyaW5nXCIgfSB9XSxcblx0XHRcdFx0XHRyZXF1ZXN0Qm9keToge1xuXHRcdFx0XHRcdFx0cmVxdWlyZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRjb250ZW50OiB7XG5cdFx0XHRcdFx0XHRcdFwiYXBwbGljYXRpb24vanNvblwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0c2NoZW1hOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcIm9iamVjdFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydGllczogeyBtZXNzYWdlOiB7IHR5cGU6IFwic3RyaW5nXCIgfSB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0cmVxdWlyZWQ6IFtcIm1lc3NhZ2VcIl0sXG5cdFx0XHRcdFx0XHRcdFx0XHRleGFtcGxlOiB7IG1lc3NhZ2U6IFwidXBkYXRlZFwiIH0sXG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRyZXNwb25zZXM6IHsgXCIyMDBcIjogeyBkZXNjcmlwdGlvbjogXCJTdWNjZXNzZnVsIHJlc3BvbnNlXCIgfSB9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRkZWxldGU6IHtcblx0XHRcdFx0XHRvcGVyYXRpb25JZDogXCJIZWxsb0NvbnRyb2xsZXIucmVtb3ZlXCIsXG5cdFx0XHRcdFx0c3VtbWFyeTogXCJEZWxldGVcIixcblx0XHRcdFx0XHR0YWdzOiBbXCJIZWxsb1wiXSxcblx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBbeyBuYW1lOiBcImlkXCIsIGluOiBcInBhdGhcIiwgcmVxdWlyZWQ6IHRydWUsIHNjaGVtYTogeyB0eXBlOiBcInN0cmluZ1wiIH0gfV0sXG5cdFx0XHRcdFx0cmVzcG9uc2VzOiB7IFwiMjAwXCI6IHsgZGVzY3JpcHRpb246IFwiU3VjY2Vzc2Z1bCByZXNwb25zZVwiIH0gfSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0fSxcblx0fTtcbn1cbiJdLCJuYW1lcyI6WyJidWlsZEhlbGxvT3BlbkFwaURvY3VtZW50IiwicHJvamVjdE5hbWUiLCJvcGVuYXBpIiwiaW5mbyIsInRpdGxlIiwidmVyc2lvbiIsImRlc2NyaXB0aW9uIiwic2VydmVycyIsInVybCIsInBhdGhzIiwiZ2V0Iiwib3BlcmF0aW9uSWQiLCJzdW1tYXJ5IiwidGFncyIsInBhcmFtZXRlcnMiLCJuYW1lIiwiaW4iLCJyZXF1aXJlZCIsInNjaGVtYSIsInR5cGUiLCJyZXNwb25zZXMiLCJwb3N0IiwicmVxdWVzdEJvZHkiLCJjb250ZW50IiwicHJvcGVydGllcyIsIm1lc3NhZ2UiLCJleGFtcGxlIiwicHV0IiwiZGVsZXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxrRUFBa0UsR0FRbEU7OztDQUdDLEdBQ0QsT0FBTyxTQUFTQSwwQkFBMEJDLFdBQW1CO0lBQzVELE9BQU87UUFDTkMsU0FBUztRQUNUQyxNQUFNO1lBQ0xDLE9BQU8sR0FBR0gsWUFBWSxPQUFPLENBQUM7WUFDOUJJLFNBQVM7WUFDVEMsYUFDQztRQUNGO1FBQ0FDLFNBQVM7WUFBQztnQkFBRUMsS0FBSztZQUFjO1NBQUU7UUFDakNDLE9BQU87WUFDTixVQUFVO2dCQUNUQyxLQUFLO29CQUNKQyxhQUFhO29CQUNiQyxTQUFTO29CQUNUQyxNQUFNO3dCQUFDO3FCQUFRO29CQUNmQyxZQUFZO3dCQUNYOzRCQUFFQyxNQUFNOzRCQUFVQyxJQUFJOzRCQUFTQyxVQUFVOzRCQUFPQyxRQUFRO2dDQUFFQyxNQUFNOzRCQUFTO3dCQUFFO3FCQUMzRTtvQkFDREMsV0FBVzt3QkFBRSxPQUFPOzRCQUFFZCxhQUFhO3dCQUFzQjtvQkFBRTtnQkFDNUQ7Z0JBQ0FlLE1BQU07b0JBQ0xWLGFBQWE7b0JBQ2JDLFNBQVM7b0JBQ1RDLE1BQU07d0JBQUM7cUJBQVE7b0JBQ2ZTLGFBQWE7d0JBQ1pMLFVBQVU7d0JBQ1ZNLFNBQVM7NEJBQ1Isb0JBQW9CO2dDQUNuQkwsUUFBUTtvQ0FDUEMsTUFBTTtvQ0FDTkssWUFBWTt3Q0FBRUMsU0FBUzs0Q0FBRU4sTUFBTTt3Q0FBUztvQ0FBRTtvQ0FDMUNGLFVBQVU7d0NBQUM7cUNBQVU7b0NBQ3JCUyxTQUFTO3dDQUFFRCxTQUFTO29DQUFRO2dDQUM3Qjs0QkFDRDt3QkFDRDtvQkFDRDtvQkFDQUwsV0FBVzt3QkFBRSxPQUFPOzRCQUFFZCxhQUFhO3dCQUFzQjtvQkFBRTtnQkFDNUQ7WUFDRDtZQUNBLGVBQWU7Z0JBQ2RJLEtBQUs7b0JBQ0pDLGFBQWE7b0JBQ2JDLFNBQVM7b0JBQ1RDLE1BQU07d0JBQUM7cUJBQVE7b0JBQ2ZDLFlBQVk7d0JBQUM7NEJBQUVDLE1BQU07NEJBQU1DLElBQUk7NEJBQVFDLFVBQVU7NEJBQU1DLFFBQVE7Z0NBQUVDLE1BQU07NEJBQVM7d0JBQUU7cUJBQUU7b0JBQ3BGQyxXQUFXO3dCQUFFLE9BQU87NEJBQUVkLGFBQWE7d0JBQXNCO29CQUFFO2dCQUM1RDtnQkFDQXFCLEtBQUs7b0JBQ0poQixhQUFhO29CQUNiQyxTQUFTO29CQUNUQyxNQUFNO3dCQUFDO3FCQUFRO29CQUNmQyxZQUFZO3dCQUFDOzRCQUFFQyxNQUFNOzRCQUFNQyxJQUFJOzRCQUFRQyxVQUFVOzRCQUFNQyxRQUFRO2dDQUFFQyxNQUFNOzRCQUFTO3dCQUFFO3FCQUFFO29CQUNwRkcsYUFBYTt3QkFDWkwsVUFBVTt3QkFDVk0sU0FBUzs0QkFDUixvQkFBb0I7Z0NBQ25CTCxRQUFRO29DQUNQQyxNQUFNO29DQUNOSyxZQUFZO3dDQUFFQyxTQUFTOzRDQUFFTixNQUFNO3dDQUFTO29DQUFFO29DQUMxQ0YsVUFBVTt3Q0FBQztxQ0FBVTtvQ0FDckJTLFNBQVM7d0NBQUVELFNBQVM7b0NBQVU7Z0NBQy9COzRCQUNEO3dCQUNEO29CQUNEO29CQUNBTCxXQUFXO3dCQUFFLE9BQU87NEJBQUVkLGFBQWE7d0JBQXNCO29CQUFFO2dCQUM1RDtnQkFDQXNCLFFBQVE7b0JBQ1BqQixhQUFhO29CQUNiQyxTQUFTO29CQUNUQyxNQUFNO3dCQUFDO3FCQUFRO29CQUNmQyxZQUFZO3dCQUFDOzRCQUFFQyxNQUFNOzRCQUFNQyxJQUFJOzRCQUFRQyxVQUFVOzRCQUFNQyxRQUFRO2dDQUFFQyxNQUFNOzRCQUFTO3dCQUFFO3FCQUFFO29CQUNwRkMsV0FBVzt3QkFBRSxPQUFPOzRCQUFFZCxhQUFhO3dCQUFzQjtvQkFBRTtnQkFDNUQ7WUFDRDtRQUNEO0lBQ0Q7QUFDRCJ9
@@ -0,0 +1,169 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { openApiPathParamsToColon } from "./openapi-to-postman.js";
3
+ function yamlQuote(value) {
4
+ if (/[:#{}[\],&*?|<>=!%@`]/.test(value) || value.includes("\n") || value === "") {
5
+ return JSON.stringify(value);
6
+ }
7
+ return value;
8
+ }
9
+ /** Local View / Native Git environment (YAML). */ export function buildEnvironmentYaml(name, auth, options) {
10
+ const values = [
11
+ {
12
+ key: "baseUrl",
13
+ value: "http://localhost:3000"
14
+ }
15
+ ];
16
+ if (auth?.auth0Domain) {
17
+ values.push({
18
+ key: "auth0Domain",
19
+ value: auth.auth0Domain
20
+ }, {
21
+ key: "auth0Audience",
22
+ value: auth.auth0Audience ?? ""
23
+ }, {
24
+ key: "auth0ClientId",
25
+ value: auth.auth0ClientId ?? ""
26
+ }, {
27
+ key: "authUrl",
28
+ value: `https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`
29
+ }, {
30
+ key: "accessTokenUrl",
31
+ value: `https://${auth.auth0Domain}/oauth/token`
32
+ }, {
33
+ key: "callbackUrl",
34
+ value: options.callbacks[0]
35
+ }, {
36
+ key: "scope",
37
+ value: options.scopes
38
+ });
39
+ }
40
+ const lines = [
41
+ `name: ${yamlQuote(name)}`,
42
+ "values:"
43
+ ];
44
+ for (const v of values){
45
+ lines.push(` - key: ${v.key}`);
46
+ lines.push(` value: ${yamlQuote(v.value)}`);
47
+ lines.push(" enabled: true");
48
+ }
49
+ return `${lines.join("\n")}\n`;
50
+ }
51
+ /**
52
+ * Build Postman Local View multi-file YAML from a v2.1 collection (routes)
53
+ * plus hand-authored Auth0 overlay.
54
+ */ export function buildLocalViewFilesFromCollection(collection, projectName, auth, options) {
55
+ const collectionDir = `postman/collections/${projectName} WebAPI`;
56
+ const files = [];
57
+ const authBlock = auth?.auth0Domain ? [
58
+ "auth:",
59
+ ` - id: ${randomUUID()}`,
60
+ " type: oauth2",
61
+ " name: OAuth 2.0",
62
+ " credentials:",
63
+ " addTokenTo: header",
64
+ " grant_type: authorization_code_with_pkce",
65
+ ` authUrl: https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`,
66
+ ` accessTokenUrl: https://${auth.auth0Domain}/oauth/token`,
67
+ ` clientId: ${yamlQuote(auth.auth0ClientId ?? "")}`,
68
+ ` scope: ${yamlQuote(options.scopes)}`,
69
+ ` redirect_uri: ${options.callbacks[0]}`,
70
+ " useBrowser: true",
71
+ " challengeAlgorithm: S256",
72
+ " client_authentication: body",
73
+ ' clientSecret: ""',
74
+ ` tokenName: ${yamlQuote(`${projectName} Access Token`)}`,
75
+ ""
76
+ ].join("\n") : "";
77
+ files.push({
78
+ filePath: `${collectionDir}/.resources/definition.yaml`,
79
+ content: [
80
+ "$kind: collection",
81
+ `name: ${yamlQuote(`${projectName} WebAPI`)}`,
82
+ "schemaVersion: '3.0'",
83
+ "description: >-",
84
+ " Open this project root in Postman Local View (Files → Open folder).",
85
+ " Select the Local environment, then Authorization → Get New Access Token (PKCE).",
86
+ " Route requests are generated from OpenAPI; Auth0 overlay is hand-authored.",
87
+ authBlock
88
+ ].filter((l)=>l !== undefined).join("\n").replace(/\n+$/, "\n")
89
+ });
90
+ let folderOrder = 1000;
91
+ for (const folder of collection.item ?? []){
92
+ if (folder.item == null) {
93
+ continue;
94
+ }
95
+ const folderName = folder.name ?? "Requests";
96
+ files.push({
97
+ filePath: `${collectionDir}/${folderName}/.resources/definition.yaml`,
98
+ content: [
99
+ "$kind: folder",
100
+ `name: ${yamlQuote(folderName)}`,
101
+ `order: ${folderOrder}`,
102
+ ""
103
+ ].join("\n")
104
+ });
105
+ folderOrder += 1000;
106
+ let requestOrder = 1000;
107
+ for (const child of folder.item){
108
+ const yaml = requestToLocalViewYaml(child, requestOrder);
109
+ if (yaml == null) {
110
+ continue;
111
+ }
112
+ const fileName = `${sanitizeFileName(child.name ?? "Request")}.request.yaml`;
113
+ files.push({
114
+ filePath: `${collectionDir}/${folderName}/${fileName}`,
115
+ content: yaml
116
+ });
117
+ requestOrder += 1000;
118
+ }
119
+ }
120
+ return files;
121
+ }
122
+ function requestToLocalViewYaml(item, order) {
123
+ const request = item.request;
124
+ if (request == null) {
125
+ return null;
126
+ }
127
+ const method = (request.method ?? "GET").toUpperCase();
128
+ const url = requestUrlForLocalView(request);
129
+ const lines = [
130
+ "$kind: http-request",
131
+ `name: ${yamlQuote(item.name ?? method)}`,
132
+ `method: ${method}`,
133
+ `url: ${yamlQuote(url)}`
134
+ ];
135
+ if (request.auth?.type === "noauth") {
136
+ lines.push("auth:", " type: noauth");
137
+ }
138
+ const contentType = request.header?.find((h)=>h.key.toLowerCase() === "content-type")?.value;
139
+ const rawBody = request.body?.raw?.trim();
140
+ if (rawBody) {
141
+ lines.push("headers:");
142
+ lines.push(` Content-Type: ${contentType ?? "application/json"}`);
143
+ lines.push("body:");
144
+ lines.push(" type: json");
145
+ lines.push(" content: |-");
146
+ for (const bodyLine of rawBody.split("\n")){
147
+ lines.push(` ${bodyLine}`);
148
+ }
149
+ }
150
+ lines.push(`order: ${order}`, "");
151
+ return lines.join("\n");
152
+ }
153
+ function requestUrlForLocalView(request) {
154
+ const url = request.url;
155
+ if (typeof url === "string") {
156
+ return openApiPathParamsToColon(url);
157
+ }
158
+ if (url?.raw) {
159
+ return openApiPathParamsToColon(url.raw);
160
+ }
161
+ const host = url?.host?.[0] ?? "{{baseUrl}}";
162
+ const path = (url?.path ?? []).map((segment)=>openApiPathParamsToColon(String(segment))).join("/");
163
+ return path ? `${host}/${path}` : host;
164
+ }
165
+ function sanitizeFileName(name) {
166
+ return name.replace(/[^\w\s()-]+/g, "").trim() || "Request";
167
+ }
168
+
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL3Bvc3RtYW4vbG9jYWwtdmlldy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQge1xuXHR0eXBlIEF1dGgwRW52LFxuXHRvcGVuQXBpUGF0aFBhcmFtc1RvQ29sb24sXG5cdHR5cGUgUG9zdG1hbkNvbGxlY3Rpb24sXG5cdHR5cGUgUG9zdG1hbkl0ZW0sXG5cdHR5cGUgUG9zdG1hblJlcXVlc3QsXG59IGZyb20gXCIuL29wZW5hcGktdG8tcG9zdG1hbi5qc1wiO1xuXG5mdW5jdGlvbiB5YW1sUXVvdGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICgvWzoje31bXFxdLCYqP3w8Pj0hJUBgXS8udGVzdCh2YWx1ZSkgfHwgdmFsdWUuaW5jbHVkZXMoXCJcXG5cIikgfHwgdmFsdWUgPT09IFwiXCIpIHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLyoqIExvY2FsIFZpZXcgLyBOYXRpdmUgR2l0IGVudmlyb25tZW50IChZQU1MKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVudmlyb25tZW50WWFtbChcblx0bmFtZTogc3RyaW5nLFxuXHRhdXRoOiBBdXRoMEVudiB8IHVuZGVmaW5lZCxcblx0b3B0aW9uczogeyBjYWxsYmFja3M6IHJlYWRvbmx5IHN0cmluZ1tdOyBzY29wZXM6IHN0cmluZyB9LFxuKTogc3RyaW5nIHtcblx0Y29uc3QgdmFsdWVzOiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+ID0gW1xuXHRcdHsga2V5OiBcImJhc2VVcmxcIiwgdmFsdWU6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwXCIgfSxcblx0XTtcblx0aWYgKGF1dGg/LmF1dGgwRG9tYWluKSB7XG5cdFx0dmFsdWVzLnB1c2goXG5cdFx0XHR7IGtleTogXCJhdXRoMERvbWFpblwiLCB2YWx1ZTogYXV0aC5hdXRoMERvbWFpbiB9LFxuXHRcdFx0eyBrZXk6IFwiYXV0aDBBdWRpZW5jZVwiLCB2YWx1ZTogYXV0aC5hdXRoMEF1ZGllbmNlID8/IFwiXCIgfSxcblx0XHRcdHsga2V5OiBcImF1dGgwQ2xpZW50SWRcIiwgdmFsdWU6IGF1dGguYXV0aDBDbGllbnRJZCA/PyBcIlwiIH0sXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJhdXRoVXJsXCIsXG5cdFx0XHRcdHZhbHVlOiBgaHR0cHM6Ly8ke2F1dGguYXV0aDBEb21haW59L2F1dGhvcml6ZT9hdWRpZW5jZT0ke2F1dGguYXV0aDBBdWRpZW5jZSA/PyBcIlwifWAsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRrZXk6IFwiYWNjZXNzVG9rZW5VcmxcIixcblx0XHRcdFx0dmFsdWU6IGBodHRwczovLyR7YXV0aC5hdXRoMERvbWFpbn0vb2F1dGgvdG9rZW5gLFxuXHRcdFx0fSxcblx0XHRcdHsga2V5OiBcImNhbGxiYWNrVXJsXCIsIHZhbHVlOiBvcHRpb25zLmNhbGxiYWNrc1swXSB9LFxuXHRcdFx0eyBrZXk6IFwic2NvcGVcIiwgdmFsdWU6IG9wdGlvbnMuc2NvcGVzIH0sXG5cdFx0KTtcblx0fVxuXG5cdGNvbnN0IGxpbmVzID0gW2BuYW1lOiAke3lhbWxRdW90ZShuYW1lKX1gLCBcInZhbHVlczpcIl07XG5cdGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpIHtcblx0XHRsaW5lcy5wdXNoKGAgIC0ga2V5OiAke3Yua2V5fWApO1xuXHRcdGxpbmVzLnB1c2goYCAgICB2YWx1ZTogJHt5YW1sUXVvdGUodi52YWx1ZSl9YCk7XG5cdFx0bGluZXMucHVzaChcIiAgICBlbmFibGVkOiB0cnVlXCIpO1xuXHR9XG5cdHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbmA7XG59XG5cbi8qKlxuICogQnVpbGQgUG9zdG1hbiBMb2NhbCBWaWV3IG11bHRpLWZpbGUgWUFNTCBmcm9tIGEgdjIuMSBjb2xsZWN0aW9uIChyb3V0ZXMpXG4gKiBwbHVzIGhhbmQtYXV0aG9yZWQgQXV0aDAgb3ZlcmxheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTG9jYWxWaWV3RmlsZXNGcm9tQ29sbGVjdGlvbihcblx0Y29sbGVjdGlvbjogUG9zdG1hbkNvbGxlY3Rpb24sXG5cdHByb2plY3ROYW1lOiBzdHJpbmcsXG5cdGF1dGg6IEF1dGgwRW52IHwgdW5kZWZpbmVkLFxuXHRvcHRpb25zOiB7IGNhbGxiYWNrczogcmVhZG9ubHkgc3RyaW5nW107IHNjb3Blczogc3RyaW5nIH0sXG4pOiBBcnJheTx7IGZpbGVQYXRoOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9PiB7XG5cdGNvbnN0IGNvbGxlY3Rpb25EaXIgPSBgcG9zdG1hbi9jb2xsZWN0aW9ucy8ke3Byb2plY3ROYW1lfSBXZWJBUElgO1xuXHRjb25zdCBmaWxlczogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT4gPSBbXTtcblxuXHRjb25zdCBhdXRoQmxvY2sgPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8gW1xuXHRcdFx0XHRcImF1dGg6XCIsXG5cdFx0XHRcdGAgIC0gaWQ6ICR7cmFuZG9tVVVJRCgpfWAsXG5cdFx0XHRcdFwiICAgIHR5cGU6IG9hdXRoMlwiLFxuXHRcdFx0XHRcIiAgICBuYW1lOiBPQXV0aCAyLjBcIixcblx0XHRcdFx0XCIgICAgY3JlZGVudGlhbHM6XCIsXG5cdFx0XHRcdFwiICAgICAgYWRkVG9rZW5UbzogaGVhZGVyXCIsXG5cdFx0XHRcdFwiICAgICAgZ3JhbnRfdHlwZTogYXV0aG9yaXphdGlvbl9jb2RlX3dpdGhfcGtjZVwiLFxuXHRcdFx0XHRgICAgICAgYXV0aFVybDogaHR0cHM6Ly8ke2F1dGguYXV0aDBEb21haW59L2F1dGhvcml6ZT9hdWRpZW5jZT0ke2F1dGguYXV0aDBBdWRpZW5jZSA/PyBcIlwifWAsXG5cdFx0XHRcdGAgICAgICBhY2Nlc3NUb2tlblVybDogaHR0cHM6Ly8ke2F1dGguYXV0aDBEb21haW59L29hdXRoL3Rva2VuYCxcblx0XHRcdFx0YCAgICAgIGNsaWVudElkOiAke3lhbWxRdW90ZShhdXRoLmF1dGgwQ2xpZW50SWQgPz8gXCJcIil9YCxcblx0XHRcdFx0YCAgICAgIHNjb3BlOiAke3lhbWxRdW90ZShvcHRpb25zLnNjb3Blcyl9YCxcblx0XHRcdFx0YCAgICAgIHJlZGlyZWN0X3VyaTogJHtvcHRpb25zLmNhbGxiYWNrc1swXX1gLFxuXHRcdFx0XHRcIiAgICAgIHVzZUJyb3dzZXI6IHRydWVcIixcblx0XHRcdFx0XCIgICAgICBjaGFsbGVuZ2VBbGdvcml0aG06IFMyNTZcIixcblx0XHRcdFx0XCIgICAgICBjbGllbnRfYXV0aGVudGljYXRpb246IGJvZHlcIixcblx0XHRcdFx0JyAgICAgIGNsaWVudFNlY3JldDogXCJcIicsXG5cdFx0XHRcdGAgICAgICB0b2tlbk5hbWU6ICR7eWFtbFF1b3RlKGAke3Byb2plY3ROYW1lfSBBY2Nlc3MgVG9rZW5gKX1gLFxuXHRcdFx0XHRcIlwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpXG5cdFx0OiBcIlwiO1xuXG5cdGZpbGVzLnB1c2goe1xuXHRcdGZpbGVQYXRoOiBgJHtjb2xsZWN0aW9uRGlyfS8ucmVzb3VyY2VzL2RlZmluaXRpb24ueWFtbGAsXG5cdFx0Y29udGVudDogW1xuXHRcdFx0XCIka2luZDogY29sbGVjdGlvblwiLFxuXHRcdFx0YG5hbWU6ICR7eWFtbFF1b3RlKGAke3Byb2plY3ROYW1lfSBXZWJBUElgKX1gLFxuXHRcdFx0XCJzY2hlbWFWZXJzaW9uOiAnMy4wJ1wiLFxuXHRcdFx0XCJkZXNjcmlwdGlvbjogPi1cIixcblx0XHRcdFwiICBPcGVuIHRoaXMgcHJvamVjdCByb290IGluIFBvc3RtYW4gTG9jYWwgVmlldyAoRmlsZXMg4oaSIE9wZW4gZm9sZGVyKS5cIixcblx0XHRcdFwiICBTZWxlY3QgdGhlIExvY2FsIGVudmlyb25tZW50LCB0aGVuIEF1dGhvcml6YXRpb24g4oaSIEdldCBOZXcgQWNjZXNzIFRva2VuIChQS0NFKS5cIixcblx0XHRcdFwiICBSb3V0ZSByZXF1ZXN0cyBhcmUgZ2VuZXJhdGVkIGZyb20gT3BlbkFQSTsgQXV0aDAgb3ZlcmxheSBpcyBoYW5kLWF1dGhvcmVkLlwiLFxuXHRcdFx0YXV0aEJsb2NrLFxuXHRcdF1cblx0XHRcdC5maWx0ZXIoKGwpID0+IGwgIT09IHVuZGVmaW5lZClcblx0XHRcdC5qb2luKFwiXFxuXCIpXG5cdFx0XHQucmVwbGFjZSgvXFxuKyQvLCBcIlxcblwiKSxcblx0fSk7XG5cblx0bGV0IGZvbGRlck9yZGVyID0gMTAwMDtcblx0Zm9yIChjb25zdCBmb2xkZXIgb2YgY29sbGVjdGlvbi5pdGVtID8/IFtdKSB7XG5cdFx0aWYgKGZvbGRlci5pdGVtID09IG51bGwpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRjb25zdCBmb2xkZXJOYW1lID0gZm9sZGVyLm5hbWUgPz8gXCJSZXF1ZXN0c1wiO1xuXHRcdGZpbGVzLnB1c2goe1xuXHRcdFx0ZmlsZVBhdGg6IGAke2NvbGxlY3Rpb25EaXJ9LyR7Zm9sZGVyTmFtZX0vLnJlc291cmNlcy9kZWZpbml0aW9uLnlhbWxgLFxuXHRcdFx0Y29udGVudDogW1xuXHRcdFx0XHRcIiRraW5kOiBmb2xkZXJcIixcblx0XHRcdFx0YG5hbWU6ICR7eWFtbFF1b3RlKGZvbGRlck5hbWUpfWAsXG5cdFx0XHRcdGBvcmRlcjogJHtmb2xkZXJPcmRlcn1gLFxuXHRcdFx0XHRcIlwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdH0pO1xuXHRcdGZvbGRlck9yZGVyICs9IDEwMDA7XG5cblx0XHRsZXQgcmVxdWVzdE9yZGVyID0gMTAwMDtcblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIGZvbGRlci5pdGVtKSB7XG5cdFx0XHRjb25zdCB5YW1sID0gcmVxdWVzdFRvTG9jYWxWaWV3WWFtbChjaGlsZCwgcmVxdWVzdE9yZGVyKTtcblx0XHRcdGlmICh5YW1sID09IG51bGwpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBmaWxlTmFtZSA9IGAke3Nhbml0aXplRmlsZU5hbWUoY2hpbGQubmFtZSA/PyBcIlJlcXVlc3RcIil9LnJlcXVlc3QueWFtbGA7XG5cdFx0XHRmaWxlcy5wdXNoKHtcblx0XHRcdFx0ZmlsZVBhdGg6IGAke2NvbGxlY3Rpb25EaXJ9LyR7Zm9sZGVyTmFtZX0vJHtmaWxlTmFtZX1gLFxuXHRcdFx0XHRjb250ZW50OiB5YW1sLFxuXHRcdFx0fSk7XG5cdFx0XHRyZXF1ZXN0T3JkZXIgKz0gMTAwMDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmlsZXM7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RUb0xvY2FsVmlld1lhbWwoaXRlbTogUG9zdG1hbkl0ZW0sIG9yZGVyOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcblx0Y29uc3QgcmVxdWVzdCA9IGl0ZW0ucmVxdWVzdDtcblx0aWYgKHJlcXVlc3QgPT0gbnVsbCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGNvbnN0IG1ldGhvZCA9IChyZXF1ZXN0Lm1ldGhvZCA/PyBcIkdFVFwiKS50b1VwcGVyQ2FzZSgpO1xuXHRjb25zdCB1cmwgPSByZXF1ZXN0VXJsRm9yTG9jYWxWaWV3KHJlcXVlc3QpO1xuXHRjb25zdCBsaW5lcyA9IFtcblx0XHRcIiRraW5kOiBodHRwLXJlcXVlc3RcIixcblx0XHRgbmFtZTogJHt5YW1sUXVvdGUoaXRlbS5uYW1lID8/IG1ldGhvZCl9YCxcblx0XHRgbWV0aG9kOiAke21ldGhvZH1gLFxuXHRcdGB1cmw6ICR7eWFtbFF1b3RlKHVybCl9YCxcblx0XTtcblxuXHRpZiAocmVxdWVzdC5hdXRoPy50eXBlID09PSBcIm5vYXV0aFwiKSB7XG5cdFx0bGluZXMucHVzaChcImF1dGg6XCIsIFwiICB0eXBlOiBub2F1dGhcIik7XG5cdH1cblxuXHRjb25zdCBjb250ZW50VHlwZSA9IHJlcXVlc3QuaGVhZGVyPy5maW5kKFxuXHRcdChoKSA9PiBoLmtleS50b0xvd2VyQ2FzZSgpID09PSBcImNvbnRlbnQtdHlwZVwiLFxuXHQpPy52YWx1ZTtcblx0Y29uc3QgcmF3Qm9keSA9IHJlcXVlc3QuYm9keT8ucmF3Py50cmltKCk7XG5cdGlmIChyYXdCb2R5KSB7XG5cdFx0bGluZXMucHVzaChcImhlYWRlcnM6XCIpO1xuXHRcdGxpbmVzLnB1c2goYCAgQ29udGVudC1UeXBlOiAke2NvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwifWApO1xuXHRcdGxpbmVzLnB1c2goXCJib2R5OlwiKTtcblx0XHRsaW5lcy5wdXNoKFwiICB0eXBlOiBqc29uXCIpO1xuXHRcdGxpbmVzLnB1c2goXCIgIGNvbnRlbnQ6IHwtXCIpO1xuXHRcdGZvciAoY29uc3QgYm9keUxpbmUgb2YgcmF3Qm9keS5zcGxpdChcIlxcblwiKSkge1xuXHRcdFx0bGluZXMucHVzaChgICAgICR7Ym9keUxpbmV9YCk7XG5cdFx0fVxuXHR9XG5cblx0bGluZXMucHVzaChgb3JkZXI6ICR7b3JkZXJ9YCwgXCJcIik7XG5cdHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0VXJsRm9yTG9jYWxWaWV3KHJlcXVlc3Q6IFBvc3RtYW5SZXF1ZXN0KTogc3RyaW5nIHtcblx0Y29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cdGlmICh0eXBlb2YgdXJsID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIG9wZW5BcGlQYXRoUGFyYW1zVG9Db2xvbih1cmwpO1xuXHR9XG5cdGlmICh1cmw/LnJhdykge1xuXHRcdHJldHVybiBvcGVuQXBpUGF0aFBhcmFtc1RvQ29sb24odXJsLnJhdyk7XG5cdH1cblx0Y29uc3QgaG9zdCA9IHVybD8uaG9zdD8uWzBdID8/IFwie3tiYXNlVXJsfX1cIjtcblx0Y29uc3QgcGF0aCA9ICh1cmw/LnBhdGggPz8gW10pXG5cdFx0Lm1hcCgoc2VnbWVudCkgPT4gb3BlbkFwaVBhdGhQYXJhbXNUb0NvbG9uKFN0cmluZyhzZWdtZW50KSkpXG5cdFx0LmpvaW4oXCIvXCIpO1xuXHRyZXR1cm4gcGF0aCA/IGAke2hvc3R9LyR7cGF0aH1gIDogaG9zdDtcbn1cblxuZnVuY3Rpb24gc2FuaXRpemVGaWxlTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gbmFtZS5yZXBsYWNlKC9bXlxcd1xccygpLV0rL2csIFwiXCIpLnRyaW0oKSB8fCBcIlJlcXVlc3RcIjtcbn1cbiJdLCJuYW1lcyI6WyJyYW5kb21VVUlEIiwib3BlbkFwaVBhdGhQYXJhbXNUb0NvbG9uIiwieWFtbFF1b3RlIiwidmFsdWUiLCJ0ZXN0IiwiaW5jbHVkZXMiLCJKU09OIiwic3RyaW5naWZ5IiwiYnVpbGRFbnZpcm9ubWVudFlhbWwiLCJuYW1lIiwiYXV0aCIsIm9wdGlvbnMiLCJ2YWx1ZXMiLCJrZXkiLCJhdXRoMERvbWFpbiIsInB1c2giLCJhdXRoMEF1ZGllbmNlIiwiYXV0aDBDbGllbnRJZCIsImNhbGxiYWNrcyIsInNjb3BlcyIsImxpbmVzIiwidiIsImpvaW4iLCJidWlsZExvY2FsVmlld0ZpbGVzRnJvbUNvbGxlY3Rpb24iLCJjb2xsZWN0aW9uIiwicHJvamVjdE5hbWUiLCJjb2xsZWN0aW9uRGlyIiwiZmlsZXMiLCJhdXRoQmxvY2siLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJmaWx0ZXIiLCJsIiwidW5kZWZpbmVkIiwicmVwbGFjZSIsImZvbGRlck9yZGVyIiwiZm9sZGVyIiwiaXRlbSIsImZvbGRlck5hbWUiLCJyZXF1ZXN0T3JkZXIiLCJjaGlsZCIsInlhbWwiLCJyZXF1ZXN0VG9Mb2NhbFZpZXdZYW1sIiwiZmlsZU5hbWUiLCJzYW5pdGl6ZUZpbGVOYW1lIiwib3JkZXIiLCJyZXF1ZXN0IiwibWV0aG9kIiwidG9VcHBlckNhc2UiLCJ1cmwiLCJyZXF1ZXN0VXJsRm9yTG9jYWxWaWV3IiwidHlwZSIsImNvbnRlbnRUeXBlIiwiaGVhZGVyIiwiZmluZCIsImgiLCJ0b0xvd2VyQ2FzZSIsInJhd0JvZHkiLCJib2R5IiwicmF3IiwidHJpbSIsImJvZHlMaW5lIiwic3BsaXQiLCJob3N0IiwicGF0aCIsIm1hcCIsInNlZ21lbnQiLCJTdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxjQUFjO0FBQ3pDLFNBRUNDLHdCQUF3QixRQUlsQiwwQkFBMEI7QUFFakMsU0FBU0MsVUFBVUMsS0FBYTtJQUMvQixJQUFJLHdCQUF3QkMsSUFBSSxDQUFDRCxVQUFVQSxNQUFNRSxRQUFRLENBQUMsU0FBU0YsVUFBVSxJQUFJO1FBQ2hGLE9BQU9HLEtBQUtDLFNBQVMsQ0FBQ0o7SUFDdkI7SUFDQSxPQUFPQTtBQUNSO0FBRUEsZ0RBQWdELEdBQ2hELE9BQU8sU0FBU0sscUJBQ2ZDLElBQVksRUFDWkMsSUFBMEIsRUFDMUJDLE9BQXlEO0lBRXpELE1BQU1DLFNBQWdEO1FBQ3JEO1lBQUVDLEtBQUs7WUFBV1YsT0FBTztRQUF3QjtLQUNqRDtJQUNELElBQUlPLE1BQU1JLGFBQWE7UUFDdEJGLE9BQU9HLElBQUksQ0FDVjtZQUFFRixLQUFLO1lBQWVWLE9BQU9PLEtBQUtJLFdBQVc7UUFBQyxHQUM5QztZQUFFRCxLQUFLO1lBQWlCVixPQUFPTyxLQUFLTSxhQUFhLElBQUk7UUFBRyxHQUN4RDtZQUFFSCxLQUFLO1lBQWlCVixPQUFPTyxLQUFLTyxhQUFhLElBQUk7UUFBRyxHQUN4RDtZQUNDSixLQUFLO1lBQ0xWLE9BQU8sQ0FBQyxRQUFRLEVBQUVPLEtBQUtJLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRUosS0FBS00sYUFBYSxJQUFJLElBQUk7UUFDcEYsR0FDQTtZQUNDSCxLQUFLO1lBQ0xWLE9BQU8sQ0FBQyxRQUFRLEVBQUVPLEtBQUtJLFdBQVcsQ0FBQyxZQUFZLENBQUM7UUFDakQsR0FDQTtZQUFFRCxLQUFLO1lBQWVWLE9BQU9RLFFBQVFPLFNBQVMsQ0FBQyxFQUFFO1FBQUMsR0FDbEQ7WUFBRUwsS0FBSztZQUFTVixPQUFPUSxRQUFRUSxNQUFNO1FBQUM7SUFFeEM7SUFFQSxNQUFNQyxRQUFRO1FBQUMsQ0FBQyxNQUFNLEVBQUVsQixVQUFVTyxPQUFPO1FBQUU7S0FBVTtJQUNyRCxLQUFLLE1BQU1ZLEtBQUtULE9BQVE7UUFDdkJRLE1BQU1MLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRU0sRUFBRVIsR0FBRyxFQUFFO1FBQzlCTyxNQUFNTCxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUViLFVBQVVtQixFQUFFbEIsS0FBSyxHQUFHO1FBQzdDaUIsTUFBTUwsSUFBSSxDQUFDO0lBQ1o7SUFDQSxPQUFPLEdBQUdLLE1BQU1FLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUMvQjtBQUVBOzs7Q0FHQyxHQUNELE9BQU8sU0FBU0Msa0NBQ2ZDLFVBQTZCLEVBQzdCQyxXQUFtQixFQUNuQmYsSUFBMEIsRUFDMUJDLE9BQXlEO0lBRXpELE1BQU1lLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFRCxZQUFZLE9BQU8sQ0FBQztJQUNqRSxNQUFNRSxRQUFzRCxFQUFFO0lBRTlELE1BQU1DLFlBQVlsQixNQUFNSSxjQUNyQjtRQUNBO1FBQ0EsQ0FBQyxRQUFRLEVBQUVkLGNBQWM7UUFDekI7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLENBQUMsdUJBQXVCLEVBQUVVLEtBQUtJLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRUosS0FBS00sYUFBYSxJQUFJLElBQUk7UUFDM0YsQ0FBQyw4QkFBOEIsRUFBRU4sS0FBS0ksV0FBVyxDQUFDLFlBQVksQ0FBQztRQUMvRCxDQUFDLGdCQUFnQixFQUFFWixVQUFVUSxLQUFLTyxhQUFhLElBQUksS0FBSztRQUN4RCxDQUFDLGFBQWEsRUFBRWYsVUFBVVMsUUFBUVEsTUFBTSxHQUFHO1FBQzNDLENBQUMsb0JBQW9CLEVBQUVSLFFBQVFPLFNBQVMsQ0FBQyxFQUFFLEVBQUU7UUFDN0M7UUFDQTtRQUNBO1FBQ0E7UUFDQSxDQUFDLGlCQUFpQixFQUFFaEIsVUFBVSxHQUFHdUIsWUFBWSxhQUFhLENBQUMsR0FBRztRQUM5RDtLQUNBLENBQUNILElBQUksQ0FBQyxRQUNOO0lBRUhLLE1BQU1aLElBQUksQ0FBQztRQUNWYyxVQUFVLEdBQUdILGNBQWMsMkJBQTJCLENBQUM7UUFDdkRJLFNBQVM7WUFDUjtZQUNBLENBQUMsTUFBTSxFQUFFNUIsVUFBVSxHQUFHdUIsWUFBWSxPQUFPLENBQUMsR0FBRztZQUM3QztZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0FHO1NBQ0EsQ0FDQ0csTUFBTSxDQUFDLENBQUNDLElBQU1BLE1BQU1DLFdBQ3BCWCxJQUFJLENBQUMsTUFDTFksT0FBTyxDQUFDLFFBQVE7SUFDbkI7SUFFQSxJQUFJQyxjQUFjO0lBQ2xCLEtBQUssTUFBTUMsVUFBVVosV0FBV2EsSUFBSSxJQUFJLEVBQUUsQ0FBRTtRQUMzQyxJQUFJRCxPQUFPQyxJQUFJLElBQUksTUFBTTtZQUN4QjtRQUNEO1FBQ0EsTUFBTUMsYUFBYUYsT0FBTzNCLElBQUksSUFBSTtRQUNsQ2tCLE1BQU1aLElBQUksQ0FBQztZQUNWYyxVQUFVLEdBQUdILGNBQWMsQ0FBQyxFQUFFWSxXQUFXLDJCQUEyQixDQUFDO1lBQ3JFUixTQUFTO2dCQUNSO2dCQUNBLENBQUMsTUFBTSxFQUFFNUIsVUFBVW9DLGFBQWE7Z0JBQ2hDLENBQUMsT0FBTyxFQUFFSCxhQUFhO2dCQUN2QjthQUNBLENBQUNiLElBQUksQ0FBQztRQUNSO1FBQ0FhLGVBQWU7UUFFZixJQUFJSSxlQUFlO1FBQ25CLEtBQUssTUFBTUMsU0FBU0osT0FBT0MsSUFBSSxDQUFFO1lBQ2hDLE1BQU1JLE9BQU9DLHVCQUF1QkYsT0FBT0Q7WUFDM0MsSUFBSUUsUUFBUSxNQUFNO2dCQUNqQjtZQUNEO1lBQ0EsTUFBTUUsV0FBVyxHQUFHQyxpQkFBaUJKLE1BQU0vQixJQUFJLElBQUksV0FBVyxhQUFhLENBQUM7WUFDNUVrQixNQUFNWixJQUFJLENBQUM7Z0JBQ1ZjLFVBQVUsR0FBR0gsY0FBYyxDQUFDLEVBQUVZLFdBQVcsQ0FBQyxFQUFFSyxVQUFVO2dCQUN0RGIsU0FBU1c7WUFDVjtZQUNBRixnQkFBZ0I7UUFDakI7SUFDRDtJQUVBLE9BQU9aO0FBQ1I7QUFFQSxTQUFTZSx1QkFBdUJMLElBQWlCLEVBQUVRLEtBQWE7SUFDL0QsTUFBTUMsVUFBVVQsS0FBS1MsT0FBTztJQUM1QixJQUFJQSxXQUFXLE1BQU07UUFDcEIsT0FBTztJQUNSO0lBQ0EsTUFBTUMsU0FBUyxBQUFDRCxDQUFBQSxRQUFRQyxNQUFNLElBQUksS0FBSSxFQUFHQyxXQUFXO0lBQ3BELE1BQU1DLE1BQU1DLHVCQUF1Qko7SUFDbkMsTUFBTTFCLFFBQVE7UUFDYjtRQUNBLENBQUMsTUFBTSxFQUFFbEIsVUFBVW1DLEtBQUs1QixJQUFJLElBQUlzQyxTQUFTO1FBQ3pDLENBQUMsUUFBUSxFQUFFQSxRQUFRO1FBQ25CLENBQUMsS0FBSyxFQUFFN0MsVUFBVStDLE1BQU07S0FDeEI7SUFFRCxJQUFJSCxRQUFRcEMsSUFBSSxFQUFFeUMsU0FBUyxVQUFVO1FBQ3BDL0IsTUFBTUwsSUFBSSxDQUFDLFNBQVM7SUFDckI7SUFFQSxNQUFNcUMsY0FBY04sUUFBUU8sTUFBTSxFQUFFQyxLQUNuQyxDQUFDQyxJQUFNQSxFQUFFMUMsR0FBRyxDQUFDMkMsV0FBVyxPQUFPLGlCQUM3QnJEO0lBQ0gsTUFBTXNELFVBQVVYLFFBQVFZLElBQUksRUFBRUMsS0FBS0M7SUFDbkMsSUFBSUgsU0FBUztRQUNackMsTUFBTUwsSUFBSSxDQUFDO1FBQ1hLLE1BQU1MLElBQUksQ0FBQyxDQUFDLGdCQUFnQixFQUFFcUMsZUFBZSxvQkFBb0I7UUFDakVoQyxNQUFNTCxJQUFJLENBQUM7UUFDWEssTUFBTUwsSUFBSSxDQUFDO1FBQ1hLLE1BQU1MLElBQUksQ0FBQztRQUNYLEtBQUssTUFBTThDLFlBQVlKLFFBQVFLLEtBQUssQ0FBQyxNQUFPO1lBQzNDMUMsTUFBTUwsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFOEMsVUFBVTtRQUM3QjtJQUNEO0lBRUF6QyxNQUFNTCxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU4QixPQUFPLEVBQUU7SUFDOUIsT0FBT3pCLE1BQU1FLElBQUksQ0FBQztBQUNuQjtBQUVBLFNBQVM0Qix1QkFBdUJKLE9BQXVCO0lBQ3RELE1BQU1HLE1BQU1ILFFBQVFHLEdBQUc7SUFDdkIsSUFBSSxPQUFPQSxRQUFRLFVBQVU7UUFDNUIsT0FBT2hELHlCQUF5QmdEO0lBQ2pDO0lBQ0EsSUFBSUEsS0FBS1UsS0FBSztRQUNiLE9BQU8xRCx5QkFBeUJnRCxJQUFJVSxHQUFHO0lBQ3hDO0lBQ0EsTUFBTUksT0FBT2QsS0FBS2MsTUFBTSxDQUFDLEVBQUUsSUFBSTtJQUMvQixNQUFNQyxPQUFPLEFBQUNmLENBQUFBLEtBQUtlLFFBQVEsRUFBRSxBQUFELEVBQzFCQyxHQUFHLENBQUMsQ0FBQ0MsVUFBWWpFLHlCQUF5QmtFLE9BQU9ELFdBQ2pENUMsSUFBSSxDQUFDO0lBQ1AsT0FBTzBDLE9BQU8sR0FBR0QsS0FBSyxDQUFDLEVBQUVDLE1BQU0sR0FBR0Q7QUFDbkM7QUFFQSxTQUFTbkIsaUJBQWlCbkMsSUFBWTtJQUNyQyxPQUFPQSxLQUFLeUIsT0FBTyxDQUFDLGdCQUFnQixJQUFJMEIsSUFBSSxNQUFNO0FBQ25EIn0=
@@ -0,0 +1,179 @@
1
+ import converter from "openapi-to-postmanv2";
2
+ function convertAsync(data, options) {
3
+ return new Promise((resolve, reject)=>{
4
+ converter.convert({
5
+ type: "json",
6
+ data
7
+ }, options, (err, result)=>{
8
+ if (err) {
9
+ reject(err);
10
+ return;
11
+ }
12
+ resolve(result);
13
+ });
14
+ });
15
+ }
16
+ /** Convert an OpenAPI document to a Postman Collection v2.1 via openapi-to-postmanv2. */ export async function openApiToPostmanCollection(document) {
17
+ const result = await convertAsync(document, {
18
+ folderStrategy: "Tags",
19
+ requestNameSource: "Fallback",
20
+ includeAuthInfoInExample: false
21
+ });
22
+ if (!result.result || result.output?.[0]?.data == null) {
23
+ throw new Error(result.reason ?? "openapi-to-postmanv2 conversion failed");
24
+ }
25
+ return result.output[0].data;
26
+ }
27
+ /**
28
+ * Overlay Auth0 OAuth2 (PKCE) collection auth and fix Local View-friendly URLs.
29
+ * Route items come from OpenAPI; auth/env remain hand-authored.
30
+ */ export function applyPostmanAuthOverlay(collection, projectName, auth, options) {
31
+ const next = {
32
+ ...collection,
33
+ info: {
34
+ ...collection.info,
35
+ name: `${projectName} WebAPI`,
36
+ description: options.description,
37
+ schema: collection.info.schema ?? "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
38
+ }
39
+ };
40
+ if (auth?.auth0Domain) {
41
+ next.auth = {
42
+ type: "oauth2",
43
+ oauth2: [
44
+ {
45
+ key: "grant_type",
46
+ value: "authorization_code_with_pkce",
47
+ type: "string"
48
+ },
49
+ {
50
+ key: "authUrl",
51
+ value: "https://{{auth0Domain}}/authorize?audience={{auth0Audience}}",
52
+ type: "string"
53
+ },
54
+ {
55
+ key: "accessTokenUrl",
56
+ value: "https://{{auth0Domain}}/oauth/token",
57
+ type: "string"
58
+ },
59
+ {
60
+ key: "clientId",
61
+ value: "{{auth0ClientId}}",
62
+ type: "string"
63
+ },
64
+ {
65
+ key: "scope",
66
+ value: options.scopes,
67
+ type: "string"
68
+ },
69
+ {
70
+ key: "redirect_uri",
71
+ value: options.callbacks[0],
72
+ type: "string"
73
+ },
74
+ {
75
+ key: "useBrowser",
76
+ value: "true",
77
+ type: "boolean"
78
+ },
79
+ {
80
+ key: "addTokenTo",
81
+ value: "header",
82
+ type: "string"
83
+ },
84
+ {
85
+ key: "challengeAlgorithm",
86
+ value: "S256",
87
+ type: "string"
88
+ },
89
+ {
90
+ key: "client_authentication",
91
+ value: "body",
92
+ type: "string"
93
+ },
94
+ {
95
+ key: "clientSecret",
96
+ value: "",
97
+ type: "string"
98
+ },
99
+ {
100
+ key: "tokenName",
101
+ value: `${projectName} Access Token`,
102
+ type: "string"
103
+ }
104
+ ]
105
+ };
106
+ }
107
+ next.item = rewriteCollectionItems(collection.item ?? [], {
108
+ markListAnonymous: true
109
+ });
110
+ return next;
111
+ }
112
+ function rewriteCollectionItems(items, opts) {
113
+ return items.map((item)=>{
114
+ if (item.item != null) {
115
+ return {
116
+ ...item,
117
+ item: rewriteCollectionItems(item.item, opts)
118
+ };
119
+ }
120
+ const request = item.request;
121
+ if (request == null) {
122
+ return item;
123
+ }
124
+ const method = (request.method ?? "GET").toUpperCase();
125
+ const rawUrl = requestUrlRaw(request);
126
+ const nextRequest = {
127
+ ...request,
128
+ url: toPostmanUrl(rawUrl)
129
+ };
130
+ // List Hello stays anonymous (matches scaffold AllowAnonymous on GET /hello).
131
+ if (opts.markListAnonymous && method === "GET" && normalizePath(rawUrl) === "/hello" && !rawUrl.includes("/:")) {
132
+ nextRequest.auth = {
133
+ type: "noauth"
134
+ };
135
+ }
136
+ return {
137
+ ...item,
138
+ request: nextRequest
139
+ };
140
+ });
141
+ }
142
+ function requestUrlRaw(request) {
143
+ const url = request.url;
144
+ if (typeof url === "string") {
145
+ return url;
146
+ }
147
+ if (url?.raw) {
148
+ return url.raw;
149
+ }
150
+ const host = url?.host?.[0] ?? "{{baseUrl}}";
151
+ const path = (url?.path ?? []).join("/");
152
+ return path ? `${host}/${path}` : host;
153
+ }
154
+ /** OpenAPI `{id}` → Postman `:id`, without touching `{{variables}}`. */ export function openApiPathParamsToColon(url) {
155
+ return url.replace(/(?<!\{)\{([A-Za-z_][\w]*)\}(?!\})/g, ":$1");
156
+ }
157
+ function normalizePath(rawUrl) {
158
+ const withoutBase = rawUrl.replace(/\{\{baseUrl\}\}/g, "").split("?")[0] ?? "";
159
+ const withSlash = withoutBase.startsWith("/") ? withoutBase : `/${withoutBase}`;
160
+ return openApiPathParamsToColon(withSlash);
161
+ }
162
+ /** Prefer Postman template URL shape used by existing Local View / API uploads. */ function toPostmanUrl(rawUrl) {
163
+ let pathPart = rawUrl.replace(/\{\{baseUrl\}\}/g, "");
164
+ if (!pathPart.startsWith("/")) {
165
+ pathPart = `/${pathPart}`;
166
+ }
167
+ // openapi-to-postman uses {id}; Local View / prior collections use :id
168
+ pathPart = openApiPathParamsToColon(pathPart);
169
+ const segments = pathPart.split("/").filter(Boolean);
170
+ return {
171
+ raw: `{{baseUrl}}${pathPart}`,
172
+ host: [
173
+ "{{baseUrl}}"
174
+ ],
175
+ path: segments
176
+ };
177
+ }
178
+
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL3Bvc3RtYW4vb3BlbmFwaS10by1wb3N0bWFuLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb252ZXJ0ZXIgZnJvbSBcIm9wZW5hcGktdG8tcG9zdG1hbnYyXCI7XG5pbXBvcnQgdHlwZSB7IFNjYWZmb2xkT3BlbkFwaURvY3VtZW50IH0gZnJvbSBcIi4vaGVsbG8tb3BlbmFwaS5qc1wiO1xuXG5leHBvcnQgdHlwZSBQb3N0bWFuQ29sbGVjdGlvbiA9IHtcblx0aW5mbzoge1xuXHRcdF9wb3N0bWFuX2lkPzogc3RyaW5nO1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHRzY2hlbWE6IHN0cmluZztcblx0XHRkZXNjcmlwdGlvbj86IHN0cmluZztcblx0fTtcblx0YXV0aD86IHVua25vd247XG5cdGl0ZW0/OiBQb3N0bWFuSXRlbVtdO1xuXHR2YXJpYWJsZT86IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT47XG5cdFtrZXk6IHN0cmluZ106IHVua25vd247XG59O1xuXG5leHBvcnQgdHlwZSBQb3N0bWFuSXRlbSA9IHtcblx0bmFtZT86IHN0cmluZztcblx0aXRlbT86IFBvc3RtYW5JdGVtW107XG5cdHJlcXVlc3Q/OiBQb3N0bWFuUmVxdWVzdDtcblx0W2tleTogc3RyaW5nXTogdW5rbm93bjtcbn07XG5cbmV4cG9ydCB0eXBlIFBvc3RtYW5SZXF1ZXN0ID0ge1xuXHRtZXRob2Q/OiBzdHJpbmc7XG5cdGhlYWRlcj86IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT47XG5cdGJvZHk/OiB7IG1vZGU/OiBzdHJpbmc7IHJhdz86IHN0cmluZyB9O1xuXHR1cmw/OiBzdHJpbmcgfCB7IHJhdz86IHN0cmluZzsgaG9zdD86IHN0cmluZ1tdOyBwYXRoPzogc3RyaW5nW107IHZhcmlhYmxlPzogdW5rbm93bltdIH07XG5cdGF1dGg/OiB7IHR5cGU6IHN0cmluZzsgW2tleTogc3RyaW5nXTogdW5rbm93biB9O1xuXHRba2V5OiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgQXV0aDBFbnYgPSB7XG5cdGF1dGgwRG9tYWluPzogc3RyaW5nO1xuXHRhdXRoMEF1ZGllbmNlPzogc3RyaW5nO1xuXHRhdXRoMENsaWVudElkPzogc3RyaW5nO1xufTtcblxudHlwZSBDb252ZXJ0UmVzdWx0ID0ge1xuXHRyZXN1bHQ6IGJvb2xlYW47XG5cdHJlYXNvbj86IHN0cmluZztcblx0b3V0cHV0PzogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IGRhdGE6IFBvc3RtYW5Db2xsZWN0aW9uIH0+O1xufTtcblxuZnVuY3Rpb24gY29udmVydEFzeW5jKFxuXHRkYXRhOiBTY2FmZm9sZE9wZW5BcGlEb2N1bWVudCxcblx0b3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBQcm9taXNlPENvbnZlcnRSZXN1bHQ+IHtcblx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb252ZXJ0ZXIuY29udmVydChcblx0XHRcdHsgdHlwZTogXCJqc29uXCIsIGRhdGEgfSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHQoZXJyOiBFcnJvciB8IG51bGwsIHJlc3VsdDogQ29udmVydFJlc3VsdCkgPT4ge1xuXHRcdFx0XHRpZiAoZXJyKSB7XG5cdFx0XHRcdFx0cmVqZWN0KGVycik7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlc29sdmUocmVzdWx0KTtcblx0XHRcdH0sXG5cdFx0KTtcblx0fSk7XG59XG5cbi8qKiBDb252ZXJ0IGFuIE9wZW5BUEkgZG9jdW1lbnQgdG8gYSBQb3N0bWFuIENvbGxlY3Rpb24gdjIuMSB2aWEgb3BlbmFwaS10by1wb3N0bWFudjIuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlbkFwaVRvUG9zdG1hbkNvbGxlY3Rpb24oXG5cdGRvY3VtZW50OiBTY2FmZm9sZE9wZW5BcGlEb2N1bWVudCxcbik6IFByb21pc2U8UG9zdG1hbkNvbGxlY3Rpb24+IHtcblx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgY29udmVydEFzeW5jKGRvY3VtZW50LCB7XG5cdFx0Zm9sZGVyU3RyYXRlZ3k6IFwiVGFnc1wiLFxuXHRcdHJlcXVlc3ROYW1lU291cmNlOiBcIkZhbGxiYWNrXCIsXG5cdFx0aW5jbHVkZUF1dGhJbmZvSW5FeGFtcGxlOiBmYWxzZSxcblx0fSk7XG5cdGlmICghcmVzdWx0LnJlc3VsdCB8fCByZXN1bHQub3V0cHV0Py5bMF0/LmRhdGEgPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihyZXN1bHQucmVhc29uID8/IFwib3BlbmFwaS10by1wb3N0bWFudjIgY29udmVyc2lvbiBmYWlsZWRcIik7XG5cdH1cblx0cmV0dXJuIHJlc3VsdC5vdXRwdXRbMF0uZGF0YTtcbn1cblxuLyoqXG4gKiBPdmVybGF5IEF1dGgwIE9BdXRoMiAoUEtDRSkgY29sbGVjdGlvbiBhdXRoIGFuZCBmaXggTG9jYWwgVmlldy1mcmllbmRseSBVUkxzLlxuICogUm91dGUgaXRlbXMgY29tZSBmcm9tIE9wZW5BUEk7IGF1dGgvZW52IHJlbWFpbiBoYW5kLWF1dGhvcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlQb3N0bWFuQXV0aE92ZXJsYXkoXG5cdGNvbGxlY3Rpb246IFBvc3RtYW5Db2xsZWN0aW9uLFxuXHRwcm9qZWN0TmFtZTogc3RyaW5nLFxuXHRhdXRoOiBBdXRoMEVudiB8IHVuZGVmaW5lZCxcblx0b3B0aW9uczoge1xuXHRcdGNhbGxiYWNrczogcmVhZG9ubHkgc3RyaW5nW107XG5cdFx0c2NvcGVzOiBzdHJpbmc7XG5cdFx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0fSxcbik6IFBvc3RtYW5Db2xsZWN0aW9uIHtcblx0Y29uc3QgbmV4dDogUG9zdG1hbkNvbGxlY3Rpb24gPSB7XG5cdFx0Li4uY29sbGVjdGlvbixcblx0XHRpbmZvOiB7XG5cdFx0XHQuLi5jb2xsZWN0aW9uLmluZm8sXG5cdFx0XHRuYW1lOiBgJHtwcm9qZWN0TmFtZX0gV2ViQVBJYCxcblx0XHRcdGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuXHRcdFx0c2NoZW1hOlxuXHRcdFx0XHRjb2xsZWN0aW9uLmluZm8uc2NoZW1hID8/XG5cdFx0XHRcdFwiaHR0cHM6Ly9zY2hlbWEuZ2V0cG9zdG1hbi5jb20vanNvbi9jb2xsZWN0aW9uL3YyLjEuMC9jb2xsZWN0aW9uLmpzb25cIixcblx0XHR9LFxuXHR9O1xuXG5cdGlmIChhdXRoPy5hdXRoMERvbWFpbikge1xuXHRcdG5leHQuYXV0aCA9IHtcblx0XHRcdHR5cGU6IFwib2F1dGgyXCIsXG5cdFx0XHRvYXV0aDI6IFtcblx0XHRcdFx0eyBrZXk6IFwiZ3JhbnRfdHlwZVwiLCB2YWx1ZTogXCJhdXRob3JpemF0aW9uX2NvZGVfd2l0aF9wa2NlXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogXCJhdXRoVXJsXCIsXG5cdFx0XHRcdFx0dmFsdWU6IFwiaHR0cHM6Ly97e2F1dGgwRG9tYWlufX0vYXV0aG9yaXplP2F1ZGllbmNlPXt7YXV0aDBBdWRpZW5jZX19XCIsXG5cdFx0XHRcdFx0dHlwZTogXCJzdHJpbmdcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGtleTogXCJhY2Nlc3NUb2tlblVybFwiLFxuXHRcdFx0XHRcdHZhbHVlOiBcImh0dHBzOi8ve3thdXRoMERvbWFpbn19L29hdXRoL3Rva2VuXCIsXG5cdFx0XHRcdFx0dHlwZTogXCJzdHJpbmdcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0eyBrZXk6IFwiY2xpZW50SWRcIiwgdmFsdWU6IFwie3thdXRoMENsaWVudElkfX1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHR7IGtleTogXCJzY29wZVwiLCB2YWx1ZTogb3B0aW9ucy5zY29wZXMsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0eyBrZXk6IFwicmVkaXJlY3RfdXJpXCIsIHZhbHVlOiBvcHRpb25zLmNhbGxiYWNrc1swXSwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHR7IGtleTogXCJ1c2VCcm93c2VyXCIsIHZhbHVlOiBcInRydWVcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcblx0XHRcdFx0eyBrZXk6IFwiYWRkVG9rZW5Ub1wiLCB2YWx1ZTogXCJoZWFkZXJcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHR7IGtleTogXCJjaGFsbGVuZ2VBbGdvcml0aG1cIiwgdmFsdWU6IFwiUzI1NlwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdHsga2V5OiBcImNsaWVudF9hdXRoZW50aWNhdGlvblwiLCB2YWx1ZTogXCJib2R5XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0eyBrZXk6IFwiY2xpZW50U2VjcmV0XCIsIHZhbHVlOiBcIlwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdHsga2V5OiBcInRva2VuTmFtZVwiLCB2YWx1ZTogYCR7cHJvamVjdE5hbWV9IEFjY2VzcyBUb2tlbmAsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdF0sXG5cdFx0fTtcblx0fVxuXG5cdG5leHQuaXRlbSA9IHJld3JpdGVDb2xsZWN0aW9uSXRlbXMoY29sbGVjdGlvbi5pdGVtID8/IFtdLCB7XG5cdFx0bWFya0xpc3RBbm9ueW1vdXM6IHRydWUsXG5cdH0pO1xuXHRyZXR1cm4gbmV4dDtcbn1cblxuZnVuY3Rpb24gcmV3cml0ZUNvbGxlY3Rpb25JdGVtcyhcblx0aXRlbXM6IFBvc3RtYW5JdGVtW10sXG5cdG9wdHM6IHsgbWFya0xpc3RBbm9ueW1vdXM6IGJvb2xlYW4gfSxcbik6IFBvc3RtYW5JdGVtW10ge1xuXHRyZXR1cm4gaXRlbXMubWFwKChpdGVtKSA9PiB7XG5cdFx0aWYgKGl0ZW0uaXRlbSAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm4geyAuLi5pdGVtLCBpdGVtOiByZXdyaXRlQ29sbGVjdGlvbkl0ZW1zKGl0ZW0uaXRlbSwgb3B0cykgfTtcblx0XHR9XG5cdFx0Y29uc3QgcmVxdWVzdCA9IGl0ZW0ucmVxdWVzdDtcblx0XHRpZiAocmVxdWVzdCA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gaXRlbTtcblx0XHR9XG5cdFx0Y29uc3QgbWV0aG9kID0gKHJlcXVlc3QubWV0aG9kID8/IFwiR0VUXCIpLnRvVXBwZXJDYXNlKCk7XG5cdFx0Y29uc3QgcmF3VXJsID0gcmVxdWVzdFVybFJhdyhyZXF1ZXN0KTtcblx0XHRjb25zdCBuZXh0UmVxdWVzdDogUG9zdG1hblJlcXVlc3QgPSB7XG5cdFx0XHQuLi5yZXF1ZXN0LFxuXHRcdFx0dXJsOiB0b1Bvc3RtYW5VcmwocmF3VXJsKSxcblx0XHR9O1xuXHRcdC8vIExpc3QgSGVsbG8gc3RheXMgYW5vbnltb3VzIChtYXRjaGVzIHNjYWZmb2xkIEFsbG93QW5vbnltb3VzIG9uIEdFVCAvaGVsbG8pLlxuXHRcdGlmIChcblx0XHRcdG9wdHMubWFya0xpc3RBbm9ueW1vdXMgJiZcblx0XHRcdG1ldGhvZCA9PT0gXCJHRVRcIiAmJlxuXHRcdFx0bm9ybWFsaXplUGF0aChyYXdVcmwpID09PSBcIi9oZWxsb1wiICYmXG5cdFx0XHQhcmF3VXJsLmluY2x1ZGVzKFwiLzpcIilcblx0XHQpIHtcblx0XHRcdG5leHRSZXF1ZXN0LmF1dGggPSB7IHR5cGU6IFwibm9hdXRoXCIgfTtcblx0XHR9XG5cdFx0cmV0dXJuIHsgLi4uaXRlbSwgcmVxdWVzdDogbmV4dFJlcXVlc3QgfTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RVcmxSYXcocmVxdWVzdDogUG9zdG1hblJlcXVlc3QpOiBzdHJpbmcge1xuXHRjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcblx0aWYgKHR5cGVvZiB1cmwgPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gdXJsO1xuXHR9XG5cdGlmICh1cmw/LnJhdykge1xuXHRcdHJldHVybiB1cmwucmF3O1xuXHR9XG5cdGNvbnN0IGhvc3QgPSB1cmw/Lmhvc3Q/LlswXSA/PyBcInt7YmFzZVVybH19XCI7XG5cdGNvbnN0IHBhdGggPSAodXJsPy5wYXRoID8/IFtdKS5qb2luKFwiL1wiKTtcblx0cmV0dXJuIHBhdGggPyBgJHtob3N0fS8ke3BhdGh9YCA6IGhvc3Q7XG59XG5cbi8qKiBPcGVuQVBJIGB7aWR9YCDihpIgUG9zdG1hbiBgOmlkYCwgd2l0aG91dCB0b3VjaGluZyBge3t2YXJpYWJsZXN9fWAuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlbkFwaVBhdGhQYXJhbXNUb0NvbG9uKHVybDogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIHVybC5yZXBsYWNlKC8oPzwhXFx7KVxceyhbQS1aYS16X11bXFx3XSopXFx9KD8hXFx9KS9nLCBcIjokMVwiKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChyYXdVcmw6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IHdpdGhvdXRCYXNlID0gcmF3VXJsLnJlcGxhY2UoL1xce1xce2Jhc2VVcmxcXH1cXH0vZywgXCJcIikuc3BsaXQoXCI/XCIpWzBdID8/IFwiXCI7XG5cdGNvbnN0IHdpdGhTbGFzaCA9IHdpdGhvdXRCYXNlLnN0YXJ0c1dpdGgoXCIvXCIpID8gd2l0aG91dEJhc2UgOiBgLyR7d2l0aG91dEJhc2V9YDtcblx0cmV0dXJuIG9wZW5BcGlQYXRoUGFyYW1zVG9Db2xvbih3aXRoU2xhc2gpO1xufVxuXG4vKiogUHJlZmVyIFBvc3RtYW4gdGVtcGxhdGUgVVJMIHNoYXBlIHVzZWQgYnkgZXhpc3RpbmcgTG9jYWwgVmlldyAvIEFQSSB1cGxvYWRzLiAqL1xuZnVuY3Rpb24gdG9Qb3N0bWFuVXJsKHJhd1VybDogc3RyaW5nKTogUG9zdG1hblJlcXVlc3RbXCJ1cmxcIl0ge1xuXHRsZXQgcGF0aFBhcnQgPSByYXdVcmwucmVwbGFjZSgvXFx7XFx7YmFzZVVybFxcfVxcfS9nLCBcIlwiKTtcblx0aWYgKCFwYXRoUGFydC5zdGFydHNXaXRoKFwiL1wiKSkge1xuXHRcdHBhdGhQYXJ0ID0gYC8ke3BhdGhQYXJ0fWA7XG5cdH1cblx0Ly8gb3BlbmFwaS10by1wb3N0bWFuIHVzZXMge2lkfTsgTG9jYWwgVmlldyAvIHByaW9yIGNvbGxlY3Rpb25zIHVzZSA6aWRcblx0cGF0aFBhcnQgPSBvcGVuQXBpUGF0aFBhcmFtc1RvQ29sb24ocGF0aFBhcnQpO1xuXHRjb25zdCBzZWdtZW50cyA9IHBhdGhQYXJ0LnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG5cdHJldHVybiB7XG5cdFx0cmF3OiBge3tiYXNlVXJsfX0ke3BhdGhQYXJ0fWAsXG5cdFx0aG9zdDogW1wie3tiYXNlVXJsfX1cIl0sXG5cdFx0cGF0aDogc2VnbWVudHMsXG5cdH07XG59XG4iXSwibmFtZXMiOlsiY29udmVydGVyIiwiY29udmVydEFzeW5jIiwiZGF0YSIsIm9wdGlvbnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImNvbnZlcnQiLCJ0eXBlIiwiZXJyIiwicmVzdWx0Iiwib3BlbkFwaVRvUG9zdG1hbkNvbGxlY3Rpb24iLCJkb2N1bWVudCIsImZvbGRlclN0cmF0ZWd5IiwicmVxdWVzdE5hbWVTb3VyY2UiLCJpbmNsdWRlQXV0aEluZm9JbkV4YW1wbGUiLCJvdXRwdXQiLCJFcnJvciIsInJlYXNvbiIsImFwcGx5UG9zdG1hbkF1dGhPdmVybGF5IiwiY29sbGVjdGlvbiIsInByb2plY3ROYW1lIiwiYXV0aCIsIm5leHQiLCJpbmZvIiwibmFtZSIsImRlc2NyaXB0aW9uIiwic2NoZW1hIiwiYXV0aDBEb21haW4iLCJvYXV0aDIiLCJrZXkiLCJ2YWx1ZSIsInNjb3BlcyIsImNhbGxiYWNrcyIsIml0ZW0iLCJyZXdyaXRlQ29sbGVjdGlvbkl0ZW1zIiwibWFya0xpc3RBbm9ueW1vdXMiLCJpdGVtcyIsIm9wdHMiLCJtYXAiLCJyZXF1ZXN0IiwibWV0aG9kIiwidG9VcHBlckNhc2UiLCJyYXdVcmwiLCJyZXF1ZXN0VXJsUmF3IiwibmV4dFJlcXVlc3QiLCJ1cmwiLCJ0b1Bvc3RtYW5VcmwiLCJub3JtYWxpemVQYXRoIiwiaW5jbHVkZXMiLCJyYXciLCJob3N0IiwicGF0aCIsImpvaW4iLCJvcGVuQXBpUGF0aFBhcmFtc1RvQ29sb24iLCJyZXBsYWNlIiwid2l0aG91dEJhc2UiLCJzcGxpdCIsIndpdGhTbGFzaCIsInN0YXJ0c1dpdGgiLCJwYXRoUGFydCIsInNlZ21lbnRzIiwiZmlsdGVyIiwiQm9vbGVhbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsZUFBZSx1QkFBdUI7QUE0QzdDLFNBQVNDLGFBQ1JDLElBQTZCLEVBQzdCQyxPQUFnQztJQUVoQyxPQUFPLElBQUlDLFFBQVEsQ0FBQ0MsU0FBU0M7UUFDNUJOLFVBQVVPLE9BQU8sQ0FDaEI7WUFBRUMsTUFBTTtZQUFRTjtRQUFLLEdBQ3JCQyxTQUNBLENBQUNNLEtBQW1CQztZQUNuQixJQUFJRCxLQUFLO2dCQUNSSCxPQUFPRztnQkFDUDtZQUNEO1lBQ0FKLFFBQVFLO1FBQ1Q7SUFFRjtBQUNEO0FBRUEsdUZBQXVGLEdBQ3ZGLE9BQU8sZUFBZUMsMkJBQ3JCQyxRQUFpQztJQUVqQyxNQUFNRixTQUFTLE1BQU1ULGFBQWFXLFVBQVU7UUFDM0NDLGdCQUFnQjtRQUNoQkMsbUJBQW1CO1FBQ25CQywwQkFBMEI7SUFDM0I7SUFDQSxJQUFJLENBQUNMLE9BQU9BLE1BQU0sSUFBSUEsT0FBT00sTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFZCxRQUFRLE1BQU07UUFDdkQsTUFBTSxJQUFJZSxNQUFNUCxPQUFPUSxNQUFNLElBQUk7SUFDbEM7SUFDQSxPQUFPUixPQUFPTSxNQUFNLENBQUMsRUFBRSxDQUFDZCxJQUFJO0FBQzdCO0FBRUE7OztDQUdDLEdBQ0QsT0FBTyxTQUFTaUIsd0JBQ2ZDLFVBQTZCLEVBQzdCQyxXQUFtQixFQUNuQkMsSUFBMEIsRUFDMUJuQixPQUlDO0lBRUQsTUFBTW9CLE9BQTBCO1FBQy9CLEdBQUdILFVBQVU7UUFDYkksTUFBTTtZQUNMLEdBQUdKLFdBQVdJLElBQUk7WUFDbEJDLE1BQU0sR0FBR0osWUFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decohere/create",
3
- "version": "0.0.1-dev.37",
3
+ "version": "0.0.1-dev.38",
4
4
  "description": "Scaffold a new Decohere project — build with Forge, serve with Flux",
5
5
  "keywords": [
6
6
  "decohere",
@@ -21,8 +21,9 @@
21
21
  "test": "echo \"Error: no test specified\" && exit 1"
22
22
  },
23
23
  "dependencies": {
24
- "@decohere/nexus": "0.0.1-dev.37",
25
- "commander": "^13.1.0"
24
+ "@decohere/nexus": "0.0.1-dev.38",
25
+ "commander": "^13.1.0",
26
+ "openapi-to-postmanv2": "^5.0.0"
26
27
  },
27
28
  "devDependencies": {},
28
29
  "decohere": {
@@ -22,6 +22,8 @@ export interface ComposeService {
22
22
  command?: string;
23
23
  restart?: string;
24
24
  depends_on?: string[];
25
+ /** Compose profiles (service only starts when profile is enabled). */
26
+ profiles?: string[];
25
27
  /** Attach to compose networks (string name or map with aliases). */
26
28
  networks?: ComposeNetworkRef[];
27
29
  healthcheck?: ComposeHealthcheck;
@@ -1,4 +1,5 @@
1
1
  import type { Feature } from "../../services/scaffold.service.js";
2
+ import { type Auth0Env } from "../postman/openapi-to-postman.js";
2
3
  /** Postman OAuth callback URLs (popup + "Authorize using browser"). */
3
4
  declare const POSTMAN_CALLBACKS: readonly ["https://oauth.pstmn.io/v1/callback", "https://oauth.pstmn.io/v1/browser-callback"];
4
5
  /** Scopes requested for Auth0 access tokens (OIDC + Hello CASL permissions). */
@@ -8,5 +9,8 @@ export type PostmanOptions = {
8
9
  apiKey?: string;
9
10
  workspaceId?: string;
10
11
  };
12
+ /** Build Postman collection: OpenAPI routes + Auth0 auth overlay. */
13
+ export declare function buildHybridPostmanCollection(projectName: string, auth?: Auth0Env): Promise<import("../postman/openapi-to-postman.js").PostmanCollection>;
11
14
  export declare const PostmanFeature: Feature<PostmanOptions>;
15
+ export { buildHelloOpenApiDocument } from "../postman/hello-openapi.js";
12
16
  export { POSTMAN_CALLBACKS, POSTMAN_SCOPES };
@@ -0,0 +1,19 @@
1
+ /** Minimal OpenAPI 3 document shape used for Postman conversion. */
2
+ export type ScaffoldOpenApiDocument = {
3
+ openapi: "3.0.3";
4
+ info: {
5
+ title: string;
6
+ version: string;
7
+ description?: string;
8
+ };
9
+ servers?: Array<{
10
+ url: string;
11
+ description?: string;
12
+ }>;
13
+ paths: Record<string, Record<string, unknown>>;
14
+ };
15
+ /**
16
+ * Canonical Hello WebAPI OpenAPI document used to generate Postman requests.
17
+ * Keep paths aligned with scaffolded HelloController (`/hello`, `/hello/{id}`).
18
+ */
19
+ export declare function buildHelloOpenApiDocument(projectName: string): ScaffoldOpenApiDocument;