@tanstack/cta-engine 0.10.0-alpha.18 → 0.10.0-alpha.20

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 (72) hide show
  1. package/dist/add-ons.js +5 -14
  2. package/dist/add-to-app.js +118 -74
  3. package/dist/config-file.js +9 -7
  4. package/dist/create-app.js +111 -42
  5. package/dist/custom-add-ons/add-on.js +175 -0
  6. package/dist/custom-add-ons/shared.js +117 -0
  7. package/dist/custom-add-ons/starter.js +84 -0
  8. package/dist/environment.js +59 -12
  9. package/dist/file-helpers.js +108 -2
  10. package/dist/frameworks.js +15 -1
  11. package/dist/index.js +12 -5
  12. package/dist/integrations/shadcn.js +10 -4
  13. package/dist/options.js +9 -0
  14. package/dist/package-json.js +7 -4
  15. package/dist/special-steps/index.js +24 -0
  16. package/dist/special-steps/rimraf-node-modules.js +16 -0
  17. package/dist/template-file.js +3 -13
  18. package/dist/types/add-ons.d.ts +3 -4
  19. package/dist/types/add-to-app.d.ts +16 -3
  20. package/dist/types/config-file.d.ts +4 -3
  21. package/dist/types/create-app.d.ts +1 -7
  22. package/dist/types/custom-add-ons/add-on.d.ts +69 -0
  23. package/dist/types/custom-add-ons/shared.d.ts +15 -0
  24. package/dist/types/custom-add-ons/starter.d.ts +7 -0
  25. package/dist/types/environment.d.ts +2 -1
  26. package/dist/types/file-helpers.d.ts +10 -0
  27. package/dist/types/frameworks.d.ts +2 -0
  28. package/dist/types/index.d.ts +13 -6
  29. package/dist/types/integrations/shadcn.d.ts +1 -1
  30. package/dist/types/options.d.ts +2 -0
  31. package/dist/types/package-json.d.ts +5 -0
  32. package/dist/types/package-manager.d.ts +6 -2
  33. package/dist/types/special-steps/index.d.ts +2 -0
  34. package/dist/types/special-steps/rimraf-node-modules.d.ts +2 -0
  35. package/dist/types/template-file.d.ts +1 -1
  36. package/dist/types/types.d.ts +752 -70
  37. package/dist/types.js +65 -1
  38. package/package.json +9 -3
  39. package/src/add-ons.ts +7 -19
  40. package/src/add-to-app.ts +195 -101
  41. package/src/config-file.ts +16 -13
  42. package/src/create-app.ts +128 -84
  43. package/src/custom-add-ons/add-on.ts +261 -0
  44. package/src/custom-add-ons/shared.ts +161 -0
  45. package/src/custom-add-ons/starter.ts +126 -0
  46. package/src/environment.ts +70 -11
  47. package/src/file-helpers.ts +164 -2
  48. package/src/frameworks.ts +21 -1
  49. package/src/index.ts +46 -11
  50. package/src/integrations/shadcn.ts +14 -4
  51. package/src/options.ts +11 -0
  52. package/src/package-json.ts +13 -6
  53. package/src/special-steps/index.ts +36 -0
  54. package/src/special-steps/rimraf-node-modules.ts +25 -0
  55. package/src/template-file.ts +3 -18
  56. package/src/types.ts +143 -85
  57. package/tests/add-ons.test.ts +5 -5
  58. package/tests/add-to-app.test.ts +358 -0
  59. package/tests/config-file.test.ts +36 -7
  60. package/tests/create-app.test.ts +43 -68
  61. package/tests/custom-add-ons/add-on.test.ts +12 -0
  62. package/tests/custom-add-ons/shared.test.ts +257 -0
  63. package/tests/custom-add-ons/starter.test.ts +58 -0
  64. package/tests/environment.test.ts +90 -2
  65. package/tests/file-helper.test.ts +55 -2
  66. package/tests/frameworks.test.ts +95 -0
  67. package/tests/index.test.ts +9 -0
  68. package/tests/integrations/shadcn.test.ts +48 -63
  69. package/tests/options.test.ts +42 -0
  70. package/tests/setupVitest.ts +6 -0
  71. package/tests/template-file.test.ts +54 -93
  72. package/vitest.config.ts +21 -0
