@jrpool/kilotest 59.1.4 → 60.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.
- package/README.md +2 -5
- package/api/awaitTest.test.ts +9 -9
- package/api/awaitTest.ts +12 -12
- package/api/getReport.test.ts +4 -4
- package/api/getReport.ts +9 -9
- package/api/listDiagnoses.test.ts +14 -14
- package/api/listDiagnoses.ts +8 -8
- package/api/listIssues.test.ts +15 -15
- package/api/listIssues.ts +18 -20
- package/api/listPages.test.ts +2 -2
- package/api/listPages.ts +4 -4
- package/api/listViolators.test.ts +10 -10
- package/api/listViolators.ts +10 -10
- package/api/orderNewTest.test.ts +1 -2
- package/api/orderNewTest.ts +3 -4
- package/api/orderRetest.test.ts +10 -10
- package/api/orderRetest.ts +13 -14
- package/api/requestRetest.test.ts +11 -11
- package/api/requestRetest.ts +11 -11
- package/api/routes.ts +9 -11
- package/api/schemas.ts +18 -28
- package/api/util.test.ts +2 -2
- package/api/util.ts +7 -7
- package/capability.md +4 -4
- package/docs/AI-TOOLS.md +41 -1
- package/docs/decisions/009-report-id.md +16 -0
- package/index.test.ts +91 -41
- package/index.ts +66 -15
- package/lhm.plugin.json +33 -119
- package/llms-full.txt +18 -24
- package/llms.txt +12 -12
- package/mcp.test.ts +11 -20
- package/mcp.ts +18 -18
- package/openapi-3.0.yaml +1847 -0
- package/openapi.yaml +38 -97
- package/package.json +1 -1
- package/routing.test.ts +1 -1
- package/scripts/generate-openapi.ts +83 -1
- package/server.json +1 -1
- package/util.test.ts +32 -33
- package/util.ts +47 -43
- package/web/hideReportForm/index.ts +5 -6
- package/web/listDiagnoses/index.ts +4 -5
- package/web/listDiagnoses/listDiagnoses.test.ts +13 -13
- package/web/listIssues/index.ts +11 -12
- package/web/listIssues/listIssues.test.ts +24 -24
- package/web/listPages/index.ts +2 -2
- package/web/listPages/listPages.test.ts +2 -2
- package/web/listTopIssues/index.ts +2 -2
- package/web/listViolators/index.ts +5 -6
- package/web/listViolators/listViolators.test.ts +12 -12
- package/web/reannotate/index.ts +3 -3
- package/web/reannotateForm/index.ts +1 -2
- package/web/reportDeletion.ts +9 -12
- package/web/requestRetest/index.ts +2 -2
- package/web/requestRetest/requestRetest.test.ts +7 -7
- package/web/requestRetestForm/index.html +2 -2
- package/web/requestRetestForm/index.ts +3 -4
- package/web/requestRetestForm/requestRetestForm.test.ts +7 -8
- package/web/unhideReportForm/index.ts +4 -6
- package/web/util.test.ts +29 -29
- package/web/util.ts +1 -1
package/openapi.yaml
CHANGED
|
@@ -2,7 +2,7 @@ openapi: 3.1.0
|
|
|
2
2
|
info:
|
|
3
3
|
title: Kilotest API
|
|
4
4
|
description: 'Kilotest is an ensemble testing and reporting service for front-end web quality. It uses an ensemble of 12 rule engines to test web pages for front-end quality (accessibility, usability, and web standards, including HTML, CSS, ARIA, and WCAG). Kilotest acts as a web server for human users, an MCP server for AI platforms, and an API for programmatic access. With this API you can request that a page be tested or retested, discover available reports, incrementally retrieve facts from a report: from what reports are available, to what issues were reported in one report, to what elements violated one issue, to what diagnoses rule engines gave for one violation.'
|
|
5
|
-
version: 59.1.
|
|
5
|
+
version: 59.1.4
|
|
6
6
|
license:
|
|
7
7
|
name: MIT
|
|
8
8
|
identifier: MIT
|
|
@@ -81,7 +81,7 @@ paths:
|
|
|
81
81
|
properties:
|
|
82
82
|
identifier:
|
|
83
83
|
type: string
|
|
84
|
-
description:
|
|
84
|
+
description: 'Identifier of the report (example: 260503T0432-x9z).'
|
|
85
85
|
completion date and time:
|
|
86
86
|
type: string
|
|
87
87
|
days since the report was completed:
|
|
@@ -165,25 +165,18 @@ paths:
|
|
|
165
165
|
- response metadata
|
|
166
166
|
- response content
|
|
167
167
|
additionalProperties: false
|
|
168
|
-
/api/listIssues/{
|
|
168
|
+
/api/listIssues/{reportID}:
|
|
169
169
|
get:
|
|
170
170
|
operationId: listIssues
|
|
171
171
|
summary: List basics about the issues in one report
|
|
172
172
|
parameters:
|
|
173
173
|
- in: path
|
|
174
|
-
name:
|
|
174
|
+
name: reportID
|
|
175
175
|
schema:
|
|
176
176
|
type: string
|
|
177
|
-
description: '
|
|
177
|
+
description: 'Identifier of the report (example: 260503T0432-x9z)'
|
|
178
178
|
required: true
|
|
179
|
-
description: '
|
|
180
|
-
- in: path
|
|
181
|
-
name: jobID
|
|
182
|
-
schema:
|
|
183
|
-
type: string
|
|
184
|
-
description: 'Job identifier of the report (example: x9z)'
|
|
185
|
-
required: true
|
|
186
|
-
description: 'Job identifier of the report (example: x9z)'
|
|
179
|
+
description: 'Identifier of the report (example: 260503T0432-x9z)'
|
|
187
180
|
responses:
|
|
188
181
|
'200':
|
|
189
182
|
description: List basics about the issues in one report
|
|
@@ -233,7 +226,7 @@ paths:
|
|
|
233
226
|
properties:
|
|
234
227
|
identifier:
|
|
235
228
|
type: string
|
|
236
|
-
description:
|
|
229
|
+
description: 'Identifier of the report (example: 260503T0432-x9z).'
|
|
237
230
|
completion date and time:
|
|
238
231
|
type: string
|
|
239
232
|
days since the report was completed:
|
|
@@ -493,7 +486,7 @@ paths:
|
|
|
493
486
|
- response metadata
|
|
494
487
|
- response content
|
|
495
488
|
additionalProperties: false
|
|
496
|
-
/api/listViolators/{issueID}/{
|
|
489
|
+
/api/listViolators/{issueID}/{reportID}:
|
|
497
490
|
get:
|
|
498
491
|
operationId: listViolators
|
|
499
492
|
summary: List elements reported as exhibiting one issue
|
|
@@ -506,19 +499,12 @@ paths:
|
|
|
506
499
|
required: true
|
|
507
500
|
description: 'Issue identifier (example: contrastPoor)'
|
|
508
501
|
- in: path
|
|
509
|
-
name:
|
|
502
|
+
name: reportID
|
|
510
503
|
schema:
|
|
511
504
|
type: string
|
|
512
|
-
description: '
|
|
505
|
+
description: 'Identifier of the report (example: 260503T0432-x9z)'
|
|
513
506
|
required: true
|
|
514
|
-
description: '
|
|
515
|
-
- in: path
|
|
516
|
-
name: jobID
|
|
517
|
-
schema:
|
|
518
|
-
type: string
|
|
519
|
-
description: 'Job identifier of the report (example: x9z)'
|
|
520
|
-
required: true
|
|
521
|
-
description: 'Job identifier of the report (example: x9z)'
|
|
507
|
+
description: 'Identifier of the report (example: 260503T0432-x9z)'
|
|
522
508
|
responses:
|
|
523
509
|
'200':
|
|
524
510
|
description: List elements reported as exhibiting one issue
|
|
@@ -628,7 +614,7 @@ paths:
|
|
|
628
614
|
- response metadata
|
|
629
615
|
- response content
|
|
630
616
|
additionalProperties: false
|
|
631
|
-
/api/listDiagnoses/{catalogIndex}/{issueID}/{
|
|
617
|
+
/api/listDiagnoses/{catalogIndex}/{issueID}/{reportID}:
|
|
632
618
|
get:
|
|
633
619
|
operationId: listDiagnoses
|
|
634
620
|
summary: List diagnoses of how one element exhibited one issue
|
|
@@ -648,19 +634,12 @@ paths:
|
|
|
648
634
|
required: true
|
|
649
635
|
description: 'Issue identifier (example: contrastPoor)'
|
|
650
636
|
- in: path
|
|
651
|
-
name:
|
|
652
|
-
schema:
|
|
653
|
-
type: string
|
|
654
|
-
description: 'Timestamp of the report in YYMMDDTHHmm format (example: 260503T0432)'
|
|
655
|
-
required: true
|
|
656
|
-
description: 'Timestamp of the report in YYMMDDTHHmm format (example: 260503T0432)'
|
|
657
|
-
- in: path
|
|
658
|
-
name: jobID
|
|
637
|
+
name: reportID
|
|
659
638
|
schema:
|
|
660
639
|
type: string
|
|
661
|
-
description: '
|
|
640
|
+
description: 'Identifier of the report (example: 260503T0432-x9z)'
|
|
662
641
|
required: true
|
|
663
|
-
description: '
|
|
642
|
+
description: 'Identifier of the report (example: 260503T0432-x9z)'
|
|
664
643
|
responses:
|
|
665
644
|
'200':
|
|
666
645
|
description: List diagnoses of how one element exhibited one issue
|
|
@@ -788,25 +767,18 @@ paths:
|
|
|
788
767
|
- response metadata
|
|
789
768
|
- response content
|
|
790
769
|
additionalProperties: false
|
|
791
|
-
/api/getReport/{
|
|
770
|
+
/api/getReport/{reportID}:
|
|
792
771
|
get:
|
|
793
772
|
operationId: getReport
|
|
794
773
|
summary: Get one full report in JSON
|
|
795
774
|
parameters:
|
|
796
775
|
- in: path
|
|
797
|
-
name:
|
|
776
|
+
name: reportID
|
|
798
777
|
schema:
|
|
799
778
|
type: string
|
|
800
|
-
description: '
|
|
779
|
+
description: 'Identifier of the report (example: 260503T0432-x9z)'
|
|
801
780
|
required: true
|
|
802
|
-
description: '
|
|
803
|
-
- in: path
|
|
804
|
-
name: jobID
|
|
805
|
-
schema:
|
|
806
|
-
type: string
|
|
807
|
-
description: 'Job identifier of the report (example: x9z)'
|
|
808
|
-
required: true
|
|
809
|
-
description: 'Job identifier of the report (example: x9z)'
|
|
781
|
+
description: 'Identifier of the report (example: 260503T0432-x9z)'
|
|
810
782
|
responses:
|
|
811
783
|
'200':
|
|
812
784
|
description: Get one full report in JSON
|
|
@@ -1003,25 +975,18 @@ paths:
|
|
|
1003
975
|
- response metadata
|
|
1004
976
|
- response content
|
|
1005
977
|
additionalProperties: false
|
|
1006
|
-
/api/requestRetest/{
|
|
978
|
+
/api/requestRetest/{reportID}:
|
|
1007
979
|
post:
|
|
1008
980
|
operationId: requestRetest
|
|
1009
981
|
summary: Request that a page be retested
|
|
1010
982
|
parameters:
|
|
1011
983
|
- in: path
|
|
1012
|
-
name:
|
|
984
|
+
name: reportID
|
|
1013
985
|
schema:
|
|
1014
986
|
type: string
|
|
1015
|
-
description: '
|
|
987
|
+
description: 'Identifier of the latest report about the page (example: 260503T0432-x9z)'
|
|
1016
988
|
required: true
|
|
1017
|
-
description: '
|
|
1018
|
-
- in: path
|
|
1019
|
-
name: jobID
|
|
1020
|
-
schema:
|
|
1021
|
-
type: string
|
|
1022
|
-
description: 'Job identifier of the latest report about the page (example: x9z)'
|
|
1023
|
-
required: true
|
|
1024
|
-
description: 'Job identifier of the latest report about the page (example: x9z)'
|
|
989
|
+
description: 'Identifier of the latest report about the page (example: 260503T0432-x9z)'
|
|
1025
990
|
requestBody:
|
|
1026
991
|
content:
|
|
1027
992
|
application/json:
|
|
@@ -1365,7 +1330,8 @@ paths:
|
|
|
1365
1330
|
type: string
|
|
1366
1331
|
report identifier:
|
|
1367
1332
|
anyOf:
|
|
1368
|
-
-
|
|
1333
|
+
- type: string
|
|
1334
|
+
description: 'Identifier of the report, to pass to listIssues once the report is ready (example: 260503T0432-x9z).'
|
|
1369
1335
|
- type: 'null'
|
|
1370
1336
|
how you can check for completion:
|
|
1371
1337
|
type: string
|
|
@@ -1390,25 +1356,18 @@ paths:
|
|
|
1390
1356
|
- response metadata
|
|
1391
1357
|
- response content
|
|
1392
1358
|
additionalProperties: false
|
|
1393
|
-
/api/orderRetest/{
|
|
1359
|
+
/api/orderRetest/{reportID}:
|
|
1394
1360
|
post:
|
|
1395
1361
|
operationId: orderRetest
|
|
1396
1362
|
summary: Order that a page be retested immediately, without manual approval
|
|
1397
1363
|
parameters:
|
|
1398
1364
|
- in: path
|
|
1399
|
-
name:
|
|
1365
|
+
name: reportID
|
|
1400
1366
|
schema:
|
|
1401
1367
|
type: string
|
|
1402
|
-
description: '
|
|
1368
|
+
description: 'Identifier of the latest report about the page (example: 260503T0432-x9z)'
|
|
1403
1369
|
required: true
|
|
1404
|
-
description: '
|
|
1405
|
-
- in: path
|
|
1406
|
-
name: jobID
|
|
1407
|
-
schema:
|
|
1408
|
-
type: string
|
|
1409
|
-
description: 'Job identifier of the latest report about the page (example: x9z)'
|
|
1410
|
-
required: true
|
|
1411
|
-
description: 'Job identifier of the latest report about the page (example: x9z)'
|
|
1370
|
+
description: 'Identifier of the latest report about the page (example: 260503T0432-x9z)'
|
|
1412
1371
|
requestBody:
|
|
1413
1372
|
content:
|
|
1414
1373
|
application/json:
|
|
@@ -1519,7 +1478,8 @@ paths:
|
|
|
1519
1478
|
type: string
|
|
1520
1479
|
report identifier:
|
|
1521
1480
|
anyOf:
|
|
1522
|
-
-
|
|
1481
|
+
- type: string
|
|
1482
|
+
description: 'Identifier of the report, to pass to listIssues once the report is ready (example: 260503T0432-x9z).'
|
|
1523
1483
|
- type: 'null'
|
|
1524
1484
|
how you can check for completion:
|
|
1525
1485
|
type: string
|
|
@@ -1544,25 +1504,18 @@ paths:
|
|
|
1544
1504
|
- response metadata
|
|
1545
1505
|
- response content
|
|
1546
1506
|
additionalProperties: false
|
|
1547
|
-
/api/awaitTest/{
|
|
1507
|
+
/api/awaitTest/{reportID}:
|
|
1548
1508
|
post:
|
|
1549
1509
|
operationId: awaitTest
|
|
1550
1510
|
summary: Wait for a job ordered via orderNewTest or orderRetest to complete
|
|
1551
1511
|
parameters:
|
|
1552
1512
|
- in: path
|
|
1553
|
-
name:
|
|
1513
|
+
name: reportID
|
|
1554
1514
|
schema:
|
|
1555
1515
|
type: string
|
|
1556
|
-
description: '
|
|
1516
|
+
description: 'Report identifier returned by orderNewTest or orderRetest (example: 260503T0432-x9z)'
|
|
1557
1517
|
required: true
|
|
1558
|
-
description: '
|
|
1559
|
-
- in: path
|
|
1560
|
-
name: jobID
|
|
1561
|
-
schema:
|
|
1562
|
-
type: string
|
|
1563
|
-
description: 'Job identifier of the ordered job, from the report identifier returned by orderNewTest (example: x9z)'
|
|
1564
|
-
required: true
|
|
1565
|
-
description: 'Job identifier of the ordered job, from the report identifier returned by orderNewTest (example: x9z)'
|
|
1518
|
+
description: 'Report identifier returned by orderNewTest or orderRetest (example: 260503T0432-x9z)'
|
|
1566
1519
|
requestBody:
|
|
1567
1520
|
content:
|
|
1568
1521
|
application/json:
|
|
@@ -1631,7 +1584,8 @@ paths:
|
|
|
1631
1584
|
- type: object
|
|
1632
1585
|
properties:
|
|
1633
1586
|
report identifier:
|
|
1634
|
-
|
|
1587
|
+
type: string
|
|
1588
|
+
description: 'Identifier of the report, to pass to listIssues once the report is ready (example: 260503T0432-x9z).'
|
|
1635
1589
|
required:
|
|
1636
1590
|
- report identifier
|
|
1637
1591
|
additionalProperties: false
|
|
@@ -1792,7 +1746,7 @@ components:
|
|
|
1792
1746
|
properties:
|
|
1793
1747
|
identifier:
|
|
1794
1748
|
type: string
|
|
1795
|
-
description:
|
|
1749
|
+
description: 'Identifier of the report (example: 260503T0432-x9z).'
|
|
1796
1750
|
completion date and time:
|
|
1797
1751
|
type: string
|
|
1798
1752
|
days since the report was completed:
|
|
@@ -1882,16 +1836,3 @@ components:
|
|
|
1882
1836
|
required:
|
|
1883
1837
|
- error
|
|
1884
1838
|
additionalProperties: false
|
|
1885
|
-
ReportIdentifier:
|
|
1886
|
-
type: object
|
|
1887
|
-
properties:
|
|
1888
|
-
timeStamp:
|
|
1889
|
-
type: string
|
|
1890
|
-
description: Timestamp to pass to listIssues once the report is ready.
|
|
1891
|
-
jobID:
|
|
1892
|
-
type: string
|
|
1893
|
-
description: Job identifier to pass to listIssues once the report is ready.
|
|
1894
|
-
required:
|
|
1895
|
-
- timeStamp
|
|
1896
|
-
- jobID
|
|
1897
|
-
additionalProperties: false
|
package/package.json
CHANGED
package/routing.test.ts
CHANGED
|
@@ -68,7 +68,7 @@ test('GET /api/requestNewTest returns an error, not a test-request response', as
|
|
|
68
68
|
});
|
|
69
69
|
|
|
70
70
|
test('GET /api/requestRetest returns an error, not a retest-request response', async () => {
|
|
71
|
-
const result = await get('/api/requestRetest/260101T0001
|
|
71
|
+
const result = await get('/api/requestRetest/260101T0001-ct');
|
|
72
72
|
assert.ok(result.body.includes('Invalid service request'));
|
|
73
73
|
});
|
|
74
74
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
generate-openapi.ts
|
|
3
|
-
Generates openapi.yaml from the Kilotest API route table (api/routes.ts) and Zod schemas (api/schemas.ts), keeping the OpenAPI document in sync with schemas.ts’s single source of truth.
|
|
3
|
+
Generates openapi.yaml from the Kilotest API route table (api/routes.ts) and Zod schemas (api/schemas.ts), keeping the OpenAPI document in sync with schemas.ts’s single source of truth. Also generates openapi-3.0.yaml, an OpenAPI 3.0.3 conversion for registries whose importers do not accept 3.1 documents (currently the RapidAPI Hub, which is updated via its Hub Listing > Definitions > CI/CD > Import OpenAPI upload).
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
// IMPORTS
|
|
@@ -17,6 +17,7 @@ import {version} from '../api/version.ts';
|
|
|
17
17
|
|
|
18
18
|
const {license} = pkg;
|
|
19
19
|
const outputPath = path.join(import.meta.dirname, '..', 'openapi.yaml');
|
|
20
|
+
const output30Path = path.join(import.meta.dirname, '..', 'openapi-3.0.yaml');
|
|
20
21
|
|
|
21
22
|
// FUNCTIONS
|
|
22
23
|
|
|
@@ -52,6 +53,84 @@ const buildPaths = () => {
|
|
|
52
53
|
});
|
|
53
54
|
return paths;
|
|
54
55
|
};
|
|
56
|
+
// Converts a generated OpenAPI 3.1 document in place to an OpenAPI 3.0.3
|
|
57
|
+
// document: 'const' schemas become single-member 'enum's, type arrays lose
|
|
58
|
+
// their 'null' members and gain 'nullable', 'null'-unioned schemas become
|
|
59
|
+
// 'nullable', and 3.1-only info fields are removed. Nullable unions whose
|
|
60
|
+
// branches cannot be merged into one typed schema gain an extra object-typed
|
|
61
|
+
// nullable branch instead, because 3.0 validators require a 'type' wherever
|
|
62
|
+
// 'nullable' appears.
|
|
63
|
+
const downgrade30 = (document: any) => {
|
|
64
|
+
document.openapi = '3.0.3';
|
|
65
|
+
document.info.license = {
|
|
66
|
+
name: license,
|
|
67
|
+
url: 'https://github.com/jrpool/kilotest/blob/main/LICENSE'
|
|
68
|
+
};
|
|
69
|
+
const refType = (ref: string) => {
|
|
70
|
+
const match = /^#\/components\/schemas\/(.+)$/.exec(ref);
|
|
71
|
+
const target = match?.[1] && document.components?.schemas?.[match[1]];
|
|
72
|
+
return target && typeof target === 'object' ? target.type : null;
|
|
73
|
+
};
|
|
74
|
+
const walk = (node: any): void => {
|
|
75
|
+
if (Array.isArray(node)) {
|
|
76
|
+
node.forEach(walk);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (!node || typeof node !== 'object') {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if ('const' in node) {
|
|
83
|
+
node.enum = [node.const];
|
|
84
|
+
delete node.const;
|
|
85
|
+
}
|
|
86
|
+
if (Array.isArray(node.type)) {
|
|
87
|
+
const types = node.type.filter((t: string) => t !== 'null');
|
|
88
|
+
const hasNull = types.length !== node.type.length;
|
|
89
|
+
if (types.length === 1) {
|
|
90
|
+
node.type = types[0];
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
node.oneOf = types.map((t: string) => ({type: t}));
|
|
94
|
+
delete node.type;
|
|
95
|
+
}
|
|
96
|
+
if (hasNull) {
|
|
97
|
+
node.nullable = true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else if (node.type === 'null') {
|
|
101
|
+
node.type = 'object';
|
|
102
|
+
node.nullable = true;
|
|
103
|
+
}
|
|
104
|
+
if (Array.isArray(node.anyOf)) {
|
|
105
|
+
const nullIndex = node.anyOf.findIndex(
|
|
106
|
+
(branch: any) => branch && typeof branch === 'object' && branch.type === 'null'
|
|
107
|
+
);
|
|
108
|
+
if (nullIndex !== -1) {
|
|
109
|
+
const others = node.anyOf.filter((_: any, i: number) => i !== nullIndex);
|
|
110
|
+
delete node.anyOf;
|
|
111
|
+
if (others.length === 1 && others[0].$ref) {
|
|
112
|
+
node.allOf = [others[0]];
|
|
113
|
+
const type = refType(others[0].$ref);
|
|
114
|
+
if (type) {
|
|
115
|
+
node.type = type;
|
|
116
|
+
}
|
|
117
|
+
node.nullable = true;
|
|
118
|
+
}
|
|
119
|
+
else if (others.length === 1 && others[0].type) {
|
|
120
|
+
Object.assign(node, others[0]);
|
|
121
|
+
node.nullable = true;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
node.anyOf = [...others, {type: 'object', nullable: true}];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
for (const value of Object.values(node)) {
|
|
129
|
+
walk(value);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
walk(document);
|
|
133
|
+
};
|
|
55
134
|
// Generates and writes the openapi.yaml file.
|
|
56
135
|
const generate = () => {
|
|
57
136
|
const document = createDocument({
|
|
@@ -78,6 +157,9 @@ const generate = () => {
|
|
|
78
157
|
});
|
|
79
158
|
fs.writeFileSync(outputPath, yaml.dump(document, {noRefs: true, lineWidth: -1}));
|
|
80
159
|
console.log(`Wrote ${outputPath}`);
|
|
160
|
+
downgrade30(document);
|
|
161
|
+
fs.writeFileSync(output30Path, yaml.dump(document, {noRefs: true, lineWidth: -1}));
|
|
162
|
+
console.log(`Wrote ${output30Path}`);
|
|
81
163
|
};
|
|
82
164
|
|
|
83
165
|
// EXECUTION
|