@svgrid/enterprise 1.2.0 → 2.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/dist/cdn/svgrid-enterprise.svelte-external.js +26039 -805
- package/dist/designer/assets/index-Dp44bTid.js +939 -0
- package/dist/designer/assets/index-RJp6x8tw.css +1 -0
- package/dist/designer/assets/jszip.min-CjMo-QGg.js +2 -0
- package/dist/designer/index.html +13 -0
- package/dist/node/studio.js +22554 -0
- package/package.json +10 -3
- package/src/SvAuthGate.svelte +115 -0
- package/src/SvBoard.dom.test.ts +67 -0
- package/src/SvBoard.svelte +192 -0
- package/src/SvExportMenu.svelte +553 -0
- package/src/SvFileInput.svelte +113 -0
- package/src/SvGridEditPanel.dom.test.ts +146 -0
- package/src/SvGridEditPanel.svelte +793 -0
- package/src/SvGridMasterDetail.svelte +95 -0
- package/src/SvImportDialog.svelte +1020 -0
- package/src/SvLookupInput.svelte +180 -0
- package/src/SvRecordDetail.dom.test.ts +137 -0
- package/src/SvRecordDetail.svelte +288 -0
- package/src/SvSchedule.dom.test.ts +57 -0
- package/src/SvSchedule.svelte +156 -0
- package/src/SvSchemaChart.svelte +233 -0
- package/src/SvSchemaDashboard.svelte +130 -0
- package/src/ai-export-pdf.test.ts +74 -0
- package/src/ai-export-xlsx.test.ts +87 -0
- package/src/ai-export.test.ts +110 -0
- package/src/ai.ts +1188 -782
- package/src/edit-panel.test.ts +213 -0
- package/src/edit-panel.ts +228 -0
- package/src/export-conditional.test.ts +60 -0
- package/src/export-conditional.ts +94 -0
- package/src/export-ooxml.test.ts +152 -0
- package/src/export-ooxml.ts +485 -0
- package/src/export-pdf.test.ts +138 -0
- package/src/export-pdf.ts +245 -0
- package/src/export-print.test.ts +66 -0
- package/src/export-print.ts +132 -0
- package/src/export-serialize.test.ts +56 -0
- package/src/export-serialize.ts +24 -0
- package/src/export-xls.ts +196 -0
- package/src/export-xlsx-roundtrip.test.ts +120 -0
- package/src/export-xlsx.test.ts +150 -0
- package/src/export.test.ts +349 -0
- package/src/export.ts +1452 -549
- package/src/import-automap.test.ts +131 -0
- package/src/import-hardening.test.ts +158 -0
- package/src/import.ts +1042 -648
- package/src/index.ts +282 -0
- package/src/install.ts +134 -114
- package/src/license-core.test.ts +23 -0
- package/src/license-core.ts +35 -0
- package/src/license.ts +103 -90
- package/src/master-detail.test.ts +61 -0
- package/src/master-detail.ts +42 -0
- package/src/print.ts +107 -127
- package/src/schema-designer.test.ts +121 -0
- package/src/schema-designer.ts +142 -0
- package/src/schema.test.ts +268 -0
- package/src/schema.ts +499 -0
- package/src/smart-shim.ts +107 -105
- package/src/sources/aggregate.test.ts +79 -0
- package/src/sources/aggregate.ts +102 -0
- package/src/sources/auth-supabase.test.ts +80 -0
- package/src/sources/auth-supabase.ts +87 -0
- package/src/sources/dashboard.kpi.test.ts +50 -0
- package/src/sources/dashboard.test.ts +61 -0
- package/src/sources/dashboard.ts +136 -0
- package/src/sources/field-inference.test.ts +60 -0
- package/src/sources/field-inference.ts +63 -0
- package/src/sources/filters.test.ts +58 -0
- package/src/sources/filters.ts +64 -0
- package/src/sources/index.ts +67 -0
- package/src/sources/introspect-supabase.test.ts +100 -0
- package/src/sources/introspect-supabase.ts +119 -0
- package/src/sources/realtime-supabase.test.ts +93 -0
- package/src/sources/realtime-supabase.ts +99 -0
- package/src/sources/relation-lookup.test.ts +99 -0
- package/src/sources/relation-lookup.ts +128 -0
- package/src/sources/rest-adapters.test.ts +95 -0
- package/src/sources/rest-adapters.ts +120 -0
- package/src/sources/rest.test.ts +104 -0
- package/src/sources/rest.ts +129 -0
- package/src/sources/schema-from-columns.test.ts +106 -0
- package/src/sources/schema-from-columns.ts +88 -0
- package/src/sources/supabase.test.ts +110 -0
- package/src/sources/supabase.ts +99 -0
- package/src/sources/with-entity-rules.test.ts +104 -0
- package/src/sources/with-entity-rules.ts +78 -0
- package/src/sources/with-relation-labels.test.ts +75 -0
- package/src/sources/with-relation-labels.ts +73 -0
- package/src/studio/bug-report.test.ts +101 -0
- package/src/studio/bug-report.ts +165 -0
- package/src/studio/cli.test.ts +187 -0
- package/src/studio/cli.ts +112 -0
- package/src/studio/csv.test.ts +90 -0
- package/src/studio/csv.ts +165 -0
- package/src/studio/db-connect-string.test.ts +94 -0
- package/src/studio/db-connect-string.ts +128 -0
- package/src/studio/emit-project.test.ts +923 -0
- package/src/studio/emit-project.ts +1273 -0
- package/src/studio/emit-schema.test.ts +94 -0
- package/src/studio/emit-schema.ts +920 -0
- package/src/studio/index.ts +195 -0
- package/src/studio/introspect-db.test.ts +186 -0
- package/src/studio/introspect-db.ts +312 -0
- package/src/studio/introspect-prisma.test.ts +99 -0
- package/src/studio/introspect-prisma.ts +175 -0
- package/src/studio/introspect.test.ts +172 -0
- package/src/studio/introspect.ts +310 -0
- package/src/studio/pipeline.test.ts +42 -0
- package/src/studio/project-robust.test.ts +157 -0
- package/src/studio/project.test.ts +473 -0
- package/src/studio/project.ts +916 -0
- package/src/studio/sample-data.test.ts +58 -0
- package/src/studio/sample-data.ts +200 -0
- package/src/studio/samples/ats.ts +202 -0
- package/src/studio/samples/clinic.ts +177 -0
- package/src/studio/samples/crm.ts +250 -0
- package/src/studio/samples/ecommerce.ts +187 -0
- package/src/studio/samples/events.ts +199 -0
- package/src/studio/samples/fleet.ts +184 -0
- package/src/studio/samples/gym.ts +213 -0
- package/src/studio/samples/hr.ts +193 -0
- package/src/studio/samples/index.ts +55 -0
- package/src/studio/samples/insurance.ts +195 -0
- package/src/studio/samples/inventory.ts +182 -0
- package/src/studio/samples/invoicing.ts +162 -0
- package/src/studio/samples/library.ts +180 -0
- package/src/studio/samples/live-data.test.ts +98 -0
- package/src/studio/samples/live-data.ts +308 -0
- package/src/studio/samples/projects.ts +190 -0
- package/src/studio/samples/realestate.ts +196 -0
- package/src/studio/samples/restaurant.ts +187 -0
- package/src/studio/samples/samples.test.ts +208 -0
- package/src/studio/samples/school.ts +197 -0
- package/src/studio/samples/seed-floor.test.ts +25 -0
- package/src/studio/samples/shared.ts +305 -0
- package/src/studio/samples/subscriptions.ts +183 -0
- package/src/studio/samples/support.ts +182 -0
- package/src/studio/scaffold-app.test.ts +91 -0
- package/src/studio/scaffold-app.ts +161 -0
- package/src/studio/scaffold.test.ts +178 -0
- package/src/studio/scaffold.ts +374 -0
- package/src/studio/themes.ts +172 -0
- package/src/studio/verify.test.ts +47 -0
- package/src/studio/verify.ts +79 -0
- package/src/sveltekit/in-memory.test.ts +104 -0
- package/src/sveltekit/in-memory.ts +129 -0
- package/src/sveltekit/index.ts +23 -0
- package/src/sveltekit/query-plan.test.ts +109 -0
- package/src/sveltekit/query-plan.ts +125 -0
- package/src/sveltekit/sql-source.test.ts +185 -0
- package/src/sveltekit/sql-source.ts +166 -0
- package/src/sveltekit/sql.test.ts +80 -0
- package/src/sveltekit/sql.ts +131 -0
- package/src/sveltekit/transport.test.ts +175 -0
- package/src/sveltekit/transport.ts +254 -0
- package/src/sveltekit/types.ts +11 -0
- package/src/upgrade-prompt.ts +149 -148
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { compile } from 'svelte/compiler'
|
|
3
|
+
import type { EntitySchema } from '../schema'
|
|
4
|
+
import { emitStudioApp } from './emit-schema'
|
|
5
|
+
|
|
6
|
+
const schemas: EntitySchema[] = [
|
|
7
|
+
{
|
|
8
|
+
name: 'users',
|
|
9
|
+
label: 'User',
|
|
10
|
+
idField: 'id',
|
|
11
|
+
fields: [
|
|
12
|
+
{ field: 'id', type: 'number', primaryKey: true, readonly: true },
|
|
13
|
+
{ field: 'name', type: 'text', required: true },
|
|
14
|
+
{ field: 'active', type: 'boolean' },
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: 'posts',
|
|
19
|
+
label: 'Post',
|
|
20
|
+
idField: 'id',
|
|
21
|
+
fields: [
|
|
22
|
+
{ field: 'id', type: 'number', primaryKey: true, readonly: true },
|
|
23
|
+
{ field: 'title', type: 'text', required: true },
|
|
24
|
+
{ field: 'authorId', type: 'relation', relation: { entity: 'users', foreignKey: 'authorId', labelField: 'name' } },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
describe('emitStudioApp', () => {
|
|
30
|
+
const files = emitStudioApp(schemas)
|
|
31
|
+
const byPath = (p: string) => files.find((f) => f.path === p)
|
|
32
|
+
|
|
33
|
+
it('emits schemas, data, a route per entity, and the shell', () => {
|
|
34
|
+
const paths = files.map((f) => f.path)
|
|
35
|
+
expect(paths).toEqual(
|
|
36
|
+
expect.arrayContaining([
|
|
37
|
+
'src/lib/schemas.ts',
|
|
38
|
+
'src/lib/data.ts',
|
|
39
|
+
'src/routes/users/+page.svelte',
|
|
40
|
+
'src/routes/posts/+page.svelte',
|
|
41
|
+
'src/routes/+layout.svelte',
|
|
42
|
+
'src/routes/+page.svelte',
|
|
43
|
+
]),
|
|
44
|
+
)
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it('generates a row type + schema const per entity, incl. a relation display column', () => {
|
|
48
|
+
const schemasTs = byPath('src/lib/schemas.ts')!.contents
|
|
49
|
+
expect(schemasTs).toContain('export type Users = {')
|
|
50
|
+
expect(schemasTs).toContain('export const usersSchema: EntitySchema<Users>')
|
|
51
|
+
expect(schemasTs).toContain('export const postsSchema: EntitySchema<Posts>')
|
|
52
|
+
// posts.authorId FK is hidden from the grid; an `author` display column is added.
|
|
53
|
+
expect(schemasTs).toContain('author?: string') // row type gains the (optional) display field
|
|
54
|
+
expect(schemasTs).toMatch(/"field":\s*"author"/) // schema gains the display column
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('wires base stores, a lookup per relation, and label-decorated exported sources', () => {
|
|
58
|
+
const dataTs = byPath('src/lib/data.ts')!.contents
|
|
59
|
+
expect(dataTs).toContain('const usersStore = createInMemoryDataSource<Users>(')
|
|
60
|
+
expect(dataTs).toContain('export const usersSource = usersStore') // no relations -> passthrough
|
|
61
|
+
// posts.authorId -> a lookup over the users store + label decoration
|
|
62
|
+
expect(dataTs).toContain('postsAuthorIdLookup')
|
|
63
|
+
expect(dataTs).toContain('source: usersStore')
|
|
64
|
+
expect(dataTs).toContain("withRelationLabels(postsStore, [{ fk: 'authorId', lookup: postsAuthorIdLookup, as: 'author' }])")
|
|
65
|
+
expect(dataTs).toContain('withRelationLabels') // imported
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it('seeds each store with sample rows (valid ids + FK references) and advances nextId past them', () => {
|
|
69
|
+
const dataTs = byPath('src/lib/data.ts')!.contents
|
|
70
|
+
expect(dataTs).toContain('"id":"u1"') // seeded string id
|
|
71
|
+
expect(dataTs).toMatch(/"name":"Ada \w+"/) // realistic full name (not "name 1")
|
|
72
|
+
expect(dataTs).toMatch(/"authorId":"u[1-6]"/) // FK references a seeded user id
|
|
73
|
+
expect(dataTs).toContain('let seq = 6') // nextId continues after the 6 seeded rows
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it('marks relation display columns optional in the row type', () => {
|
|
77
|
+
expect(byPath('src/lib/schemas.ts')!.contents).toContain('author?: string')
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it('passes lookups to EntityScreen only for entities with relations', () => {
|
|
81
|
+
expect(byPath('src/routes/posts/+page.svelte')!.contents).toContain('lookups={{ authorId: postsAuthorIdLookup }}')
|
|
82
|
+
expect(byPath('src/routes/users/+page.svelte')!.contents).not.toContain('lookups=')
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
it('every emitted .svelte file compiles', () => {
|
|
86
|
+
for (const f of files.filter((f) => f.path.endsWith('.svelte'))) {
|
|
87
|
+
expect(() => compile(f.contents, { filename: f.path, generate: 'client' }), f.path).not.toThrow()
|
|
88
|
+
}
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('throws on an empty entity set', () => {
|
|
92
|
+
expect(() => emitStudioApp([])).toThrow(/no schemas/)
|
|
93
|
+
})
|
|
94
|
+
})
|