@vertz/create-vertz-app 0.2.9 → 0.2.11

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA+B/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAoBzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAa5C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAGpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAc9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA6B1C;AAID;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAoBvC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAavC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CASnC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAe5C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAOvC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAgD7C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAW5C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAWtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAyGzC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/templates/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA+B/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAoBzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAa5C;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAGpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAc9C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA6B1C;AAID;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAoBvC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAavC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CASnC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAe5C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAOvC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAgD7C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAW5C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAWtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAkIzC"}
@@ -317,9 +317,30 @@ export const themeGlobals = globals;
317
317
  * src/pages/home.tsx — task list + create form with query + css
318
318
  */
319
319
  export function homePageTemplate() {
320
- return `import { css, query, queryMatch } from '@vertz/ui';
320
+ return `import {
321
+ ANIMATION_DURATION,
322
+ ANIMATION_EASING,
323
+ ListTransition,
324
+ css,
325
+ fadeOut,
326
+ globalCss,
327
+ query,
328
+ queryMatch,
329
+ slideInFromTop,
330
+ } from '@vertz/ui';
321
331
  import { api } from '../client';
322
332
 
333
+ // Inject global CSS for list item enter/exit animations
334
+ void globalCss({
335
+ '[data-presence="enter"]': {
336
+ animation: \`\${slideInFromTop} \${ANIMATION_DURATION} \${ANIMATION_EASING}\`,
337
+ },
338
+ '[data-presence="exit"]': {
339
+ animation: \`\${fadeOut} \${ANIMATION_DURATION} \${ANIMATION_EASING}\`,
340
+ overflow: 'hidden',
341
+ },
342
+ });
343
+
323
344
  const pageStyles = css({
324
345
  container: ['py:2', 'w:full'],
325
346
  heading: ['font:xl', 'font:bold', 'text:foreground', 'mb:4'],
@@ -408,11 +429,15 @@ export function HomePage() {
408
429
  </div>
409
430
  )}
410
431
  <div data-testid="task-list" class={pageStyles.list}>
411
- {response.items.map((task) => (
412
- <div key={task.id} class={pageStyles.item}>
413
- <span>{task.title}</span>
414
- </div>
415
- ))}
432
+ <ListTransition
433
+ each={response.items}
434
+ keyFn={(task) => task.id}
435
+ children={(task) => (
436
+ <div class={pageStyles.item}>
437
+ <span>{task.title}</span>
438
+ </div>
439
+ )}
440
+ />
416
441
  </div>
417
442
  </>
418
443
  ),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertz/create-vertz-app",
3
- "version": "0.2.9",
3
+ "version": "0.2.11",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Create a new Vertz application",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=templates.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.test.d.ts","sourceRoot":"","sources":["../../../src/templates/__tests__/templates.test.ts"],"names":[],"mappings":""}
@@ -1,223 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { appComponentTemplate, bunfigTemplate, bunPluginShimTemplate, clientTemplate, dbTemplate, entryClientTemplate, envExampleTemplate, envTemplate, gitignoreTemplate, homePageTemplate, packageJsonTemplate, schemaTemplate, serverTemplate, tasksEntityTemplate, themeTemplate, tsconfigTemplate, vertzConfigTemplate, } from '../index.js';
3
- describe('templates', () => {
4
- describe('packageJsonTemplate', () => {
5
- it('returns valid JSON', () => {
6
- const result = packageJsonTemplate('test-app');
7
- expect(() => JSON.parse(result)).not.toThrow();
8
- });
9
- it('includes project name', () => {
10
- const result = packageJsonTemplate('my-app');
11
- const pkg = JSON.parse(result);
12
- expect(pkg.name).toBe('my-app');
13
- });
14
- it('includes full-stack dependencies', () => {
15
- const result = packageJsonTemplate('test-app');
16
- const pkg = JSON.parse(result);
17
- expect(pkg.dependencies['@vertz/server']).toBeDefined();
18
- expect(pkg.dependencies['@vertz/db']).toBeDefined();
19
- expect(pkg.dependencies['@vertz/ui']).toBeDefined();
20
- expect(pkg.dependencies['@vertz/theme-shadcn']).toBeDefined();
21
- });
22
- it('includes dev dependencies', () => {
23
- const result = packageJsonTemplate('test-app');
24
- const pkg = JSON.parse(result);
25
- expect(pkg.devDependencies['@vertz/cli']).toBeDefined();
26
- expect(pkg.devDependencies['@vertz/ui-compiler']).toBeDefined();
27
- expect(pkg.devDependencies['@vertz/ui-server']).toBeDefined();
28
- expect(pkg.devDependencies['bun-types']).toBeDefined();
29
- });
30
- it('includes #generated imports map', () => {
31
- const result = packageJsonTemplate('test-app');
32
- const pkg = JSON.parse(result);
33
- expect(pkg.imports['#generated']).toBe('./.vertz/generated/client.ts');
34
- expect(pkg.imports['#generated/types']).toBe('./.vertz/generated/types/index.ts');
35
- });
36
- it('includes vertz dev/build/codegen scripts', () => {
37
- const result = packageJsonTemplate('test-app');
38
- const pkg = JSON.parse(result);
39
- expect(pkg.scripts.dev).toBe('vertz dev');
40
- expect(pkg.scripts.build).toBe('vertz build');
41
- expect(pkg.scripts.codegen).toBe('vertz codegen');
42
- });
43
- });
44
- describe('tsconfigTemplate', () => {
45
- it('returns valid JSON', () => {
46
- const result = tsconfigTemplate();
47
- expect(() => JSON.parse(result)).not.toThrow();
48
- });
49
- it('has strict mode enabled', () => {
50
- const result = tsconfigTemplate();
51
- const tsconfig = JSON.parse(result);
52
- expect(tsconfig.compilerOptions.strict).toBe(true);
53
- });
54
- it('includes JSX config for @vertz/ui', () => {
55
- const result = tsconfigTemplate();
56
- const tsconfig = JSON.parse(result);
57
- expect(tsconfig.compilerOptions.jsx).toBe('react-jsx');
58
- expect(tsconfig.compilerOptions.jsxImportSource).toBe('@vertz/ui');
59
- });
60
- it('includes bun-types', () => {
61
- const result = tsconfigTemplate();
62
- const tsconfig = JSON.parse(result);
63
- expect(tsconfig.compilerOptions.types).toContain('bun-types');
64
- });
65
- });
66
- describe('vertzConfigTemplate', () => {
67
- it('exports a default config with compiler entry', () => {
68
- const result = vertzConfigTemplate();
69
- expect(result).toContain('export default');
70
- expect(result).toContain("entryFile: 'src/api/server.ts'");
71
- });
72
- it('exports codegen config', () => {
73
- const result = vertzConfigTemplate();
74
- expect(result).toContain('export const codegen');
75
- expect(result).toContain("generators: ['typescript']");
76
- });
77
- });
78
- describe('envTemplate', () => {
79
- it('contains PORT=3000', () => {
80
- expect(envTemplate()).toContain('PORT=3000');
81
- });
82
- });
83
- describe('envExampleTemplate', () => {
84
- it('contains PORT=3000', () => {
85
- expect(envExampleTemplate()).toContain('PORT=3000');
86
- });
87
- });
88
- describe('bunfigTemplate', () => {
89
- it('registers bun-plugin-shim.ts under [serve.static]', () => {
90
- const result = bunfigTemplate();
91
- expect(result).toContain('[serve.static]');
92
- expect(result).toContain('bun-plugin-shim.ts');
93
- });
94
- });
95
- describe('bunPluginShimTemplate', () => {
96
- it('imports createVertzBunPlugin from @vertz/ui-server/bun-plugin', () => {
97
- const result = bunPluginShimTemplate();
98
- expect(result).toContain("from '@vertz/ui-server/bun-plugin'");
99
- expect(result).toContain('createVertzBunPlugin');
100
- });
101
- it('exports plugin as default', () => {
102
- expect(bunPluginShimTemplate()).toContain('export default plugin');
103
- });
104
- });
105
- describe('gitignoreTemplate', () => {
106
- it('includes standard entries', () => {
107
- const result = gitignoreTemplate();
108
- expect(result).toContain('node_modules');
109
- expect(result).toContain('dist/');
110
- expect(result).toContain('.vertz/');
111
- expect(result).toContain('*.db');
112
- });
113
- });
114
- describe('serverTemplate', () => {
115
- it('uses createServer from @vertz/server', () => {
116
- const result = serverTemplate();
117
- expect(result).toContain("from '@vertz/server'");
118
- expect(result).toContain('createServer');
119
- });
120
- it('exports default app', () => {
121
- expect(serverTemplate()).toContain('export default app');
122
- });
123
- it('includes import.meta.main guard', () => {
124
- expect(serverTemplate()).toContain('import.meta.main');
125
- });
126
- });
127
- describe('schemaTemplate', () => {
128
- it('defines tasks table with d.table', () => {
129
- const result = schemaTemplate();
130
- expect(result).toContain("d.table('tasks'");
131
- expect(result).toContain('d.model(tasksTable)');
132
- });
133
- });
134
- describe('dbTemplate', () => {
135
- it('uses createSqliteAdapter', () => {
136
- const result = dbTemplate();
137
- expect(result).toContain('createSqliteAdapter');
138
- expect(result).toContain('autoApply: true');
139
- });
140
- });
141
- describe('tasksEntityTemplate', () => {
142
- it('defines tasks entity with model and access', () => {
143
- const result = tasksEntityTemplate();
144
- expect(result).toContain("entity('tasks'");
145
- expect(result).toContain('tasksModel');
146
- expect(result).toContain('list: () => true');
147
- });
148
- });
149
- describe('clientTemplate', () => {
150
- it('uses #generated imports', () => {
151
- const result = clientTemplate();
152
- expect(result).toContain("from '#generated'");
153
- expect(result).toContain("from '#generated/types'");
154
- expect(result).toContain('createClient');
155
- });
156
- });
157
- describe('appComponentTemplate', () => {
158
- it('exports getInjectedCSS for SSR', () => {
159
- expect(appComponentTemplate()).toContain('getInjectedCSS');
160
- });
161
- it('uses ThemeProvider', () => {
162
- expect(appComponentTemplate()).toContain('ThemeProvider');
163
- });
164
- it('renders HomePage', () => {
165
- expect(appComponentTemplate()).toContain('HomePage');
166
- });
167
- });
168
- describe('entryClientTemplate', () => {
169
- it('uses mount from @vertz/ui', () => {
170
- expect(entryClientTemplate()).toContain('mount');
171
- });
172
- it('includes HMR self-accept', () => {
173
- expect(entryClientTemplate()).toContain('import.meta.hot.accept()');
174
- });
175
- });
176
- describe('themeTemplate', () => {
177
- it('uses configureTheme from @vertz/theme-shadcn', () => {
178
- const result = themeTemplate();
179
- expect(result).toContain('configureTheme');
180
- expect(result).toContain("from '@vertz/theme-shadcn'");
181
- });
182
- });
183
- describe('homePageTemplate', () => {
184
- it('uses query and queryMatch', () => {
185
- const result = homePageTemplate();
186
- expect(result).toContain('query');
187
- expect(result).toContain('queryMatch');
188
- });
189
- it('uses api.tasks', () => {
190
- expect(homePageTemplate()).toContain('api.tasks');
191
- });
192
- it('exports HomePage component', () => {
193
- expect(homePageTemplate()).toContain('export function HomePage()');
194
- });
195
- });
196
- describe('all templates return non-empty strings', () => {
197
- it('every template function returns a non-empty string', () => {
198
- const templates = [
199
- () => packageJsonTemplate('test'),
200
- tsconfigTemplate,
201
- vertzConfigTemplate,
202
- envTemplate,
203
- envExampleTemplate,
204
- gitignoreTemplate,
205
- bunfigTemplate,
206
- bunPluginShimTemplate,
207
- serverTemplate,
208
- schemaTemplate,
209
- dbTemplate,
210
- tasksEntityTemplate,
211
- clientTemplate,
212
- appComponentTemplate,
213
- entryClientTemplate,
214
- themeTemplate,
215
- homePageTemplate,
216
- ];
217
- for (const template of templates) {
218
- const result = template();
219
- expect(result.length).toBeGreaterThan(0);
220
- }
221
- });
222
- });
223
- });