@knapsack/spec-utils 4.78.13--canary.5646.9581069.0 → 4.78.13

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 (57) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-lint.log +4 -0
  3. package/.turbo/turbo-test.log +50 -0
  4. package/CHANGELOG.md +12 -0
  5. package/dist/align/align.vtest.d.ts +2 -0
  6. package/dist/align/align.vtest.d.ts.map +1 -0
  7. package/dist/align/align.vtest.js +46 -0
  8. package/dist/align/align.vtest.js.map +1 -0
  9. package/dist/analyze-exports.sandbox-components.vtest.d.ts +2 -0
  10. package/dist/analyze-exports.sandbox-components.vtest.d.ts.map +1 -0
  11. package/dist/analyze-exports.sandbox-components.vtest.js +51 -0
  12. package/dist/analyze-exports.sandbox-components.vtest.js.map +1 -0
  13. package/dist/analyze-exports.vtest.d.ts +2 -0
  14. package/dist/analyze-exports.vtest.d.ts.map +1 -0
  15. package/dist/analyze-exports.vtest.js +160 -0
  16. package/dist/analyze-exports.vtest.js.map +1 -0
  17. package/dist/convert-to-spec.vtest.d.ts +2 -0
  18. package/dist/convert-to-spec.vtest.d.ts.map +1 -0
  19. package/dist/convert-to-spec.vtest.js +131 -0
  20. package/dist/convert-to-spec.vtest.js.map +1 -0
  21. package/dist/get-ts-config.vtest.d.ts +2 -0
  22. package/dist/get-ts-config.vtest.d.ts.map +1 -0
  23. package/dist/get-ts-config.vtest.js +9 -0
  24. package/dist/get-ts-config.vtest.js.map +1 -0
  25. package/dist/resolve.vtest.d.ts +2 -0
  26. package/dist/resolve.vtest.d.ts.map +1 -0
  27. package/dist/resolve.vtest.js +57 -0
  28. package/dist/resolve.vtest.js.map +1 -0
  29. package/dist/utils.vtest.d.ts +2 -0
  30. package/dist/utils.vtest.d.ts.map +1 -0
  31. package/dist/utils.vtest.js +37 -0
  32. package/dist/utils.vtest.js.map +1 -0
  33. package/package.json +10 -10
  34. package/src/align/align.vtest.ts +56 -0
  35. package/src/align/get-exports.bench.ts +28 -0
  36. package/src/align/resolve.bench.ts +20 -0
  37. package/src/align/utils.ts +14 -0
  38. package/src/analyze-exports.sandbox-components.vtest.ts +53 -0
  39. package/src/analyze-exports.ts +54 -0
  40. package/src/analyze-exports.vtest.ts +178 -0
  41. package/src/analyze-symbol.ts +213 -0
  42. package/src/analyze-type.ts +316 -0
  43. package/src/boot.ts +31 -0
  44. package/src/convert-to-spec.ts +196 -0
  45. package/src/convert-to-spec.vtest.ts +136 -0
  46. package/src/get-exports.ts +70 -0
  47. package/src/get-ts-config.ts +96 -0
  48. package/src/get-ts-config.vtest.ts +9 -0
  49. package/src/index.ts +5 -0
  50. package/src/resolve.ts +54 -0
  51. package/src/resolve.vtest.ts +69 -0
  52. package/src/test-fixtures/basics.ts +17 -0
  53. package/src/test-fixtures/functions.ts +50 -0
  54. package/src/test-fixtures/index.ts +2 -0
  55. package/src/types.ts +66 -0
  56. package/src/utils.ts +61 -0
  57. package/src/utils.vtest.ts +39 -0