@@ -9,22 +9,17 @@ describe('shadcn', () => {
9
9
  it('should skip if no components are selected', async () => {
10
10
  const { environment, output } = createMemoryEnvironment()
11
11
  environment.startRun()
12
- await installShadcnComponents(
13
- environment,
14
- '/test',
15
- {
16
- packageManager: 'pnpm',
17
- chosenAddOns: [],
18
- projectName: 'test',
19
- typescript: true,
20
- spinner: () => ({
21
- start: () => {},
22
- succeed: () => {},
23
- fail: () => {},
24
- }),
25
- } as unknown as Options,
26
- true,
27
- )
12
+ await installShadcnComponents(environment, '/test', {
13
+ packageManager: 'pnpm',
14
+ chosenAddOns: [],
15
+ projectName: 'test',
16
+ typescript: true,
17
+ spinner: () => ({
18
+ start: () => {},
19
+ succeed: () => {},
20
+ fail: () => {},
21
+ }),
22
+ } as unknown as Options)
28
23
  environment.finishRun()
29
24
 
30
25
  expect(output.commands).toEqual([])
@@ -33,31 +28,26 @@ describe('shadcn', () => {
33
28
  it('should add shadcn components for add-ons', async () => {
34
29
  const { environment, output } = createMemoryEnvironment()
35
30
  environment.startRun()
36
- await installShadcnComponents(
37
- environment,
38
- '/test',
39
- {
40
- packageManager: 'pnpm',
41
- chosenAddOns: [
42
- {
43
- id: 'shadcn',
44
- shadcnComponents: ['button'],
45
- },
46
- {
47
- id: 'test-1',
48
- shadcnComponents: ['button', 'card'],
49
- },
50
- ],
51
- projectName: 'test',
52
- typescript: true,
53
- spinner: () => ({
54
- start: () => {},
55
- succeed: () => {},
56
- fail: () => {},
57
- }),
58
- } as unknown as Options,
59
- false,
60
- )
31
+ await installShadcnComponents(environment, '/test', {
32
+ packageManager: 'pnpm',
33
+ chosenAddOns: [
34
+ {
35
+ id: 'shadcn',
36
+ shadcnComponents: ['button'],
37
+ },
38
+ {
39
+ id: 'test-1',
40
+ shadcnComponents: ['button', 'card'],
41
+ },
42
+ ],
43
+ projectName: 'test',
44
+ typescript: true,
45
+ spinner: () => ({
46
+ start: () => {},
47
+ succeed: () => {},
48
+ fail: () => {},
49
+ }),
50
+ } as unknown as Options)
61
51
  environment.finishRun()
62
52
 
63
53
  expect(output.commands).toEqual([
@@ -71,29 +61,24 @@ describe('shadcn', () => {
71
61
  it('should add shadcn components in the starter', async () => {
72
62
  const { environment, output } = createMemoryEnvironment()
73
63
  environment.startRun()
74
- await installShadcnComponents(
75
- environment,
76
- '/test',
77
- {
78
- packageManager: 'pnpm',
79
- chosenAddOns: [
80
- {
81
- id: 'shadcn',
82
- },
83
- ],
84
- projectName: 'test',
85
- typescript: true,
86
- starter: {
87
- shadcnComponents: ['button', 'card'],
64
+ await installShadcnComponents(environment, '/test', {
65
+ packageManager: 'pnpm',
66
+ chosenAddOns: [
67
+ {
68
+ id: 'shadcn',
88
69
  },
89
- spinner: () => ({
90
- start: () => {},
91
- succeed: () => {},
92
- fail: () => {},
93
- }),
94
- } as unknown as Options,
95
- false,
96
- )
70
+ ],
71
+ projectName: 'test',
72
+ typescript: true,
73
+ starter: {
74
+ shadcnComponents: ['button', 'card'],
75
+ },
76
+ spinner: () => ({
77
+ start: () => {},
78
+ succeed: () => {},
79
+ fail: () => {},
80
+ }),
81
+ } as unknown as Options)
97
82
  environment.finishRun()
98
83
 
99
84
  expect(output.commands).toEqual([
@@ -0,0 +1,42 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { createSerializedOptions } from '../src/options.js'
4
+ import { AddOn, Framework, Options, Starter } from '../src/types.js'
5
+
6
+ describe('createSerializedOptions', () => {
7
+ it('handle no add-ons', () => {
8
+ const options = createSerializedOptions({
9
+ framework: {
10
+ id: 'react-cra',
11
+ } as Framework,
12
+ chosenAddOns: [],
13
+ } as unknown as Options)
14
+ expect(options).toEqual({
15
+ framework: 'react-cra',
16
+ chosenAddOns: [],
17
+ })
18
+ })
19
+
20
+ it('handle add-ons and a starter', () => {
21
+ const options = createSerializedOptions({
22
+ framework: {
23
+ id: 'react-cra',
24
+ } as Framework,
25
+ chosenAddOns: [
26
+ {
27
+ id: 'add-on-1',
28
+ description: 'Add-on 1',
29
+ modes: ['file-router'],
30
+ } as AddOn,
31
+ ],
32
+ starter: {
33
+ id: 'starter-1',
34
+ } as unknown as Starter,
35
+ } as unknown as Options)
36
+ expect(options).toEqual({
37
+ framework: 'react-cra',
38
+ chosenAddOns: ['add-on-1'],
39
+ starter: 'starter-1',
40
+ })
41
+ })
42
+ })
@@ -0,0 +1,6 @@
1
+ import createFetchMock from 'vitest-fetch-mock'
2
+ import { vi } from 'vitest'
3
+
4
+ const fetchMocker = createFetchMock(vi)
5
+
6
+ fetchMocker.enableMocks()
@@ -8,6 +8,7 @@ import type { AddOn, Integration, Options } from '../src/types.js'
8
8
 
9
9
  const simpleOptions = {
10
10
  projectName: 'test',
11
+ targetDir: '/test',
11
12
  framework: {
12
13
  id: 'test',
13
14
  name: 'Test',
@@ -17,15 +18,12 @@ const simpleOptions = {
17
18
  typescript: true,
18
19
  tailwind: true,
19
20
  mode: FILE_ROUTER,
20
- variableValues: {
21
- a: 'foo',
22
- },
23
21
  } as unknown as Options
24
22
 
25
23
  describe('createTemplateFile', () => {
26
24
  it('should template a simple file', async () => {
27
25
  const { environment, output } = createMemoryEnvironment()
28
- const templateFile = createTemplateFile(environment, simpleOptions, '/test')
26
+ const templateFile = createTemplateFile(environment, simpleOptions)
29
27
  environment.startRun()
30
28
  await templateFile('./test.ts', 'let a = 1')
31
29
  environment.finishRun()
@@ -33,34 +31,11 @@ describe('createTemplateFile', () => {
33
31
  expect(output.files['/test/test.ts'].trim()).toEqual('let a = 1')
34
32
  })
35
33
 
36
- it('should template a simple file with ejs', async () => {
37
- const { environment, output } = createMemoryEnvironment()
38
- const templateFile = createTemplateFile(
39
- environment,
40
- {
41
- ...simpleOptions,
42
- variableValues: {
43
- a: 'foo',
44
- },
45
- } as unknown as Options,
46
- '/test',
47
- )
48
- environment.startRun()
49
- await templateFile('./test.ts.ejs', "let a = '<%= variables.a %>'")
50
- environment.finishRun()
51
-
52
- expect(output.files['/test/test.ts'].trim()).toEqual("let a = 'foo'")
53
- })
54
-
55
34
  it('should handle ignore files', async () => {
56
35
  const { environment, output } = createMemoryEnvironment()
57
- const templateFile = createTemplateFile(
58
- environment,
59
- {
60
- ...simpleOptions,
61
- } as unknown as Options,
62
- '/test',
63
- )
36
+ const templateFile = createTemplateFile(environment, {
37
+ ...simpleOptions,
38
+ } as unknown as Options)
64
39
  environment.startRun()
65
40
  await templateFile('./test.ts.ejs', '<% ignoreFile() %>let a = 1')
66
41
  environment.finishRun()
@@ -70,7 +45,7 @@ describe('createTemplateFile', () => {
70
45
 
71
46
  it('should handle append files', async () => {
72
47
  const { environment, output } = createMemoryEnvironment()
73
- const templateFile = createTemplateFile(environment, simpleOptions, '/test')
48
+ const templateFile = createTemplateFile(environment, simpleOptions)
74
49
  environment.startRun()
75
50
  await templateFile('./test.txt.ejs', 'Line 1\n')
76
51
  await templateFile('./test.txt.append', 'Line 2\n')
@@ -81,23 +56,19 @@ describe('createTemplateFile', () => {
81
56
 
82
57
  it('should handle enabled add-ons', async () => {
83
58
  const { environment, output } = createMemoryEnvironment()
84
- const templateFile = createTemplateFile(
85
- environment,
86
- {
87
- ...simpleOptions,
88
- chosenAddOns: [
89
- {
90
- id: 'test1',
91
- name: 'Test 1',
92
- },
93
- {
94
- id: 'test2',
95
- name: 'Test 2',
96
- },
97
- ] as Array<AddOn>,
98
- },
99
- '/test',
100
- )
59
+ const templateFile = createTemplateFile(environment, {
60
+ ...simpleOptions,
61
+ chosenAddOns: [
62
+ {
63
+ id: 'test1',
64
+ name: 'Test 1',
65
+ },
66
+ {
67
+ id: 'test2',
68
+ name: 'Test 2',
69
+ },
70
+ ] as Array<AddOn>,
71
+ })
101
72
  environment.startRun()
102
73
  await templateFile(
103
74
  './test.txt.ejs',
@@ -110,7 +81,7 @@ describe('createTemplateFile', () => {
110
81
 
111
82
  it('should handle relative paths', async () => {
112
83
  const { environment, output } = createMemoryEnvironment()
113
- const templateFile = createTemplateFile(environment, simpleOptions, '/test')
84
+ const templateFile = createTemplateFile(environment, simpleOptions)
114
85
  environment.startRun()
115
86
  await templateFile(
116
87
  './src/test/test.txt.ejs',
@@ -125,27 +96,23 @@ describe('createTemplateFile', () => {
125
96
 
126
97
  it('should handle routes', async () => {
127
98
  const { environment, output } = createMemoryEnvironment()
128
- const templateFile = createTemplateFile(
129
- environment,
130
- {
131
- ...simpleOptions,
132
- chosenAddOns: [
133
- {
134
- id: 'test',
135
- name: 'Test',
136
- routes: [
137
- {
138
- path: '/test',
139
- name: 'Test',
140
- url: '/test',
141
- jsName: 'test',
142
- },
143
- ],
144
- } as AddOn,
145
- ],
146
- },
147
- '/test',
148
- )
99
+ const templateFile = createTemplateFile(environment, {
100
+ ...simpleOptions,
101
+ chosenAddOns: [
102
+ {
103
+ id: 'test',
104
+ name: 'Test',
105
+ routes: [
106
+ {
107
+ path: '/test',
108
+ name: 'Test',
109
+ url: '/test',
110
+ jsName: 'test',
111
+ },
112
+ ],
113
+ } as AddOn,
114
+ ],
115
+ })
149
116
 
150
117
  environment.startRun()
151
118
  await templateFile(
@@ -154,33 +121,27 @@ describe('createTemplateFile', () => {
154
121
  )
155
122
  environment.finishRun()
156
123
 
157
- console.log(output.files['/test/test.txt'])
158
-
159
124
  expect(output.files['/test/test.txt']).toEqual('/test')
160
125
  })
161
126
 
162
127
  it('should handle integrations', async () => {
163
128
  const { environment, output } = createMemoryEnvironment()
164
- const templateFile = createTemplateFile(
165
- environment,
166
- {
167
- ...simpleOptions,
168
- chosenAddOns: [
169
- {
170
- id: 'test',
171
- name: 'Test',
172
- integrations: [
173
- {
174
- type: 'header-user',
175
- path: '/test',
176
- jsName: 'test',
177
- } as Integration,
178
- ],
179
- } as AddOn,
180
- ],
181
- },
182
- '/test',
183
- )
129
+ const templateFile = createTemplateFile(environment, {
130
+ ...simpleOptions,
131
+ chosenAddOns: [
132
+ {
133
+ id: 'test',
134
+ name: 'Test',
135
+ integrations: [
136
+ {
137
+ type: 'header-user',
138
+ path: '/test',
139
+ jsName: 'test',
140
+ } as Integration,
141
+ ],
142
+ } as AddOn,
143
+ ],
144
+ })
184
145
 
185
146
  environment.startRun()
186
147
  await templateFile(
@@ -194,7 +155,7 @@ describe('createTemplateFile', () => {
194
155
 
195
156
  it('should handle package manager', async () => {
196
157
  const { environment, output } = createMemoryEnvironment()
197
- const templateFile = createTemplateFile(environment, simpleOptions, '/test')
158
+ const templateFile = createTemplateFile(environment, simpleOptions)
198
159
  environment.startRun()
199
160
  await templateFile(
200
161
  './foo.txt.ejs',
@@ -0,0 +1,21 @@
1
+ import { defineConfig } from 'vitest/config'
2
+ import path from 'node:path'
3
+
4
+ export default defineConfig({
5
+ test: {
6
+ setupFiles: ['./tests/setupVitest.js'],
7
+ deps: {
8
+ moduleDirectories: ['node_modules', path.resolve('../../packages')],
9
+ },
10
+ coverage: {
11
+ exclude: [
12
+ 'node_modules',
13
+ 'dist',
14
+ 'build',
15
+ 'tests/**',
16
+ '**/types.ts',
17
+ 'vitest.config.ts',
18
+ ],
19
+ },
20
+ },
21
+ })