@aphexcms/cms-core 0.1.16 → 0.2.1
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/api/client.d.ts.map +1 -1
- package/dist/api/client.js +7 -1
- package/dist/api/types.d.ts +2 -0
- package/dist/api/types.d.ts.map +1 -1
- package/dist/cli/generate-types.js +62 -17
- package/dist/cli/index.js +1 -1
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +0 -1
- package/dist/components/AdminApp.svelte +278 -45
- package/dist/components/AdminApp.svelte.d.ts +2 -0
- package/dist/components/AdminApp.svelte.d.ts.map +1 -1
- package/dist/components/admin/DocumentEditor.svelte +60 -13
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -1
- package/dist/components/admin/ObjectModal.svelte +15 -4
- package/dist/components/admin/ObjectModal.svelte.d.ts +1 -0
- package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -1
- package/dist/components/admin/SchemaField.svelte +64 -5
- package/dist/components/admin/SchemaField.svelte.d.ts +1 -0
- package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ArrayField.svelte +402 -111
- package/dist/components/admin/fields/ArrayField.svelte.d.ts +1 -0
- package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/DateField.svelte +145 -0
- package/dist/components/admin/fields/DateField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/DateField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/DateTimeField.svelte +225 -0
- package/dist/components/admin/fields/DateTimeField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/DateTimeField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/ImageField.svelte +221 -110
- package/dist/components/admin/fields/ImageField.svelte.d.ts +2 -0
- package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/ReferenceField.svelte +1 -1
- package/dist/components/admin/fields/SlugField.svelte +21 -13
- package/dist/components/admin/fields/SlugField.svelte.d.ts +2 -2
- package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/StringField.svelte +156 -12
- package/dist/components/admin/fields/StringField.svelte.d.ts +3 -2
- package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -1
- package/dist/components/admin/fields/URLField.svelte +41 -0
- package/dist/components/admin/fields/URLField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/URLField.svelte.d.ts.map +1 -0
- package/dist/components/index.d.ts +0 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +0 -1
- package/dist/db/interfaces/asset.d.ts.map +1 -1
- package/dist/db/interfaces/document.d.ts +0 -2
- package/dist/db/interfaces/document.d.ts.map +1 -1
- package/dist/db/interfaces/index.d.ts +2 -1
- package/dist/db/interfaces/index.d.ts.map +1 -1
- package/dist/db/interfaces/user.d.ts +2 -0
- package/dist/db/interfaces/user.d.ts.map +1 -1
- package/dist/db/utils/reference-resolver.js +1 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +3 -0
- package/dist/field-validation/date-utils.d.ts +30 -0
- package/dist/field-validation/date-utils.d.ts.map +1 -0
- package/dist/field-validation/date-utils.js +147 -0
- package/dist/field-validation/rule.d.ts +4 -0
- package/dist/field-validation/rule.d.ts.map +1 -1
- package/dist/field-validation/rule.js +170 -4
- package/dist/field-validation/utils.d.ts +7 -3
- package/dist/field-validation/utils.d.ts.map +1 -1
- package/dist/field-validation/utils.js +130 -38
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +38 -21
- package/dist/lib/field-validation/date-utils.js +147 -0
- package/dist/lib/field-validation/rule.js +170 -4
- package/dist/lib/field-validation/utils.js +130 -38
- package/dist/local-api/collection-api.d.ts +16 -4
- package/dist/local-api/collection-api.d.ts.map +1 -1
- package/dist/local-api/collection-api.js +51 -17
- package/dist/local-api/index.d.ts +1 -1
- package/dist/local-api/index.d.ts.map +1 -1
- package/dist/routes/assets-cdn.d.ts.map +1 -1
- package/dist/routes/assets-cdn.js +14 -7
- package/dist/routes/assets.d.ts.map +1 -1
- package/dist/routes/assets.js +6 -1
- package/dist/routes/documents-by-id.d.ts.map +1 -1
- package/dist/routes/documents-by-id.js +18 -7
- package/dist/routes/documents-publish.js +2 -2
- package/dist/routes/documents-query.d.ts +3 -1
- package/dist/routes/documents-query.d.ts.map +1 -1
- package/dist/routes/documents-query.js +6 -2
- package/dist/routes/documents.d.ts.map +1 -1
- package/dist/routes/documents.js +20 -4
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +2 -0
- package/dist/routes/user-preferences.d.ts +4 -0
- package/dist/routes/user-preferences.d.ts.map +1 -0
- package/dist/routes/user-preferences.js +77 -0
- package/dist/schema-utils/utils.d.ts +4 -0
- package/dist/schema-utils/utils.d.ts.map +1 -1
- package/dist/schema-utils/utils.js +23 -2
- package/dist/schema-utils/validator.d.ts +4 -0
- package/dist/schema-utils/validator.d.ts.map +1 -1
- package/dist/schema-utils/validator.js +120 -0
- package/dist/types/filters.d.ts +13 -0
- package/dist/types/filters.d.ts.map +1 -1
- package/dist/types/organization.d.ts +3 -0
- package/dist/types/organization.d.ts.map +1 -1
- package/dist/types/schemas.d.ts +67 -7
- package/dist/types/schemas.d.ts.map +1 -1
- package/dist/utils/default-orderings.d.ts +10 -0
- package/dist/utils/default-orderings.d.ts.map +1 -0
- package/dist/utils/default-orderings.js +63 -0
- package/dist/utils/field-defaults.d.ts +8 -0
- package/dist/utils/field-defaults.d.ts.map +1 -0
- package/dist/utils/field-defaults.js +20 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/initial-value-helpers.d.ts +50 -0
- package/dist/utils/initial-value-helpers.d.ts.map +1 -0
- package/dist/utils/initial-value-helpers.js +70 -0
- package/package.json +6 -4
- package/dist/components/admin/DocumentTypesList.svelte +0 -97
- package/dist/components/admin/DocumentTypesList.svelte.d.ts +0 -14
- package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +0 -1
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { Input } from '@aphexcms/ui/shadcn/input';
|
|
3
|
-
import
|
|
3
|
+
import * as Select from '@aphexcms/ui/shadcn/select';
|
|
4
|
+
import * as RadioGroup from '@aphexcms/ui/shadcn/radio-group';
|
|
5
|
+
import { Label } from '@aphexcms/ui/shadcn/label';
|
|
6
|
+
import type { StringField, DependentList } from '../../../types/schemas';
|
|
4
7
|
|
|
5
8
|
interface Props {
|
|
6
|
-
field:
|
|
9
|
+
field: StringField;
|
|
7
10
|
value: any;
|
|
11
|
+
documentData?: Record<string, any>;
|
|
8
12
|
onUpdate: (value: any) => void;
|
|
9
13
|
validationClasses?: string;
|
|
10
14
|
onBlur?: (event: any) => void;
|
|
@@ -15,6 +19,7 @@
|
|
|
15
19
|
let {
|
|
16
20
|
field,
|
|
17
21
|
value,
|
|
22
|
+
documentData,
|
|
18
23
|
onUpdate,
|
|
19
24
|
validationClasses,
|
|
20
25
|
onBlur,
|
|
@@ -22,19 +27,158 @@
|
|
|
22
27
|
readonly = false
|
|
23
28
|
}: Props = $props();
|
|
24
29
|
|
|
30
|
+
// Check if list is a dependent list
|
|
31
|
+
function isDependentList(list: any): list is DependentList {
|
|
32
|
+
return list && typeof list === 'object' && 'dependsOn' in list && 'options' in list;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Resolve the actual list items (either static or dependent)
|
|
36
|
+
const resolvedList = $derived(() => {
|
|
37
|
+
if (!field.list) return [];
|
|
38
|
+
|
|
39
|
+
if (Array.isArray(field.list)) {
|
|
40
|
+
// Static list
|
|
41
|
+
return field.list;
|
|
42
|
+
} else if (isDependentList(field.list)) {
|
|
43
|
+
// Dependent list - get options based on dependsOn field value
|
|
44
|
+
const dependentValue = documentData?.[field.list.dependsOn];
|
|
45
|
+
if (!dependentValue) return [];
|
|
46
|
+
return field.list.options[dependentValue] || [];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return [];
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Check if this is a dependent field that's missing its dependency
|
|
53
|
+
const isDependentFieldWithoutValue = $derived(() => {
|
|
54
|
+
if (!field.list) return false;
|
|
55
|
+
if (Array.isArray(field.list)) return false;
|
|
56
|
+
if (isDependentList(field.list)) {
|
|
57
|
+
const dependentValue = documentData?.[field.list.dependsOn];
|
|
58
|
+
return !dependentValue;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Get the name of the field this depends on (for display)
|
|
64
|
+
const dependsOnFieldName = $derived(() => {
|
|
65
|
+
if (field.list && isDependentList(field.list)) {
|
|
66
|
+
return field.list.dependsOn;
|
|
67
|
+
}
|
|
68
|
+
return '';
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Normalize list items to { title, value } format
|
|
72
|
+
const listItems = $derived(
|
|
73
|
+
resolvedList().map((item) =>
|
|
74
|
+
typeof item === 'string' ? { title: item.toUpperCase(), value: item } : item
|
|
75
|
+
)
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
const layout = $derived(field.options?.layout || 'dropdown');
|
|
79
|
+
const direction = $derived(field.options?.direction || 'vertical');
|
|
80
|
+
|
|
81
|
+
// For Select component - derive trigger content
|
|
82
|
+
const selectedItem = $derived(listItems.find((item) => item.value === value));
|
|
83
|
+
const triggerContent = $derived(selectedItem?.title ?? field.placeholder ?? field.title);
|
|
84
|
+
|
|
25
85
|
function handleInputChange(event: Event) {
|
|
26
86
|
const target = event.target as HTMLInputElement;
|
|
27
87
|
onUpdate(target.value);
|
|
28
88
|
}
|
|
89
|
+
|
|
90
|
+
function handleSelectChange(newValue: string | undefined) {
|
|
91
|
+
if (newValue !== undefined) {
|
|
92
|
+
onUpdate(newValue);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Check if we should show list UI (dropdown or radio)
|
|
97
|
+
const hasListOptions = $derived(listItems.length > 0);
|
|
98
|
+
|
|
99
|
+
// Auto-reset dependent field value when parent changes and current value is invalid
|
|
100
|
+
$effect(() => {
|
|
101
|
+
// Only for dependent fields with options
|
|
102
|
+
if (!field.list || !isDependentList(field.list)) return;
|
|
103
|
+
|
|
104
|
+
const items = listItems; // Track listItems changes
|
|
105
|
+
|
|
106
|
+
// If we have a value and options, check if value is valid
|
|
107
|
+
if (value && items.length > 0) {
|
|
108
|
+
const isValid = items.some((item) => item.value === value);
|
|
109
|
+
|
|
110
|
+
if (!isValid) {
|
|
111
|
+
// Current value not in new options - reset to first option
|
|
112
|
+
const newValue = items[0]?.value || '';
|
|
113
|
+
|
|
114
|
+
console.log(`🔄 Dependent field "${field.name}" reset: "${value}" → "${newValue}"`);
|
|
115
|
+
onUpdate(newValue);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
});
|
|
29
119
|
</script>
|
|
30
120
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
121
|
+
{#if isDependentFieldWithoutValue()}
|
|
122
|
+
<!-- Show message when dependent field hasn't been selected -->
|
|
123
|
+
<div class="border-muted-foreground/30 bg-muted/30 rounded-md border border-dashed p-4">
|
|
124
|
+
<p class="text-muted-foreground text-sm">
|
|
125
|
+
Please select <span class="font-medium">{dependsOnFieldName()}</span> first
|
|
126
|
+
</p>
|
|
127
|
+
</div>
|
|
128
|
+
{:else if hasListOptions}
|
|
129
|
+
{#if layout === 'radio'}
|
|
130
|
+
<!-- Radio Button Layout -->
|
|
131
|
+
<RadioGroup.Root
|
|
132
|
+
value={value || ''}
|
|
133
|
+
onValueChange={handleSelectChange}
|
|
134
|
+
disabled={readonly}
|
|
135
|
+
class={validationClasses}
|
|
136
|
+
>
|
|
137
|
+
<div class={direction === 'horizontal' ? 'flex flex-wrap gap-4' : 'space-y-2'}>
|
|
138
|
+
{#each listItems as item, index (item.value)}
|
|
139
|
+
<div class="flex items-center space-x-2">
|
|
140
|
+
<RadioGroup.Item value={item.value} id={`${field.name}-${index}`} />
|
|
141
|
+
<Label for={`${field.name}-${index}`}>{item.title}</Label>
|
|
142
|
+
</div>
|
|
143
|
+
{/each}
|
|
144
|
+
</div>
|
|
145
|
+
</RadioGroup.Root>
|
|
146
|
+
{:else}
|
|
147
|
+
<!-- Dropdown/Select Layout -->
|
|
148
|
+
<Select.Root
|
|
149
|
+
type="single"
|
|
150
|
+
name={field.name}
|
|
151
|
+
value={value || ''}
|
|
152
|
+
onValueChange={handleSelectChange}
|
|
153
|
+
disabled={readonly}
|
|
154
|
+
>
|
|
155
|
+
<Select.Trigger class="w-full {validationClasses}">
|
|
156
|
+
{triggerContent}
|
|
157
|
+
</Select.Trigger>
|
|
158
|
+
<Select.Content>
|
|
159
|
+
<Select.Group>
|
|
160
|
+
{#if field.title}
|
|
161
|
+
<Select.Label>{field.title}</Select.Label>
|
|
162
|
+
{/if}
|
|
163
|
+
{#each listItems as item (item.value)}
|
|
164
|
+
<Select.Item value={item.value} label={item.title}>
|
|
165
|
+
{item.title}
|
|
166
|
+
</Select.Item>
|
|
167
|
+
{/each}
|
|
168
|
+
</Select.Group>
|
|
169
|
+
</Select.Content>
|
|
170
|
+
</Select.Root>
|
|
171
|
+
{/if}
|
|
172
|
+
{:else}
|
|
173
|
+
<!-- Regular Input -->
|
|
174
|
+
<Input
|
|
175
|
+
id={field.name}
|
|
176
|
+
value={value || ''}
|
|
177
|
+
placeholder={field.placeholder || field.title}
|
|
178
|
+
oninput={handleInputChange}
|
|
179
|
+
onblur={onBlur}
|
|
180
|
+
onfocus={onFocus}
|
|
181
|
+
class={validationClasses}
|
|
182
|
+
disabled={readonly}
|
|
183
|
+
/>
|
|
184
|
+
{/if}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { StringField } from '../../../types/schemas.js';
|
|
2
2
|
interface Props {
|
|
3
|
-
field:
|
|
3
|
+
field: StringField;
|
|
4
4
|
value: any;
|
|
5
|
+
documentData?: Record<string, any>;
|
|
5
6
|
onUpdate: (value: any) => void;
|
|
6
7
|
validationClasses?: string;
|
|
7
8
|
onBlur?: (event: any) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StringField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/StringField.svelte.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StringField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/StringField.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,wBAAwB,CAAC;AAGxE,UAAU,KAAK;IACd,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,GAAG,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA8JF,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Input } from '@aphexcms/ui/shadcn/input';
|
|
3
|
+
import type { URLField } from '../../../types/schemas';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
field: URLField;
|
|
7
|
+
value: any;
|
|
8
|
+
onUpdate: (value: any) => void;
|
|
9
|
+
validationClasses?: string;
|
|
10
|
+
onBlur?: (event: any) => void;
|
|
11
|
+
onFocus?: (event: any) => void;
|
|
12
|
+
readonly?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
field,
|
|
17
|
+
value,
|
|
18
|
+
onUpdate,
|
|
19
|
+
validationClasses,
|
|
20
|
+
onBlur,
|
|
21
|
+
onFocus,
|
|
22
|
+
readonly = false
|
|
23
|
+
}: Props = $props();
|
|
24
|
+
|
|
25
|
+
function handleInputChange(event: Event) {
|
|
26
|
+
const target = event.target as HTMLInputElement;
|
|
27
|
+
onUpdate(target.value);
|
|
28
|
+
}
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<Input
|
|
32
|
+
id={field.name}
|
|
33
|
+
type="url"
|
|
34
|
+
value={value || ''}
|
|
35
|
+
placeholder={field.placeholder || 'https://example.com'}
|
|
36
|
+
oninput={handleInputChange}
|
|
37
|
+
onblur={onBlur}
|
|
38
|
+
onfocus={onFocus}
|
|
39
|
+
class={validationClasses}
|
|
40
|
+
disabled={readonly}
|
|
41
|
+
/>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { URLField } from '../../../types/schemas.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: URLField;
|
|
4
|
+
value: any;
|
|
5
|
+
onUpdate: (value: any) => void;
|
|
6
|
+
validationClasses?: string;
|
|
7
|
+
onBlur?: (event: any) => void;
|
|
8
|
+
onFocus?: (event: any) => void;
|
|
9
|
+
readonly?: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare const URLField: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type URLField = ReturnType<typeof URLField>;
|
|
13
|
+
export default URLField;
|
|
14
|
+
//# sourceMappingURL=URLField.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"URLField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/URLField.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAGtD,UAAU,KAAK;IACd,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA0BF,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export { default as AdminApp } from './AdminApp.svelte';
|
|
2
2
|
export { default as Sidebar } from './layout/Sidebar.svelte';
|
|
3
3
|
export { default as DocumentEditor } from './admin/DocumentEditor.svelte';
|
|
4
|
-
export { default as DocumentTypesList } from './admin/DocumentTypesList.svelte';
|
|
5
4
|
export { default as SchemaField } from './admin/SchemaField.svelte';
|
|
6
5
|
export * from './fields/index.js';
|
|
7
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/components/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/components/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGpE,cAAc,gBAAgB,CAAC"}
|
package/dist/components/index.js
CHANGED
|
@@ -6,7 +6,6 @@ export { default as AdminApp } from './AdminApp.svelte';
|
|
|
6
6
|
export { default as Sidebar } from './layout/Sidebar.svelte';
|
|
7
7
|
// Admin components (will be migrated from your current structure)
|
|
8
8
|
export { default as DocumentEditor } from './admin/DocumentEditor.svelte';
|
|
9
|
-
export { default as DocumentTypesList } from './admin/DocumentTypesList.svelte';
|
|
10
9
|
export { default as SchemaField } from './admin/SchemaField.svelte';
|
|
11
10
|
// Field components
|
|
12
11
|
export * from './fields/index.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/asset.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,YAAY;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAE5B,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACzE,UAAU,CACT,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,GAC5C,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACpB,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC9F,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGlE,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAG5D;;;;;OAKG;IACH,sBAAsB,
|
|
1
|
+
{"version":3,"file":"asset.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/asset.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,8 +24,6 @@ export interface UpdateDocumentData {
|
|
|
24
24
|
* Document adapter interface for document-specific operations
|
|
25
25
|
*/
|
|
26
26
|
export interface DocumentAdapter {
|
|
27
|
-
findManyDoc(organizationId: string, filters?: Omit<DocumentFilters, 'organizationId'>): Promise<Document[]>;
|
|
28
|
-
findByDocId(organizationId: string, id: string, depth?: number): Promise<Document | null>;
|
|
29
27
|
createDocument(data: CreateDocumentData): Promise<Document>;
|
|
30
28
|
updateDocDraft(organizationId: string, id: string, data: any, updatedBy?: string): Promise<Document | null>;
|
|
31
29
|
deleteDocById(organizationId: string, id: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/document.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAE/B,
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/document.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,GAAG,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAE/B,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC5D,cAAc,CACb,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,GAAG,EACT,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC5B,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAGpE,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACzE,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAG3E,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAG5E;;;;;;OAMG;IACH,mBAAmB,CAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEjC;;;;;;OAMG;IACH,mBAAmB,CAClB,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE5B;;;;;;OAMG;IACH,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC/F"}
|
|
@@ -20,6 +20,7 @@ export interface DatabaseAdapter extends DocumentAdapter, AssetAdapter, UserProf
|
|
|
20
20
|
* Initialize RLS (enable/disable) on tables - call after migrations
|
|
21
21
|
*/
|
|
22
22
|
initializeRLS?(): Promise<void>;
|
|
23
|
+
hierarchyEnabled: boolean;
|
|
23
24
|
/**
|
|
24
25
|
* Execute a function within a transaction with organization context set for RLS
|
|
25
26
|
* Ensures proper isolation with connection pooling
|
|
@@ -28,7 +29,7 @@ export interface DatabaseAdapter extends DocumentAdapter, AssetAdapter, UserProf
|
|
|
28
29
|
/**
|
|
29
30
|
* Get all child organizations for a parent (for hierarchy support)
|
|
30
31
|
*/
|
|
31
|
-
getChildOrganizations
|
|
32
|
+
getChildOrganizations(parentOrganizationId: string): Promise<string[]>;
|
|
32
33
|
/**
|
|
33
34
|
* Check if any user profiles exist in the system (for first-user detection)
|
|
34
35
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,YAAY,EACX,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC9E,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,eAChB,SAAQ,eAAe,EACtB,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,mBAAmB;IAEpB,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAG7B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAG9B;;OAEG;IACH,aAAa,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,YAAY,EACX,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC9E,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AACrE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,eAChB,SAAQ,eAAe,EACtB,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,mBAAmB;IAEpB,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAG7B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAG9B;;OAEG;IACH,aAAa,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,gBAAgB,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAE7E;;OAEG;IACH,qBAAqB,CAAC,oBAAoB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEvE;;OAEG;IACH,kBAAkB,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,IAAI,eAAe,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,OAAO,CAAC,EAAE;QACT,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,QAAQ,IAAI,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA6B,SAAQ,eAAe;IACpE,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjD,eAAe,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC7E"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { UserProfile } from '../../types/index.js';
|
|
2
|
+
import type { UserSessionPreferences } from '../../types/organization.js';
|
|
2
3
|
export interface NewUserProfileData {
|
|
3
4
|
userId: string;
|
|
4
5
|
role?: 'super_admin' | 'admin' | 'editor' | 'viewer';
|
|
@@ -11,5 +12,6 @@ export interface UserProfileAdapter {
|
|
|
11
12
|
createUserProfile(data: NewUserProfileData): Promise<UserProfile>;
|
|
12
13
|
findUserProfileById(userId: string): Promise<UserProfile | null>;
|
|
13
14
|
deleteUserProfile(userId: string): Promise<boolean>;
|
|
15
|
+
updateUserPreferences(userId: string, preferences: Partial<UserSessionPreferences>): Promise<void>;
|
|
14
16
|
}
|
|
15
17
|
//# sourceMappingURL=user.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/lib/db/interfaces/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAClE,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACjE,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,qBAAqB,CACpB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAAC;CACjB"}
|
|
@@ -52,7 +52,7 @@ async function resolveDataReferences(data, adapter, organizationId, options) {
|
|
|
52
52
|
if (typeof value === 'string' && key !== '_type' && key !== '_key') {
|
|
53
53
|
// Try to fetch the referenced document
|
|
54
54
|
try {
|
|
55
|
-
const referencedDoc = await adapter.
|
|
55
|
+
const referencedDoc = await adapter.findByDocIdAdvanced(organizationId, value);
|
|
56
56
|
if (referencedDoc) {
|
|
57
57
|
// Recursively resolve nested references
|
|
58
58
|
resolved[key] = await resolveReferences(referencedDoc, adapter, organizationId, options);
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/lib/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/lib/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,qBAAa,SAAS;IACrB,OAAO,CAAC,EAAE,CAAkB;IACrB,MAAM,EAAE,SAAS,CAAC;gBAEb,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe;IAMzD,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAUlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B3B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIvD,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAI1C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAI9C,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAI1F,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAG9F;AAKD,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,GAAG,SAAS,CAKlF;AAED,wBAAgB,MAAM,IAAI,SAAS,CAKlC"}
|
package/dist/engine.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { validateSchemaReferences } from './schema-utils/validator.js';
|
|
1
2
|
export class CMSEngine {
|
|
2
3
|
db;
|
|
3
4
|
config;
|
|
@@ -17,6 +18,8 @@ export class CMSEngine {
|
|
|
17
18
|
// Initialize CMS - register schema types in database
|
|
18
19
|
async initialize() {
|
|
19
20
|
console.log('🚀 Initializing CMS...');
|
|
21
|
+
// Validate schemas before syncing to database
|
|
22
|
+
validateSchemaReferences(this.config.schemaTypes);
|
|
20
23
|
// Get existing schemas from database
|
|
21
24
|
const existingSchemas = await this.db.listSchemas();
|
|
22
25
|
const existingNames = new Set(existingSchemas.map((s) => s.name));
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SchemaType } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Convert a date value to user format for validation
|
|
4
|
+
* Handles both ISO format and user format inputs
|
|
5
|
+
*/
|
|
6
|
+
export declare function convertDateToUserFormat(value: string, userFormat: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Convert a date value to ISO format for storage
|
|
9
|
+
* Returns ISO if already valid, or original value if invalid
|
|
10
|
+
*/
|
|
11
|
+
export declare function convertDateToISO(value: string, userFormat: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Convert a datetime value to user format for validation
|
|
14
|
+
* Handles both ISO datetime and user format inputs
|
|
15
|
+
*/
|
|
16
|
+
export declare function convertDateTimeToUserFormat(value: string, dateFormat: string, timeFormat?: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Convert a datetime value to ISO UTC format for storage
|
|
19
|
+
* Returns ISO UTC if already valid, or original value if invalid
|
|
20
|
+
*/
|
|
21
|
+
export declare function convertDateTimeToISO(value: string, dateFormat: string, timeFormat?: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Normalize date fields in data object
|
|
24
|
+
* Converts dates to ISO for storage and creates a parallel object with user-formatted dates for validation
|
|
25
|
+
*/
|
|
26
|
+
export declare function normalizeDateFields(data: Record<string, any>, schema: SchemaType): {
|
|
27
|
+
normalizedData: Record<string, any>;
|
|
28
|
+
dataForValidation: Record<string, any>;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=date-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-utils.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/date-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA4B,MAAM,gBAAgB,CAAC;AAQ3E;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAiBjF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAiB1E;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAC1C,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAgB,GAC1B,MAAM,CAmBR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAgB,GAC1B,MAAM,CA0BR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAClC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,MAAM,EAAE,UAAU,GAChB;IACF,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACvC,CA8DA"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
3
|
+
import utc from 'dayjs/plugin/utc';
|
|
4
|
+
dayjs.extend(customParseFormat);
|
|
5
|
+
dayjs.extend(utc);
|
|
6
|
+
/**
|
|
7
|
+
* Convert a date value to user format for validation
|
|
8
|
+
* Handles both ISO format and user format inputs
|
|
9
|
+
*/
|
|
10
|
+
export function convertDateToUserFormat(value, userFormat) {
|
|
11
|
+
// Try parsing as ISO format first (what DateField stores)
|
|
12
|
+
// Use strict mode to reject invalid dates
|
|
13
|
+
const parsedISO = dayjs(value, 'YYYY-MM-DD', true);
|
|
14
|
+
if (parsedISO.isValid()) {
|
|
15
|
+
return parsedISO.format(userFormat);
|
|
16
|
+
}
|
|
17
|
+
// Try parsing as user format (what API might send)
|
|
18
|
+
// Use strict mode to reject invalid dates like Feb 31st
|
|
19
|
+
const parsedUser = dayjs(value, userFormat, true);
|
|
20
|
+
if (parsedUser.isValid()) {
|
|
21
|
+
return value; // Already in user format
|
|
22
|
+
}
|
|
23
|
+
// Invalid date - return as-is for validation to catch
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Convert a date value to ISO format for storage
|
|
28
|
+
* Returns ISO if already valid, or original value if invalid
|
|
29
|
+
*/
|
|
30
|
+
export function convertDateToISO(value, userFormat) {
|
|
31
|
+
// Try parsing as user format first (for API consumers)
|
|
32
|
+
// Use strict mode to reject invalid dates like Feb 31st
|
|
33
|
+
const parsedUser = dayjs(value, userFormat, true);
|
|
34
|
+
if (parsedUser.isValid()) {
|
|
35
|
+
return parsedUser.format('YYYY-MM-DD');
|
|
36
|
+
}
|
|
37
|
+
// Try parsing as ISO (for DateField component)
|
|
38
|
+
// Use strict mode
|
|
39
|
+
const parsedISO = dayjs(value, 'YYYY-MM-DD', true);
|
|
40
|
+
if (parsedISO.isValid()) {
|
|
41
|
+
return value; // Already ISO
|
|
42
|
+
}
|
|
43
|
+
// Invalid date - return as-is
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Convert a datetime value to user format for validation
|
|
48
|
+
* Handles both ISO datetime and user format inputs
|
|
49
|
+
*/
|
|
50
|
+
export function convertDateTimeToUserFormat(value, dateFormat, timeFormat = 'HH:mm') {
|
|
51
|
+
const userFormat = `${dateFormat} ${timeFormat}`;
|
|
52
|
+
// Try parsing as ISO datetime first (what DateTimeField stores)
|
|
53
|
+
// Use strict mode to reject invalid dates
|
|
54
|
+
const parsedISO = dayjs(value, 'YYYY-MM-DDTHH:mm:ss[Z]', true);
|
|
55
|
+
if (parsedISO.isValid()) {
|
|
56
|
+
return parsedISO.format(userFormat);
|
|
57
|
+
}
|
|
58
|
+
// Try parsing as user format (what API might send)
|
|
59
|
+
// Use strict mode to reject invalid dates like Feb 31st
|
|
60
|
+
const parsedUser = dayjs(value, userFormat, true);
|
|
61
|
+
if (parsedUser.isValid()) {
|
|
62
|
+
return value; // Already in user format
|
|
63
|
+
}
|
|
64
|
+
// Invalid datetime - return as-is for validation to catch
|
|
65
|
+
return value;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Convert a datetime value to ISO UTC format for storage
|
|
69
|
+
* Returns ISO UTC if already valid, or original value if invalid
|
|
70
|
+
*/
|
|
71
|
+
export function convertDateTimeToISO(value, dateFormat, timeFormat = 'HH:mm') {
|
|
72
|
+
const userFormat = `${dateFormat} ${timeFormat}`;
|
|
73
|
+
console.log('[convertDateTimeToISO]', { value, userFormat });
|
|
74
|
+
// Try parsing as user format first (for API consumers)
|
|
75
|
+
// Use strict mode to reject invalid dates like Feb 31st
|
|
76
|
+
const parsedUser = dayjs(value, userFormat, true);
|
|
77
|
+
if (parsedUser.isValid()) {
|
|
78
|
+
const result = parsedUser.utc().format('YYYY-MM-DDTHH:mm:ss[Z]');
|
|
79
|
+
console.log('[convertDateTimeToISO] User format parse successful, converting to UTC:', result);
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
// Try parsing as ISO datetime (for DateTimeField component)
|
|
83
|
+
// Use strict mode with ISO format
|
|
84
|
+
const parsedISO = dayjs(value, 'YYYY-MM-DDTHH:mm:ss[Z]', true);
|
|
85
|
+
if (parsedISO.isValid()) {
|
|
86
|
+
const result = parsedISO.utc().format('YYYY-MM-DDTHH:mm:ss[Z]');
|
|
87
|
+
console.log('[convertDateTimeToISO] ISO parse successful:', result);
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
// Invalid datetime - return as-is
|
|
91
|
+
console.log('[convertDateTimeToISO] Invalid - returning as-is');
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Normalize date fields in data object
|
|
96
|
+
* Converts dates to ISO for storage and creates a parallel object with user-formatted dates for validation
|
|
97
|
+
*/
|
|
98
|
+
export function normalizeDateFields(data, schema) {
|
|
99
|
+
const normalizedData = { ...data };
|
|
100
|
+
const dataForValidation = { ...data };
|
|
101
|
+
console.log('[normalizeDateFields] Starting normalization...');
|
|
102
|
+
console.log('[normalizeDateFields] Input data:', data);
|
|
103
|
+
for (const field of schema.fields) {
|
|
104
|
+
if (field.type === 'date' && normalizedData[field.name]) {
|
|
105
|
+
const dateField = field;
|
|
106
|
+
const userFormat = dateField.options?.dateFormat || 'YYYY-MM-DD';
|
|
107
|
+
const dateValue = normalizedData[field.name];
|
|
108
|
+
console.log(`[normalizeDateFields] Processing DATE field "${field.name}"`, {
|
|
109
|
+
originalValue: dateValue,
|
|
110
|
+
userFormat
|
|
111
|
+
});
|
|
112
|
+
if (typeof dateValue === 'string') {
|
|
113
|
+
normalizedData[field.name] = convertDateToISO(dateValue, userFormat);
|
|
114
|
+
dataForValidation[field.name] = convertDateToUserFormat(dateValue, userFormat);
|
|
115
|
+
console.log(`[normalizeDateFields] Converted DATE field "${field.name}"`, {
|
|
116
|
+
normalizedValue: normalizedData[field.name],
|
|
117
|
+
validationValue: dataForValidation[field.name]
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else if (field.type === 'datetime' && normalizedData[field.name]) {
|
|
122
|
+
const dateTimeField = field;
|
|
123
|
+
const dateFormat = dateTimeField.options?.dateFormat || 'YYYY-MM-DD';
|
|
124
|
+
const timeFormat = dateTimeField.options?.timeFormat || 'HH:mm';
|
|
125
|
+
const dateTimeValue = normalizedData[field.name];
|
|
126
|
+
console.log(`[normalizeDateFields] Processing DATETIME field "${field.name}"`, {
|
|
127
|
+
originalValue: dateTimeValue,
|
|
128
|
+
dateFormat,
|
|
129
|
+
timeFormat,
|
|
130
|
+
combinedFormat: `${dateFormat} ${timeFormat}`
|
|
131
|
+
});
|
|
132
|
+
if (typeof dateTimeValue === 'string') {
|
|
133
|
+
normalizedData[field.name] = convertDateTimeToISO(dateTimeValue, dateFormat, timeFormat);
|
|
134
|
+
dataForValidation[field.name] = convertDateTimeToUserFormat(dateTimeValue, dateFormat, timeFormat);
|
|
135
|
+
console.log(`[normalizeDateFields] Converted DATETIME field "${field.name}"`, {
|
|
136
|
+
normalizedValue: normalizedData[field.name],
|
|
137
|
+
validationValue: dataForValidation[field.name]
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
console.log('[normalizeDateFields] Final result:', {
|
|
143
|
+
normalizedData,
|
|
144
|
+
dataForValidation
|
|
145
|
+
});
|
|
146
|
+
return { normalizedData, dataForValidation };
|
|
147
|
+
}
|
|
@@ -28,6 +28,7 @@ export declare class Rule {
|
|
|
28
28
|
min(len: number | string | FieldReference): Rule;
|
|
29
29
|
max(len: number | string | FieldReference): Rule;
|
|
30
30
|
length(len: number | FieldReference): Rule;
|
|
31
|
+
unique(): Rule;
|
|
31
32
|
email(): Rule;
|
|
32
33
|
uri(options?: {
|
|
33
34
|
scheme?: RegExp[];
|
|
@@ -39,6 +40,8 @@ export declare class Rule {
|
|
|
39
40
|
integer(): Rule;
|
|
40
41
|
greaterThan(num: number | FieldReference): Rule;
|
|
41
42
|
lessThan(num: number | FieldReference): Rule;
|
|
43
|
+
date(format?: string): Rule;
|
|
44
|
+
datetime(dateFormat?: string, timeFormat?: string): Rule;
|
|
42
45
|
custom<T = unknown>(fn: CustomValidator<T>): Rule;
|
|
43
46
|
error(message?: string): Rule;
|
|
44
47
|
warning(message?: string): Rule;
|
|
@@ -47,5 +50,6 @@ export declare class Rule {
|
|
|
47
50
|
validate(value: unknown, context?: ValidationContext): Promise<ValidationMarker[]>;
|
|
48
51
|
private validateRule;
|
|
49
52
|
isRequired(): boolean;
|
|
53
|
+
private normalizeForComparison;
|
|
50
54
|
}
|
|
51
55
|
//# sourceMappingURL=rule.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/rule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/rule.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAEjC,QAAQ,CAAC,EAAE,GAAG,CAAC;IAEf,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC3C,CACC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,iBAAiB,GACxB,gBAAgB,EAAE,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CAC1F;AAED,MAAM,WAAW,cAAc;IAC9B,gBAAgB,EAAE,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,IAAI;IAChB,OAAO,CAAC,SAAS,CAAkB;IAEnC,OAAO,CAAC,MAAM,CAAmE;IACjF,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,QAAQ,CAAC,CAAS;IAE1B,MAAM,CAAC,SAAS,SAA4B;IAE5C,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc;IAO5D,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc;IAIrD,QAAQ,IAAI,IAAI;IAMhB,QAAQ,IAAI,IAAI;IAMhB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,GAAG,IAAI;IAMhD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,GAAG,IAAI;IAMhD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAM1C,MAAM,IAAI,IAAI;IAMd,KAAK,IAAI,IAAI;IAMb,GAAG,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAMnE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAM3C,QAAQ,IAAI,IAAI;IAMhB,QAAQ,IAAI,IAAI;IAMhB,OAAO,IAAI,IAAI;IAMf,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAM/C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAM5C,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAM3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAOxD,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI;IAMjD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO7B,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO/B,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO5B,KAAK,IAAI,IAAI;IASP,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAwC9E,YAAY;IAgO1B,UAAU,IAAI,OAAO;IAKrB,OAAO,CAAC,sBAAsB;CAkB9B"}
|