@@ -0,0 +1,4 @@
1
+
2
+ > @knapsack/spec-utils@4.78.12 build /home/runner/work/app-monorepo/app-monorepo/apps/client/libs/spec-utils
3
+ > tsc
4
+
@@ -0,0 +1,4 @@
1
+
2
+ > @knapsack/spec-utils@4.78.12 lint /home/runner/work/app-monorepo/app-monorepo/apps/client/libs/spec-utils
3
+ > eslint ./
4
+
@@ -0,0 +1,50 @@
1
+
2
+ > @knapsack/spec-utils@4.78.12 test /home/runner/work/app-monorepo/app-monorepo/apps/client/libs/spec-utils
3
+ > vitest run
4
+
5
+
6
+  RUN  v3.1.1 /home/runner/work/app-monorepo/app-monorepo/apps/client/libs/spec-utils
7
+ Coverage enabled with v8
8
+
9
+ ✓ src/convert-to-spec.vtest.ts (4 tests) 6ms
10
+ ✓ src/get-ts-config.vtest.ts (1 test) 36ms
11
+ ✓ src/resolve.vtest.ts (6 tests) 26ms
12
+ ✓ src/utils.vtest.ts (3 tests) 5ms
13
+ ✓ src/analyze-exports.vtest.ts (20 tests) 2247ms
14
+ ✓ analyze-exports tests for .ts files > gets export names  1196ms
15
+ ✓ analyze-exports tests for .d.ts files > gets export names  1043ms
16
+ ✓ src/analyze-exports.sandbox-components.vtest.ts (2 tests) 5778ms
17
+ ✓ analyze-exports sandbox components > analyzes react exports  2182ms
18
+ ✓ analyze-exports sandbox components > analyzes angular exports  3594ms
19
+ ✓ src/align/align.vtest.ts (8 tests) 7566ms
20
+ ✓ '@knapsack/sandbox-components/react' > finds same export names in ts and js  2113ms
21
+ ✓ '@knapsack/angular-sandbox-components' > finds same export names in ts and js  1548ms
22
+ ✓ '@mui/material' > finds same export names in ts and js  2116ms
23
+ ✓ '@knapsack/utils' > finds same export names in ts and js  1747ms
24
+
25
+  Test Files  7 passed (7)
26
+  Tests  44 passed (44)
27
+  Start at  18:33:46
28
+  Duration  10.42s (transform 471ms, setup 95ms, collect 10.01s, tests 15.66s, environment 2ms, prepare 838ms)
29
+
30
+  % Coverage report from v8
31
+ -------------------|---------|----------|---------|---------|-------------------
32
+ File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
33
+ -------------------|---------|----------|---------|---------|-------------------
34
+ All files | 79.48 | 75 | 84.21 | 79.48 |
35
+ src | 83.6 | 76.15 | 94.11 | 83.6 |
36
+ ...ze-exports.ts | 55.55 | 100 | 50 | 55.55 | 31-54
37
+ ...yze-symbol.ts | 98.85 | 96.55 | 100 | 98.85 | 120-121
38
+ analyze-type.ts | 97.93 | 94.59 | 100 | 97.93 | 226-227,238-239
39
+ boot.ts | 100 | 100 | 100 | 100 |
40
+ ...rt-to-spec.ts | 65.45 | 48.27 | 100 | 65.45 | ...81-185,188-194
41
+ get-exports.ts | 64.4 | 50 | 100 | 64.4 | ...35,47-50,56-70
42
+ get-ts-config.ts | 67.16 | 36.36 | 100 | 67.16 | ...84,86-88,92-94
43
+ resolve.ts | 95.83 | 66.66 | 100 | 95.83 | 51-52
44
+ types.ts | 0 | 0 | 0 | 0 |
45
+ utils.ts | 85.71 | 85.71 | 100 | 85.71 | 58-60
46
+ src/align | 23.72 | 0 | 0 | 23.72 |
47
+ ...orts.bench.ts | 0 | 0 | 0 | 0 | 1-28
48
+ resolve.bench.ts | 0 | 0 | 0 | 0 | 1-20
49
+ utils.ts | 100 | 100 | 100 | 100 |
50
+ -------------------|---------|----------|---------|---------|-------------------
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ # v4.78.13 (Fri Apr 25 2025)
2
+
3
+ #### 🏠 Internal
4
+
5
+ - Network flow diagram for customer security review [#6051](https://github.com/knapsack-labs/app-monorepo/pull/6051) ([@freneticpixel](https://github.com/freneticpixel))
6
+
7
+ #### Authors: 1
8
+
9
+ - Jim Frenette ([@freneticpixel](https://github.com/freneticpixel))
10
+
11
+ ---
12
+
1
13
  # v4.78.11 (Thu Apr 24 2025)
2
14
 
3
15
  #### 🏠 Internal
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=align.vtest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"align.vtest.d.ts","sourceRoot":"","sources":["../../src/align/align.vtest.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { describe, it, expect, assert } from 'vitest';
2
+ import { realpath } from 'node:fs/promises';
3
+ import { getJsExportNames, resolvePath } from '@knapsack/file-utils';
4
+ import { resolveTsModule } from '../resolve.js';
5
+ import { getTsExports } from '../get-exports.js';
6
+ import { paths } from './utils.js';
7
+ describe.for(paths)(`$path`, ({ path }) => {
8
+ it('resolves to same file path', async () => {
9
+ const { absolutePath } = await resolvePath({
10
+ path,
11
+ resolveType: 'types',
12
+ });
13
+ const { resolvedFileName } = resolveTsModule({
14
+ moduleName: path,
15
+ containingFile: import.meta.filename,
16
+ });
17
+ expect(await realpath(resolvedFileName)).toBe(await realpath(absolutePath));
18
+ });
19
+ it('finds same export names in ts and js', {
20
+ timeout: 10000,
21
+ }, async () => {
22
+ const { exports } = getTsExports({
23
+ fileName: path,
24
+ });
25
+ const exportNamesFromTs = exports.map((e) => e.getName());
26
+ const { exports: exportNamesFromJs } = await getJsExportNames({
27
+ path,
28
+ });
29
+ // the ts details will contain things like types that the js details don't
30
+ // this makes sure that all we found in js is also found in ts
31
+ const exportNamesFromJsSet = new Set(exportNamesFromJs);
32
+ exportNamesFromTs.forEach((e) => {
33
+ exportNamesFromJsSet.delete(e);
34
+ });
35
+ if (path === '@mui/material') {
36
+ // pulling these out b/c they fail test, but we got the other ones
37
+ exportNamesFromJsSet.delete('FormLabelRoot');
38
+ exportNamesFromJsSet.delete('private_createMixins');
39
+ exportNamesFromJsSet.delete('usePagination');
40
+ }
41
+ assert.isEmpty(exportNamesFromJsSet, `found ${exportNamesFromJsSet.size} extra exports in js: ${[
42
+ ...exportNamesFromJsSet,
43
+ ].join(', ')}`);
44
+ });
45
+ });
46
+ //# sourceMappingURL=align.vtest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"align.vtest.js","sourceRoot":"","sources":["../../src/align/align.vtest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;IACxC,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,WAAW,CAAC;YACzC,IAAI;YACJ,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,eAAe,CAAC;YAC3C,UAAU,EAAE,IAAI;YAChB,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;SACrC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CACA,sCAAsC,EACtC;QACE,OAAO,EAAE,KAAM;KAChB,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC;YAC/B,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAE1D,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,gBAAgB,CAAC;YAC5D,IAAI;SACL,CAAC,CAAC;QAEH,0EAA0E;QAC1E,8DAA8D;QAC9D,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACxD,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9B,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAC7B,kEAAkE;YAClE,oBAAoB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;YAC7C,oBAAoB,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;YACpD,oBAAoB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,CAAC,OAAO,CACZ,oBAAoB,EACpB,SAAS,oBAAoB,CAAC,IAAI,yBAAyB;YACzD,GAAG,oBAAoB;SACxB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACf,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analyze-exports.sandbox-components.vtest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-exports.sandbox-components.vtest.d.ts","sourceRoot":"","sources":["../src/analyze-exports.sandbox-components.vtest.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { analyzeExports } from './analyze-exports.js';
3
+ import { assertTypeInfo } from './utils.js';
4
+ describe('analyze-exports sandbox components', () => {
5
+ it('analyzes react exports', () => {
6
+ const exports = analyzeExports({
7
+ fileName: '@knapsack/sandbox-components/react',
8
+ });
9
+ const { Button } = exports;
10
+ expect(Button).toBeTruthy();
11
+ assertTypeInfo(Button.typeInfo, 'function');
12
+ const { parameters } = Button.typeInfo;
13
+ const [props] = parameters;
14
+ assertTypeInfo(props.typeInfo, 'object');
15
+ const { properties } = props.typeInfo;
16
+ const { size } = properties;
17
+ assertTypeInfo(size.typeInfo, 'union');
18
+ const { items } = size.typeInfo;
19
+ const sizeValues = items
20
+ .map((item) => {
21
+ assertTypeInfo(item, 'stringLiteral');
22
+ return item.value;
23
+ })
24
+ .sort();
25
+ expect(sizeValues).toEqual(['large', 'medium', 'small'].sort());
26
+ });
27
+ it('analyzes angular exports', () => {
28
+ const exports = analyzeExports({
29
+ fileName: '@knapsack/angular-sandbox-components',
30
+ });
31
+ const { KsButtonComponent } = exports;
32
+ expect(KsButtonComponent).toBeTruthy();
33
+ assertTypeInfo(KsButtonComponent.typeInfo, 'class');
34
+ const { prototype } = KsButtonComponent.typeInfo;
35
+ assertTypeInfo(prototype.typeInfo, 'object');
36
+ const { hasArrow, click, size, handleClick } = prototype.typeInfo.properties;
37
+ assertTypeInfo(hasArrow.typeInfo, 'boolean');
38
+ assertTypeInfo(handleClick.typeInfo, 'function');
39
+ expect(click.typeInfo.tsRawType).toBe('EventEmitter<void>');
40
+ assertTypeInfo(size.typeInfo, 'union');
41
+ const { items } = size.typeInfo;
42
+ const sizeValues = items
43
+ .map((item) => {
44
+ assertTypeInfo(item, 'stringLiteral');
45
+ return item.value;
46
+ })
47
+ .sort();
48
+ expect(sizeValues).toEqual(['large', 'medium', 'small'].sort());
49
+ });
50
+ });
51
+ //# sourceMappingURL=analyze-exports.sandbox-components.vtest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-exports.sandbox-components.vtest.js","sourceRoot":"","sources":["../src/analyze-exports.sandbox-components.vtest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analyze-exports.vtest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-exports.vtest.d.ts","sourceRoot":"","sources":["../src/analyze-exports.vtest.ts"],"names":[],"mappings":""}
@@ -0,0 +1,160 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { join } from 'node:path';
3
+ import { analyzeExports } from './analyze-exports.js';
4
+ import { assertTypeInfo } from './utils.js';
5
+ const tsDetailsSrc = join(import.meta.dirname, '../src/test-fixtures/index.ts');
6
+ const tsDetailsDts = join(import.meta.dirname, '../dist/test-fixtures/index.d.ts');
7
+ [tsDetailsSrc, tsDetailsDts].forEach((fileName) => {
8
+ const ext = fileName.endsWith('.d.ts') ? '.d.ts' : '.ts';
9
+ const exports = analyzeExports({ fileName });
10
+ describe(`analyze-exports tests for ${ext} files`, () => {
11
+ it(`gets export names`, () => {
12
+ const results = analyzeExports({
13
+ fileName,
14
+ });
15
+ const exportNames = Object.keys(results);
16
+ expect(exportNames).toContain('complexFuncTypes');
17
+ expect(exportNames).toContain('doIt');
18
+ });
19
+ it(`handles basics: number`, () => {
20
+ const { typeInfo } = exports.aNumber;
21
+ expect(typeInfo.type).toBe('number');
22
+ });
23
+ it(`handles string union`, () => {
24
+ const { typeInfo } = exports.stringUnion;
25
+ assertTypeInfo(typeInfo, 'union');
26
+ const { items } = typeInfo;
27
+ const sizes = items.map((item) => {
28
+ if (item.type !== 'stringLiteral') {
29
+ throw new Error(`Expected type to be stringLiteral, got ${item.type}`);
30
+ }
31
+ return item.value;
32
+ });
33
+ expect(sizes).toEqual(['small', 'medium', 'large']);
34
+ });
35
+ it(`handles string via type alias`, () => {
36
+ const { typeInfo } = exports.stringViaTypeAlias;
37
+ expect(typeInfo.type).toBe('string');
38
+ });
39
+ it(`handles jsdoc`, () => {
40
+ const { jsDoc } = exports.complexFuncTypes;
41
+ if (!jsDoc) {
42
+ throw new Error('jsDoc is undefined');
43
+ }
44
+ expect(jsDoc.description).toBe('Some basic types');
45
+ expect(jsDoc.jsDocTags.length).toBe(1);
46
+ expect(jsDoc.jsDocTags).toEqual([
47
+ { name: 'link', text: 'https://www.example.com' },
48
+ ]);
49
+ });
50
+ it(`handles basics: string[]`, () => {
51
+ const { typeInfo } = exports.anArrayOfStrings;
52
+ assertTypeInfo(typeInfo, 'array');
53
+ expect(typeInfo.items.type).toBe('string');
54
+ expect(typeInfo.tsRawType).toBe('string[]');
55
+ });
56
+ it(`handles basics: object`, () => {
57
+ const { typeInfo } = exports.anObject;
58
+ assertTypeInfo(typeInfo, 'object');
59
+ const { properties: { a, b, c }, } = typeInfo;
60
+ expect(a.typeInfo.type).toBe('number');
61
+ expect(b.typeInfo.type).toBe('string');
62
+ assertTypeInfo(c.typeInfo, 'array');
63
+ expect(c.typeInfo.items.type).toBe('string');
64
+ expect(c.typeInfo.tsRawType).toBe('string[]');
65
+ });
66
+ it(`handles function with basic parameters`, () => {
67
+ const { typeInfo } = exports.aFunction;
68
+ assertTypeInfo(typeInfo, 'function');
69
+ const { parameters, returnType, tsRawType } = typeInfo;
70
+ if (!returnType) {
71
+ throw new Error('returnType is undefined');
72
+ }
73
+ const [param] = parameters;
74
+ expect(tsRawType).toBe('(a: number) => number');
75
+ expect(param.name).toBe('a');
76
+ expect(param.typeInfo.type).toBe('number');
77
+ expect(returnType.type).toBe('number');
78
+ });
79
+ it(`handles async function with basic parameters`, () => {
80
+ const { typeInfo } = exports.asyncFunction;
81
+ assertTypeInfo(typeInfo, 'function');
82
+ const { parameters, returnType, tsRawType } = typeInfo;
83
+ if (!returnType) {
84
+ throw new Error('returnType is undefined');
85
+ }
86
+ const [param] = parameters;
87
+ expect(param.name).toBe('a');
88
+ expect(param.typeInfo.type).toBe('number');
89
+ expect(tsRawType).toBe('(a: number) => Promise<number>');
90
+ expect(returnType.type).toBe('misc');
91
+ });
92
+ it(`handles function with complex parameters`, () => {
93
+ const { typeInfo } = exports.complexFuncTypes;
94
+ assertTypeInfo(typeInfo, 'function');
95
+ const [param] = typeInfo.parameters;
96
+ expect(param.name).toBe('obj');
97
+ assertTypeInfo(param.typeInfo, 'object');
98
+ const { properties } = param.typeInfo;
99
+ Object.entries(properties).forEach(([key, { typeInfo: propInfo }]) => {
100
+ switch (key) {
101
+ case 'aString': {
102
+ expect(propInfo.type).toBe('string');
103
+ expect(propInfo.isOptional).toBe(false);
104
+ break;
105
+ }
106
+ case 'anOptionalString': {
107
+ expect(propInfo.type).toBe('string');
108
+ expect(propInfo.isOptional).toBe(true);
109
+ break;
110
+ }
111
+ case 'aBoolean': {
112
+ expect(propInfo.type).toBe('boolean');
113
+ expect(propInfo.isOptional).toBe(false);
114
+ break;
115
+ }
116
+ case 'someSizes': {
117
+ assertTypeInfo(propInfo, 'union');
118
+ const sizes = propInfo.items.map((item) => {
119
+ assertTypeInfo(item, 'stringLiteral');
120
+ return item.value;
121
+ });
122
+ expect(sizes).toEqual(['small', 'medium', 'large']);
123
+ break;
124
+ }
125
+ case 'anArray': {
126
+ assertTypeInfo(propInfo, 'array');
127
+ expect(propInfo.items.type).toBe('string');
128
+ break;
129
+ }
130
+ case 'aFunc': {
131
+ assertTypeInfo(propInfo, 'function');
132
+ const { parameters, returnType } = propInfo;
133
+ if (!returnType) {
134
+ throw new Error('returnType is undefined');
135
+ }
136
+ const [p] = parameters;
137
+ expect(p.name).toBe('a');
138
+ expect(p.typeInfo.type).toBe('string');
139
+ expect(returnType.type).toBe('string');
140
+ break;
141
+ }
142
+ case 'anotherFunc': {
143
+ assertTypeInfo(propInfo, 'function');
144
+ const { parameters } = propInfo;
145
+ const [p] = parameters;
146
+ expect(p.name).toBe('opt');
147
+ assertTypeInfo(p.typeInfo, 'object');
148
+ const { onFoo } = p.typeInfo.properties;
149
+ assertTypeInfo(onFoo.typeInfo, 'function');
150
+ const [onFooParam] = onFoo.typeInfo.parameters;
151
+ expect(onFooParam.name).toBe('a');
152
+ expect(onFooParam.typeInfo.type).toBe('string');
153
+ break;
154
+ }
155
+ }
156
+ });
157
+ });
158
+ });
159
+ });
160
+ //# sourceMappingURL=analyze-exports.vtest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-exports.vtest.js","sourceRoot":"","sources":["../src/analyze-exports.vtest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=convert-to-spec.vtest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-to-spec.vtest.d.ts","sourceRoot":"","sources":["../src/convert-to-spec.vtest.ts"],"names":[],"mappings":""}
@@ -0,0 +1,131 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { convertToSpec } from './convert-to-spec.js';
3
+ // these two are up here to make TS happy
4
+ const typeInfoStubBase = {
5
+ tsRawType: '',
6
+ tsMetadata: null,
7
+ };
8
+ const tsMetadata = null;
9
+ describe('convert-to-spec', () => {
10
+ it('handles string', () => {
11
+ const { prop } = convertToSpec({
12
+ typeInfo: {
13
+ type: 'string',
14
+ ...typeInfoStubBase,
15
+ },
16
+ trustRequiredProps: false,
17
+ });
18
+ expect(prop).toEqual({
19
+ type: 'string',
20
+ });
21
+ });
22
+ it('handles boolean', () => {
23
+ const { prop } = convertToSpec({
24
+ typeInfo: {
25
+ type: 'boolean',
26
+ ...typeInfoStubBase,
27
+ },
28
+ trustRequiredProps: false,
29
+ });
30
+ expect(prop).toEqual({
31
+ type: 'boolean',
32
+ });
33
+ });
34
+ it('handles object', () => {
35
+ const { prop } = convertToSpec({
36
+ typeInfo: {
37
+ type: 'object',
38
+ ...typeInfoStubBase,
39
+ properties: {
40
+ name: {
41
+ name: 'name',
42
+ typeInfo: {
43
+ type: 'string',
44
+ tsRawType: '',
45
+ tsMetadata: null,
46
+ },
47
+ tsMetadata,
48
+ },
49
+ age: {
50
+ name: 'age',
51
+ typeInfo: {
52
+ isOptional: true,
53
+ type: 'number',
54
+ ...typeInfoStubBase,
55
+ },
56
+ tsMetadata,
57
+ },
58
+ shoePrefs: {
59
+ name: 'shoePrefs',
60
+ typeInfo: {
61
+ type: 'union',
62
+ ...typeInfoStubBase,
63
+ items: [
64
+ {
65
+ type: 'stringLiteral',
66
+ value: 'sandals',
67
+ ...typeInfoStubBase,
68
+ },
69
+ { type: 'stringLiteral', value: 'boots', ...typeInfoStubBase },
70
+ ],
71
+ },
72
+ tsMetadata,
73
+ },
74
+ },
75
+ },
76
+ trustRequiredProps: true,
77
+ });
78
+ expect(prop).toEqual({
79
+ type: 'object',
80
+ required: ['name', 'shoePrefs'],
81
+ properties: {
82
+ name: {
83
+ type: 'string',
84
+ },
85
+ age: {
86
+ type: 'number',
87
+ },
88
+ shoePrefs: {
89
+ type: 'string',
90
+ enum: ['sandals', 'boots'],
91
+ },
92
+ },
93
+ });
94
+ });
95
+ it('handles array of objects', () => {
96
+ const { prop } = convertToSpec({
97
+ typeInfo: {
98
+ type: 'array',
99
+ items: {
100
+ type: 'object',
101
+ properties: {
102
+ name: {
103
+ name: 'name',
104
+ typeInfo: {
105
+ type: 'string',
106
+ ...typeInfoStubBase,
107
+ },
108
+ tsMetadata,
109
+ },
110
+ },
111
+ ...typeInfoStubBase,
112
+ },
113
+ ...typeInfoStubBase,
114
+ },
115
+ trustRequiredProps: false,
116
+ });
117
+ expect(prop).toEqual({
118
+ type: 'array',
119
+ items: {
120
+ type: 'object',
121
+ required: [],
122
+ properties: {
123
+ name: {
124
+ type: 'string',
125
+ },
126
+ },
127
+ },
128
+ });
129
+ });
130
+ });
131
+ //# sourceMappingURL=convert-to-spec.vtest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-to-spec.vtest.js","sourceRoot":"","sources":["../src/convert-to-spec.vtest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=get-ts-config.vtest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ts-config.vtest.d.ts","sourceRoot":"","sources":["../src/get-ts-config.vtest.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { getTsConfigJson } from './get-ts-config.js';
3
+ describe('get-ts-config', () => {
4
+ it('reads this pkg tsconfig.json', () => {
5
+ const { tsConfig } = getTsConfigJson({ basePath: import.meta.dirname });
6
+ expect(Object.keys(tsConfig.options).length).toBeGreaterThan(0);
7
+ });
8
+ });
9
+ //# sourceMappingURL=get-ts-config.vtest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ts-config.vtest.js","sourceRoot":"","sources":["../src/get-ts-config.vtest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolve.vtest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.vtest.d.ts","sourceRoot":"","sources":["../src/resolve.vtest.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { join } from 'node:path';
3
+ import { resolveTsModule } from './resolve.js';
4
+ describe('resolve module tests', () => {
5
+ it('resolves @knapsack/utils', () => {
6
+ const { resolvedFileName, isExternalLibraryImport } = resolveTsModule({
7
+ containingFile: import.meta.filename,
8
+ moduleName: '@knapsack/utils',
9
+ });
10
+ expect(resolvedFileName).toBeTruthy();
11
+ expect(resolvedFileName).toMatch(/\.d\.ts$/);
12
+ expect(resolvedFileName).toContain('utils/dist');
13
+ expect(isExternalLibraryImport).toBe(true);
14
+ });
15
+ it('resolves local ts file with .js extension', () => {
16
+ const { resolvedFileName } = resolveTsModule({
17
+ containingFile: import.meta.filename,
18
+ moduleName: './boot.js',
19
+ });
20
+ expect(resolvedFileName).toBe(join(import.meta.dirname, './boot.ts'));
21
+ });
22
+ it('resolves local ts file with .ts extension', () => {
23
+ const { resolvedFileName } = resolveTsModule({
24
+ containingFile: import.meta.filename,
25
+ moduleName: './boot.ts',
26
+ });
27
+ expect(resolvedFileName).toBe(join(import.meta.dirname, './boot.ts'));
28
+ });
29
+ it('resolves a local package.json', () => {
30
+ const { resolvedFileName } = resolveTsModule({
31
+ containingFile: import.meta.filename,
32
+ moduleName: '../package.json',
33
+ });
34
+ expect(resolvedFileName).toMatch(/package\.json$/);
35
+ expect(resolvedFileName).toBe(join(import.meta.dirname, '../package.json'));
36
+ });
37
+ it('resolves a local file', () => {
38
+ const { resolvedFileName } = resolveTsModule({
39
+ containingFile: import.meta.filename,
40
+ moduleName: '../.eslintrc.cjs',
41
+ });
42
+ expect(resolvedFileName).toBe(join(import.meta.dirname, '../.eslintrc.cjs'));
43
+ });
44
+ it('resolves alias of @knapsack/utils', () => {
45
+ const { resolvedFileName } = resolveTsModule({
46
+ containingFile: import.meta.filename,
47
+ moduleName: 'foo',
48
+ pkgPathAliases: {
49
+ foo: '@knapsack/utils',
50
+ },
51
+ });
52
+ expect(resolvedFileName).toBeTruthy();
53
+ expect(resolvedFileName).toMatch(/\.d\.ts$/);
54
+ expect(resolvedFileName).toContain('utils/dist');
55
+ });
56
+ });
57
+ //# sourceMappingURL=resolve.vtest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.vtest.js","sourceRoot":"","sources":["../src/resolve.vtest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.vtest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.vtest.d.ts","sourceRoot":"","sources":["../src/utils.vtest.ts"],"names":[],"mappings":""}