spec-box-tms-sync 0.3.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.
Files changed (103) hide show
  1. package/README.md +284 -0
  2. package/bin/spec-box +8 -0
  3. package/dist/api/index.d.ts +3 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/api/index.js +8 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/models/index.d.ts +187 -0
  8. package/dist/api/models/index.d.ts.map +1 -0
  9. package/dist/api/models/index.js +3 -0
  10. package/dist/api/models/index.js.map +1 -0
  11. package/dist/api/models/mappers.d.ts +24 -0
  12. package/dist/api/models/mappers.d.ts.map +1 -0
  13. package/dist/api/models/mappers.js +850 -0
  14. package/dist/api/models/mappers.js.map +1 -0
  15. package/dist/api/models/parameters.d.ts +14 -0
  16. package/dist/api/models/parameters.d.ts.map +1 -0
  17. package/dist/api/models/parameters.js +112 -0
  18. package/dist/api/models/parameters.js.map +1 -0
  19. package/dist/api/specBoxWebApi.d.ts +47 -0
  20. package/dist/api/specBoxWebApi.d.ts.map +1 -0
  21. package/dist/api/specBoxWebApi.js +242 -0
  22. package/dist/api/specBoxWebApi.js.map +1 -0
  23. package/dist/cli.d.ts +2 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +24 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/commands/sync.d.ts +4 -0
  28. package/dist/commands/sync.d.ts.map +1 -0
  29. package/dist/commands/sync.js +39 -0
  30. package/dist/commands/sync.js.map +1 -0
  31. package/dist/commands/upload-stat.d.ts +4 -0
  32. package/dist/commands/upload-stat.d.ts.map +1 -0
  33. package/dist/commands/upload-stat.js +21 -0
  34. package/dist/commands/upload-stat.js.map +1 -0
  35. package/dist/commands/validate-only.d.ts +4 -0
  36. package/dist/commands/validate-only.d.ts.map +1 -0
  37. package/dist/commands/validate-only.js +30 -0
  38. package/dist/commands/validate-only.js.map +1 -0
  39. package/dist/lib/config/index.d.ts +11 -0
  40. package/dist/lib/config/index.d.ts.map +1 -0
  41. package/dist/lib/config/index.js +34 -0
  42. package/dist/lib/config/index.js.map +1 -0
  43. package/dist/lib/config/models.d.ts +77 -0
  44. package/dist/lib/config/models.d.ts.map +1 -0
  45. package/dist/lib/config/models.js +57 -0
  46. package/dist/lib/config/models.js.map +1 -0
  47. package/dist/lib/domain/index.d.ts +11 -0
  48. package/dist/lib/domain/index.d.ts.map +1 -0
  49. package/dist/lib/domain/index.js +47 -0
  50. package/dist/lib/domain/index.js.map +1 -0
  51. package/dist/lib/domain/keys.d.ts +17 -0
  52. package/dist/lib/domain/keys.d.ts.map +1 -0
  53. package/dist/lib/domain/keys.js +63 -0
  54. package/dist/lib/domain/keys.js.map +1 -0
  55. package/dist/lib/domain/models.d.ts +45 -0
  56. package/dist/lib/domain/models.d.ts.map +1 -0
  57. package/dist/lib/domain/models.js +3 -0
  58. package/dist/lib/domain/models.js.map +1 -0
  59. package/dist/lib/jest/index.d.ts +24 -0
  60. package/dist/lib/jest/index.d.ts.map +1 -0
  61. package/dist/lib/jest/index.js +57 -0
  62. package/dist/lib/jest/index.js.map +1 -0
  63. package/dist/lib/jest/models.d.ts +42 -0
  64. package/dist/lib/jest/models.d.ts.map +1 -0
  65. package/dist/lib/jest/models.js +27 -0
  66. package/dist/lib/jest/models.js.map +1 -0
  67. package/dist/lib/upload/upload-entities.d.ts +4 -0
  68. package/dist/lib/upload/upload-entities.d.ts.map +1 -0
  69. package/dist/lib/upload/upload-entities.js +52 -0
  70. package/dist/lib/upload/upload-entities.js.map +1 -0
  71. package/dist/lib/upload/upload-jest-stat.d.ts +4 -0
  72. package/dist/lib/upload/upload-jest-stat.d.ts.map +1 -0
  73. package/dist/lib/upload/upload-jest-stat.js +21 -0
  74. package/dist/lib/upload/upload-jest-stat.js.map +1 -0
  75. package/dist/lib/utils.d.ts +16 -0
  76. package/dist/lib/utils.d.ts.map +1 -0
  77. package/dist/lib/utils.js +50 -0
  78. package/dist/lib/utils.js.map +1 -0
  79. package/dist/lib/validators/index.d.ts +4 -0
  80. package/dist/lib/validators/index.d.ts.map +1 -0
  81. package/dist/lib/validators/index.js +8 -0
  82. package/dist/lib/validators/index.js.map +1 -0
  83. package/dist/lib/validators/models.d.ts +92 -0
  84. package/dist/lib/validators/models.d.ts.map +1 -0
  85. package/dist/lib/validators/models.js +20 -0
  86. package/dist/lib/validators/models.js.map +1 -0
  87. package/dist/lib/validators/renderer.d.ts +4 -0
  88. package/dist/lib/validators/renderer.d.ts.map +1 -0
  89. package/dist/lib/validators/renderer.js +83 -0
  90. package/dist/lib/validators/renderer.js.map +1 -0
  91. package/dist/lib/validators/validator.d.ts +25 -0
  92. package/dist/lib/validators/validator.d.ts.map +1 -0
  93. package/dist/lib/validators/validator.js +288 -0
  94. package/dist/lib/validators/validator.js.map +1 -0
  95. package/dist/lib/yaml/index.d.ts +10 -0
  96. package/dist/lib/yaml/index.d.ts.map +1 -0
  97. package/dist/lib/yaml/index.js +29 -0
  98. package/dist/lib/yaml/index.js.map +1 -0
  99. package/dist/lib/yaml/models.d.ts +21 -0
  100. package/dist/lib/yaml/models.d.ts.map +1 -0
  101. package/dist/lib/yaml/models.js +19 -0
  102. package/dist/lib/yaml/models.js.map +1 -0
  103. package/package.json +42 -0
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLoaderError = exports.Validator = void 0;
4
+ const models_1 = require("./models");
5
+ const renderer_1 = require("./renderer");
6
+ const CODE_REGEX = /^[A-Za-z][A-Za-z0-9-_]*$/;
7
+ // named group <link> is used to capture and validate link key
8
+ const LINK_LIKE = /\$(?<link>[A-Za-z][A-Za-z0-9-_]*)/g;
9
+ class Validator {
10
+ constructor() {
11
+ this.loaderErrors = new Array();
12
+ this.metaErrors = new Array();
13
+ this.featureErrors = new Array();
14
+ this.jestUnusedTests = new Array();
15
+ this.metaFilePath = '';
16
+ }
17
+ get hasCriticalErrors() {
18
+ return [
19
+ ...this.loaderErrors,
20
+ ...this.metaErrors,
21
+ ...this.featureErrors,
22
+ ...this.jestUnusedTests,
23
+ ].some((e) => models_1.ERROR_SEVERITY[e.type] === 'error');
24
+ }
25
+ printReport() {
26
+ this.jestUnusedTests.forEach(renderer_1.printError);
27
+ this.featureErrors.forEach(renderer_1.printError);
28
+ this.metaErrors.forEach(renderer_1.printError);
29
+ this.loaderErrors.forEach(renderer_1.printError);
30
+ (0, renderer_1.renderStats)('Всего', [
31
+ ...this.loaderErrors,
32
+ ...this.metaErrors,
33
+ ...this.featureErrors,
34
+ ...this.jestUnusedTests,
35
+ ]);
36
+ }
37
+ registerLoaderError(error, filePath, fileType) {
38
+ this.loaderErrors.push((0, exports.getLoaderError)(error, filePath, fileType));
39
+ }
40
+ registerJestUnusedTests(test, filePath) {
41
+ this.jestUnusedTests.push({
42
+ type: 'jest-unused',
43
+ test,
44
+ filePath,
45
+ });
46
+ }
47
+ validate({ trees, attributes, metaFilePath, features }) {
48
+ const metaAttributeValues = new Map();
49
+ this.metaFilePath = metaFilePath;
50
+ this.validateMetaAttributes(attributes, metaAttributeValues);
51
+ this.validateMetaTrees(trees, metaAttributeValues);
52
+ this.validateFeatures(features, metaAttributeValues);
53
+ }
54
+ validateMetaAttributes(attributes, attributeValuesMap) {
55
+ const filePath = this.metaFilePath;
56
+ if (attributes) {
57
+ for (const attribute of attributes) {
58
+ const codeValidation = this.validateCode(attribute.code, filePath);
59
+ if (codeValidation) {
60
+ this.metaErrors.push(codeValidation);
61
+ continue;
62
+ }
63
+ if (attributeValuesMap.has(attribute.code)) {
64
+ const error = {
65
+ type: 'attribute-duplicate',
66
+ attribute,
67
+ filePath,
68
+ };
69
+ this.metaErrors.push(error);
70
+ continue;
71
+ }
72
+ const attributeValuesUnique = new Set();
73
+ attributeValuesMap.set(attribute.code, attributeValuesUnique);
74
+ this.metaErrors.push(...this.validateMetaAttributeValues(attribute, attributeValuesUnique, filePath));
75
+ }
76
+ }
77
+ }
78
+ validateMetaAttributeValues(attribute, attributeValuesUnique, filePath) {
79
+ const result = new Array();
80
+ for (const attributeValue of attribute.values) {
81
+ const valueValidation = this.validateCode(attributeValue.code, filePath);
82
+ if (valueValidation) {
83
+ result.push(valueValidation);
84
+ continue;
85
+ }
86
+ if (attributeValuesUnique.has(attributeValue.code)) {
87
+ const error = {
88
+ type: 'attribute-value-duplicate',
89
+ attribute,
90
+ attributeValue,
91
+ filePath,
92
+ };
93
+ result.push(error);
94
+ continue;
95
+ }
96
+ attributeValuesUnique.add(attributeValue.code);
97
+ }
98
+ return result;
99
+ }
100
+ validateMetaTrees(trees, attributeValuesMap) {
101
+ const filePath = this.metaFilePath;
102
+ if (trees) {
103
+ const treeUnique = new Set();
104
+ for (const tree of trees) {
105
+ const codeValidation = this.validateCode(tree.code, filePath);
106
+ if (codeValidation) {
107
+ this.metaErrors.push(codeValidation);
108
+ continue;
109
+ }
110
+ if (treeUnique.has(tree.code)) {
111
+ const error = {
112
+ type: 'tree-duplicate',
113
+ tree,
114
+ filePath,
115
+ };
116
+ this.metaErrors.push(error);
117
+ continue;
118
+ }
119
+ treeUnique.add(tree.code);
120
+ const treeAttributesUnique = new Set();
121
+ for (const attribute of tree.attributes) {
122
+ if (!attributeValuesMap.has(attribute)) {
123
+ const missingAttribute = {
124
+ type: 'tree-missing-attribute',
125
+ attributeCode: attribute,
126
+ tree,
127
+ filePath,
128
+ };
129
+ this.metaErrors.push(missingAttribute);
130
+ }
131
+ if (treeAttributesUnique.has(attribute)) {
132
+ const attributeDuplicate = {
133
+ type: 'tree-attribute-duplicate',
134
+ attributeCode: attribute,
135
+ tree,
136
+ filePath,
137
+ };
138
+ this.metaErrors.push(attributeDuplicate);
139
+ }
140
+ treeAttributesUnique.add(attribute);
141
+ }
142
+ }
143
+ }
144
+ }
145
+ validateFeatures(features, metaAttributeValues) {
146
+ const featuresMap = new Map();
147
+ for (const feature of features) {
148
+ const existingFeature = featuresMap.get(feature.code);
149
+ if (existingFeature) {
150
+ const featureCodeDuplicateError = {
151
+ type: 'feature-code-duplicate',
152
+ filePath: feature.filePath,
153
+ code: feature.code,
154
+ feature,
155
+ firstFeature: existingFeature,
156
+ };
157
+ this.featureErrors.push(featureCodeDuplicateError);
158
+ }
159
+ else {
160
+ featuresMap.set(feature.code, feature);
161
+ }
162
+ this.featureErrors.push(...this.validateFeature(feature, metaAttributeValues));
163
+ }
164
+ this.validateFeatureLinks(features, featuresMap);
165
+ }
166
+ validateFeature(feature, metaAttributeValues) {
167
+ const errors = new Array();
168
+ if (feature.code) {
169
+ if (!CODE_REGEX.test(feature.code)) {
170
+ const featureCodeError = {
171
+ type: 'featrue-code-format',
172
+ filePath: feature.filePath,
173
+ code: feature.code,
174
+ feature,
175
+ };
176
+ errors.push(featureCodeError);
177
+ }
178
+ }
179
+ if (feature.attributes) {
180
+ for (const attribute in feature.attributes) {
181
+ let valuesSet = metaAttributeValues.get(attribute);
182
+ if (!valuesSet) {
183
+ const missingAttribute = {
184
+ type: 'feature-missing-attribute',
185
+ filePath: feature.filePath,
186
+ attributeCode: attribute,
187
+ feature,
188
+ };
189
+ errors.push(missingAttribute);
190
+ }
191
+ for (const attributeValue of feature.attributes[attribute]) {
192
+ if (!CODE_REGEX.test(attributeValue)) {
193
+ const attributeCodeError = {
194
+ type: 'featrue-attribute-value-code-format',
195
+ filePath: feature.filePath,
196
+ attribute,
197
+ feature,
198
+ code: attributeValue,
199
+ };
200
+ errors.push(attributeCodeError);
201
+ }
202
+ }
203
+ }
204
+ }
205
+ errors.push(...this.validateAsserions(feature));
206
+ return errors;
207
+ }
208
+ validateAsserions(feature) {
209
+ const errors = new Array();
210
+ for (const assertionGroup of feature.groups) {
211
+ const assertionsUnique = new Set();
212
+ for (const assertion of assertionGroup.assertions) {
213
+ if (assertionsUnique.has(assertion.title)) {
214
+ const assertionDuplicateError = {
215
+ type: 'assertion-duplicate',
216
+ filePath: feature.filePath,
217
+ feature,
218
+ assertionGroup,
219
+ assertion,
220
+ };
221
+ errors.push(assertionDuplicateError);
222
+ }
223
+ assertionsUnique.add(assertion.title);
224
+ }
225
+ }
226
+ return errors;
227
+ }
228
+ validateFeatureLinks(features, featuresMap) {
229
+ for (const feature of features) {
230
+ this.featureErrors.push(...this.validateLinks(feature.title, 'title', feature, featuresMap));
231
+ if (feature.description) {
232
+ this.featureErrors.push(...this.validateLinks(feature.description, 'description', feature, featuresMap));
233
+ }
234
+ for (const group of feature.groups) {
235
+ this.featureErrors.push(...this.validateLinks(group.title, 'group.title', feature, featuresMap));
236
+ for (const assertion of group.assertions) {
237
+ this.featureErrors.push(...this.validateLinks(assertion.title, 'assert.title', feature, featuresMap));
238
+ if (assertion.description) {
239
+ this.featureErrors.push(...this.validateLinks(assertion.description, 'assert.description', feature, featuresMap));
240
+ }
241
+ }
242
+ }
243
+ }
244
+ }
245
+ validateLinks(value, field, feature, featuresMap) {
246
+ const re = new RegExp(LINK_LIKE);
247
+ const errors = new Array();
248
+ let match;
249
+ while ((match = re.exec(value)) !== null) {
250
+ const link = match.groups.link;
251
+ if (!featuresMap.has(link)) {
252
+ const linkError = {
253
+ type: 'feature-missing-link',
254
+ filePath: feature.filePath,
255
+ feature,
256
+ field,
257
+ link,
258
+ };
259
+ errors.push(linkError);
260
+ }
261
+ }
262
+ return errors;
263
+ }
264
+ validateCode(value, filePath) {
265
+ if (!CODE_REGEX.test(value)) {
266
+ return { type: 'code-format-error', code: value, filePath };
267
+ }
268
+ }
269
+ }
270
+ exports.Validator = Validator;
271
+ const getLoaderError = (error, filePath, fileType) => {
272
+ let description = 'Unknown error';
273
+ if (typeof error === 'string') {
274
+ description = error;
275
+ }
276
+ else if (error instanceof Error) {
277
+ description = error.message;
278
+ }
279
+ const loaderError = {
280
+ type: 'loader-error',
281
+ description,
282
+ filePath,
283
+ fileType,
284
+ };
285
+ return loaderError;
286
+ };
287
+ exports.getLoaderError = getLoaderError;
288
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/lib/validators/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Entity } from './models';
2
+ import { Validator } from '../validators';
3
+ export type { Entity, Assertion } from './models';
4
+ export interface YamlFile {
5
+ content: Entity;
6
+ fileName: string;
7
+ filePath: string;
8
+ }
9
+ export declare const loadYaml: (validationContext: Validator, path: string, basePath?: string) => Promise<YamlFile | undefined>;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/yaml/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,MAAM,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,QAAQ,sBACA,SAAS,QACtB,MAAM,aACF,MAAM,KACf,QAAQ,QAAQ,GAAG,SAAS,CAmB9B,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadYaml = void 0;
4
+ const node_path_1 = require("node:path");
5
+ const utils_1 = require("../utils");
6
+ const models_1 = require("./models");
7
+ const loadYaml = async (validationContext, path, basePath = utils_1.CWD) => {
8
+ const absolutePath = (0, utils_1.resolvePath)(path, basePath);
9
+ const relativePath = (0, node_path_1.relative)(basePath, absolutePath);
10
+ const fileName = (0, node_path_1.basename)(relativePath).split('.')[0];
11
+ try {
12
+ const content = await (0, utils_1.readYaml)(models_1.entityDecoder, path, basePath);
13
+ return {
14
+ content,
15
+ filePath: relativePath,
16
+ fileName,
17
+ };
18
+ }
19
+ catch (error) {
20
+ if (validationContext) {
21
+ validationContext.registerLoaderError(error, relativePath, 'feature');
22
+ }
23
+ else {
24
+ throw error;
25
+ }
26
+ }
27
+ };
28
+ exports.loadYaml = loadYaml;
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/yaml/index.ts"],"names":[],"mappings":";;;AAAA,yCAA+C;AAE/C,oCAAsD;AACtD,qCAAiD;AAW1C,MAAM,QAAQ,GAAG,KAAK,EAC3B,iBAA4B,EAC5B,IAAY,EACZ,WAAmB,WAAG,EACS,EAAE;IACjC,MAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,IAAA,oBAAQ,EAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAA,oBAAQ,EAAC,YAAY,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,IAAI;QACF,MAAM,OAAO,GAAG,MAAM,IAAA,gBAAQ,EAAC,sBAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC9D,OAAO;YACL,OAAO;YACP,QAAQ,EAAE,YAAY;YACtB,QAAQ;SACT,CAAC;KACH;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,iBAAiB,EAAE;YACrB,iBAAiB,CAAC,mBAAmB,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;SACvE;aAAM;YACL,MAAM,KAAK,CAAC;SACb;KACF;AACH,CAAC,CAAC;AAvBW,QAAA,QAAQ,YAuBnB"}
@@ -0,0 +1,21 @@
1
+ import * as d from "io-ts/Decoder";
2
+ export declare const assertionDecoder: d.Decoder<unknown, Partial<{
3
+ description: string;
4
+ }> & {
5
+ assert: string;
6
+ }>;
7
+ export declare const entityDecoder: d.Decoder<unknown, Partial<{
8
+ "specs-unit": Record<string, (Partial<{
9
+ description: string;
10
+ }> & {
11
+ assert: string;
12
+ })[]>;
13
+ definitions: Record<string, string[]>;
14
+ description: string;
15
+ }> & {
16
+ code: string;
17
+ feature: string;
18
+ }>;
19
+ export type Entity = d.TypeOf<typeof entityDecoder>;
20
+ export type Assertion = d.TypeOf<typeof assertionDecoder>;
21
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/lib/yaml/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,eAAe,CAAC;AAEnC,eAAO,MAAM,gBAAgB;;;;EAQ5B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;EAWzB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AACpD,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.entityDecoder = exports.assertionDecoder = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const d = tslib_1.__importStar(require("io-ts/Decoder"));
6
+ exports.assertionDecoder = d.intersect(d.struct({
7
+ assert: d.string,
8
+ }))(d.partial({
9
+ description: d.string,
10
+ }));
11
+ exports.entityDecoder = d.intersect(d.struct({
12
+ code: d.string,
13
+ feature: d.string,
14
+ }))(d.partial({
15
+ "specs-unit": d.record(d.array(exports.assertionDecoder)),
16
+ definitions: d.record(d.array(d.string)),
17
+ description: d.string,
18
+ }));
19
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/lib/yaml/models.ts"],"names":[],"mappings":";;;;AAAA,yDAAmC;AAEtB,QAAA,gBAAgB,GAAG,CAAC,CAAC,SAAS,CACzC,CAAC,CAAC,MAAM,CAAC;IACP,MAAM,EAAE,CAAC,CAAC,MAAM;CACjB,CAAC,CACH,CACC,CAAC,CAAC,OAAO,CAAC;IACR,WAAW,EAAE,CAAC,CAAC,MAAM;CACtB,CAAC,CACH,CAAC;AAEW,QAAA,aAAa,GAAG,CAAC,CAAC,SAAS,CACtC,CAAC,CAAC,MAAM,CAAC;IACP,IAAI,EAAE,CAAC,CAAC,MAAM;IACd,OAAO,EAAE,CAAC,CAAC,MAAM;CAClB,CAAC,CACH,CACC,CAAC,CAAC,OAAO,CAAC;IACR,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,wBAAgB,CAAC,CAAC;IACjD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,MAAM;CACtB,CAAC,CACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "spec-box-tms-sync",
3
+ "version": "0.3.0",
4
+ "private": false,
5
+ "bin": {
6
+ "spec-box": "./bin/spec-box"
7
+ },
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "scripts": {
12
+ "start": "NODE_TLS_REJECT_UNAUTHORIZED=0 ts-node ./src/cli.ts",
13
+ "build": "rm -rf dist && tsc --build tsconfig.json",
14
+ "prepublishOnly": "npm run build",
15
+ "generate-api": "./utils/generate-api.sh",
16
+ "test": "NODE_TLS_REJECT_UNAUTHORIZED=0 ts-node ./src/cli.ts sync",
17
+ "test-ext": "./bin/spec-box sync",
18
+ "version-beta": "npm version prerelease --preid beta",
19
+ "publish-beta": "npm publish --tag beta"
20
+ },
21
+ "license": "MIT",
22
+ "dependencies": {
23
+ "@azure/core-client": "^1.7.3",
24
+ "@azure/core-rest-pipeline": "^1.11.0",
25
+ "chalk": "^4.1.0",
26
+ "fast-glob": "^3.3.0",
27
+ "fp-ts": "^2.16.0",
28
+ "fs-extra": "^11.1.1",
29
+ "io-ts": "^2.2.20",
30
+ "tslib": "^2.6.0",
31
+ "yaml": "^2.3.1",
32
+ "yargs": "^17.7.2"
33
+ },
34
+ "devDependencies": {
35
+ "@types/fs-extra": "^11.0.1",
36
+ "@types/node": "^20.4.2",
37
+ "@types/yargs": "^17.0.24",
38
+ "autorest": "^3.6.3",
39
+ "ts-node": "^10.9.1",
40
+ "typescript": "^5.1.6"
41
+ }
42
+ }