@happyvertical/smrt-fields 0.40.60 → 0.40.62
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/AGENTS.md +58 -12
- package/README.md +143 -42
- package/dist/__smrt-register__.d.ts +2 -0
- package/dist/__smrt-register__.d.ts.map +1 -0
- package/dist/cache.d.ts +18 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/chunks/FieldPolicyCollection--RxukfCX.js +1218 -0
- package/dist/chunks/FieldPolicyCollection--RxukfCX.js.map +1 -0
- package/dist/collections/FieldPolicyCollection.d.ts +95 -0
- package/dist/collections/FieldPolicyCollection.d.ts.map +1 -0
- package/dist/collections/FieldPolicySuggestionCollection.d.ts +160 -0
- package/dist/collections/FieldPolicySuggestionCollection.d.ts.map +1 -0
- package/dist/collections/FieldUsageCounterCollection.d.ts +143 -0
- package/dist/collections/FieldUsageCounterCollection.d.ts.map +1 -0
- package/dist/deterministic-id.d.ts +18 -0
- package/dist/deterministic-id.d.ts.map +1 -0
- package/dist/field-definitions.d.ts +85 -0
- package/dist/field-definitions.d.ts.map +1 -0
- package/dist/field-policy-resolver.d.ts +46 -0
- package/dist/field-policy-resolver.d.ts.map +1 -0
- package/dist/index.d.ts +15 -532
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1813 -628
- package/dist/index.js.map +1 -1
- package/dist/manifest.json +1487 -191
- package/dist/models/FieldPolicy.d.ts +163 -0
- package/dist/models/FieldPolicy.d.ts.map +1 -0
- package/dist/models/FieldPolicySuggestion.d.ts +132 -0
- package/dist/models/FieldPolicySuggestion.d.ts.map +1 -0
- package/dist/models/FieldUsageCounter.d.ts +178 -0
- package/dist/models/FieldUsageCounter.d.ts.map +1 -0
- package/dist/models/FieldUsageReportReceipt.d.ts +25 -0
- package/dist/models/FieldUsageReportReceipt.d.ts.map +1 -0
- package/dist/permissions.d.ts +9 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/playground.d.ts +2 -0
- package/dist/playground.d.ts.map +1 -0
- package/dist/playground.js +39 -0
- package/dist/playground.js.map +1 -0
- package/dist/settings-catalog.d.ts +73 -0
- package/dist/settings-catalog.d.ts.map +1 -0
- package/dist/smrt-knowledge.json +449 -9
- package/dist/svelte/__tests__/FieldPolicyControlPanel.test.js +277 -0
- package/dist/svelte/__tests__/FieldPolicyGear.test.js +503 -0
- package/dist/svelte/__tests__/FormHelp.test.js +138 -0
- package/dist/svelte/__tests__/ModeUX.test.js +109 -0
- package/dist/svelte/__tests__/ObjectForm.test.js +687 -0
- package/dist/svelte/__tests__/ObjectFormGeneratedApi.integration.test.js +436 -0
- package/dist/svelte/__tests__/PolicyField.test.js +373 -0
- package/dist/svelte/__tests__/UsageLearning.test.js +140 -0
- package/dist/svelte/__tests__/fixtures/AdvancedFieldsFixture.svelte +30 -0
- package/dist/svelte/__tests__/fixtures/AdvancedFieldsFixture.svelte.d.ts +9 -0
- package/dist/svelte/__tests__/fixtures/AdvancedFieldsFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/DomPrefillFixture.svelte +33 -0
- package/dist/svelte/__tests__/fixtures/DomPrefillFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/DomPrefillFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/FormHelpFixture.svelte +19 -0
- package/dist/svelte/__tests__/fixtures/FormHelpFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/FormHelpFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/GeneratedApiGearFixture.svelte +18 -0
- package/dist/svelte/__tests__/fixtures/GeneratedApiGearFixture.svelte.d.ts +11 -0
- package/dist/svelte/__tests__/fixtures/GeneratedApiGearFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/GracefulDegradeFixture.svelte +11 -0
- package/dist/svelte/__tests__/fixtures/GracefulDegradeFixture.svelte.d.ts +19 -0
- package/dist/svelte/__tests__/fixtures/GracefulDegradeFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ModeSwitchFixture.svelte +18 -0
- package/dist/svelte/__tests__/fixtures/ModeSwitchFixture.svelte.d.ts +8 -0
- package/dist/svelte/__tests__/fixtures/ModeSwitchFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/NoIdFixture.svelte +24 -0
- package/dist/svelte/__tests__/fixtures/NoIdFixture.svelte.d.ts +13 -0
- package/dist/svelte/__tests__/fixtures/NoIdFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte +37 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte.d.ts +15 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormActionsFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormFixture.svelte +17 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormRegistryFixture.svelte +25 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormRegistryFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormRegistryFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSnippetFixture.svelte +34 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSnippetFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSnippetFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceFixture.svelte +29 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceFixture.svelte.d.ts +11 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceSnippetFixture.svelte +33 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceSnippetFixture.svelte.d.ts +9 -0
- package/dist/svelte/__tests__/fixtures/ObjectFormSourceSnippetFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/PolicyDataTableFixture.svelte +40 -0
- package/dist/svelte/__tests__/fixtures/PolicyDataTableFixture.svelte.d.ts +8 -0
- package/dist/svelte/__tests__/fixtures/PolicyDataTableFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/PrefillFixture.svelte +26 -0
- package/dist/svelte/__tests__/fixtures/PrefillFixture.svelte.d.ts +13 -0
- package/dist/svelte/__tests__/fixtures/PrefillFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ProviderFieldFixture.svelte +39 -0
- package/dist/svelte/__tests__/fixtures/ProviderFieldFixture.svelte.d.ts +17 -0
- package/dist/svelte/__tests__/fixtures/ProviderFieldFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/RegistryInput.svelte +15 -0
- package/dist/svelte/__tests__/fixtures/RegistryInput.svelte.d.ts +5 -0
- package/dist/svelte/__tests__/fixtures/RegistryInput.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/RevealPrefillFixture.svelte +29 -0
- package/dist/svelte/__tests__/fixtures/RevealPrefillFixture.svelte.d.ts +14 -0
- package/dist/svelte/__tests__/fixtures/RevealPrefillFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/SettingsCatalogStub.svelte +24 -0
- package/dist/svelte/__tests__/fixtures/SettingsCatalogStub.svelte.d.ts +14 -0
- package/dist/svelte/__tests__/fixtures/SettingsCatalogStub.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/SnippetFixture.svelte +28 -0
- package/dist/svelte/__tests__/fixtures/SnippetFixture.svelte.d.ts +13 -0
- package/dist/svelte/__tests__/fixtures/SnippetFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte +23 -0
- package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte.d.ts +10 -0
- package/dist/svelte/__tests__/fixtures/SuggestionGearFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/ToggleModeButton.svelte +14 -0
- package/dist/svelte/__tests__/fixtures/ToggleModeButton.svelte.d.ts +19 -0
- package/dist/svelte/__tests__/fixtures/ToggleModeButton.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/fixtures/TooltipFixture.svelte +25 -0
- package/dist/svelte/__tests__/fixtures/TooltipFixture.svelte.d.ts +14 -0
- package/dist/svelte/__tests__/fixtures/TooltipFixture.svelte.d.ts.map +1 -0
- package/dist/svelte/__tests__/settings-catalog.test.js +161 -0
- package/dist/svelte/components/AdvancedFields.svelte +49 -0
- package/dist/svelte/components/AdvancedFields.svelte.d.ts +17 -0
- package/dist/svelte/components/AdvancedFields.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldInput.svelte +159 -0
- package/dist/svelte/components/FieldInput.svelte.d.ts +5 -0
- package/dist/svelte/components/FieldInput.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyControlPanel.svelte +288 -0
- package/dist/svelte/components/FieldPolicyControlPanel.svelte.d.ts +29 -0
- package/dist/svelte/components/FieldPolicyControlPanel.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyEditor.svelte +417 -0
- package/dist/svelte/components/FieldPolicyEditor.svelte.d.ts +18 -0
- package/dist/svelte/components/FieldPolicyEditor.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyGearButton.svelte +24 -0
- package/dist/svelte/components/FieldPolicyGearButton.svelte.d.ts +8 -0
- package/dist/svelte/components/FieldPolicyGearButton.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyGearProvider.svelte +169 -0
- package/dist/svelte/components/FieldPolicyGearProvider.svelte.d.ts +20 -0
- package/dist/svelte/components/FieldPolicyGearProvider.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicyProvider.svelte +89 -0
- package/dist/svelte/components/FieldPolicyProvider.svelte.d.ts +35 -0
- package/dist/svelte/components/FieldPolicyProvider.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FieldPolicySuggestionQueue.svelte +135 -0
- package/dist/svelte/components/FieldPolicySuggestionQueue.svelte.d.ts +11 -0
- package/dist/svelte/components/FieldPolicySuggestionQueue.svelte.d.ts.map +1 -0
- package/dist/svelte/components/FormHelp.svelte +157 -0
- package/dist/svelte/components/FormHelp.svelte.d.ts +15 -0
- package/dist/svelte/components/FormHelp.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ModeSwitch.svelte +47 -0
- package/dist/svelte/components/ModeSwitch.svelte.d.ts +10 -0
- package/dist/svelte/components/ModeSwitch.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ObjectForm.svelte +440 -0
- package/dist/svelte/components/ObjectForm.svelte.d.ts +50 -0
- package/dist/svelte/components/ObjectForm.svelte.d.ts.map +1 -0
- package/dist/svelte/components/ObjectFormSourceProvider.svelte +18 -0
- package/dist/svelte/components/ObjectFormSourceProvider.svelte.d.ts +11 -0
- package/dist/svelte/components/ObjectFormSourceProvider.svelte.d.ts.map +1 -0
- package/dist/svelte/components/PolicyField.svelte +338 -0
- package/dist/svelte/components/PolicyField.svelte.d.ts +80 -0
- package/dist/svelte/components/PolicyField.svelte.d.ts.map +1 -0
- package/dist/svelte/context.svelte.d.ts +54 -0
- package/dist/svelte/context.svelte.d.ts.map +1 -0
- package/dist/svelte/context.svelte.js +55 -0
- package/dist/svelte/data-table.d.ts +17 -0
- package/dist/svelte/data-table.d.ts.map +1 -0
- package/dist/svelte/data-table.js +19 -0
- package/dist/svelte/field-policy-editor.d.ts +81 -0
- package/dist/svelte/field-policy-editor.d.ts.map +1 -0
- package/dist/svelte/field-policy-editor.js +120 -0
- package/dist/svelte/gear-context.svelte.d.ts +16 -0
- package/dist/svelte/gear-context.svelte.d.ts.map +1 -0
- package/dist/svelte/gear-context.svelte.js +15 -0
- package/dist/svelte/index.d.ts +63 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +41 -0
- package/dist/svelte/input-registry.d.ts +21 -0
- package/dist/svelte/input-registry.d.ts.map +1 -0
- package/dist/svelte/input-registry.js +26 -0
- package/dist/svelte/object-form-source-context.svelte.d.ts +4 -0
- package/dist/svelte/object-form-source-context.svelte.d.ts.map +1 -0
- package/dist/svelte/object-form-source-context.svelte.js +8 -0
- package/dist/svelte/object-form-source.svelte.d.ts +18 -0
- package/dist/svelte/object-form-source.svelte.d.ts.map +1 -0
- package/dist/svelte/object-form-source.svelte.js +99 -0
- package/dist/svelte/object-form.d.ts +6 -0
- package/dist/svelte/object-form.d.ts.map +1 -0
- package/dist/svelte/object-form.js +38 -0
- package/dist/svelte/playground/FieldPolicyFormPreview.svelte +212 -0
- package/dist/svelte/playground/FieldPolicyFormPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/FieldPolicyFormPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground/ObjectFormPreview.svelte +129 -0
- package/dist/svelte/playground/ObjectFormPreview.svelte.d.ts +4 -0
- package/dist/svelte/playground/ObjectFormPreview.svelte.d.ts.map +1 -0
- package/dist/svelte/playground.d.ts +20 -0
- package/dist/svelte/playground.d.ts.map +1 -0
- package/dist/svelte/playground.js +38 -0
- package/dist/svelte/settings-catalog.d.ts +54 -0
- package/dist/svelte/settings-catalog.d.ts.map +1 -0
- package/dist/svelte/settings-catalog.js +116 -0
- package/dist/svelte/suggestions.d.ts +38 -0
- package/dist/svelte/suggestions.d.ts.map +1 -0
- package/dist/svelte/suggestions.js +68 -0
- package/dist/svelte/types.d.ts +101 -0
- package/dist/svelte/types.d.ts.map +1 -0
- package/dist/svelte/types.js +4 -0
- package/dist/svelte/usage-capture.d.ts +63 -0
- package/dist/svelte/usage-capture.d.ts.map +1 -0
- package/dist/svelte/usage-capture.js +61 -0
- package/dist/types.d.ts +316 -203
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -1
- package/dist/types.js.map +1 -1
- package/dist/usage-learning.d.ts +201 -0
- package/dist/usage-learning.d.ts.map +1 -0
- package/dist/usage-schedules.d.ts +110 -0
- package/dist/usage-schedules.d.ts.map +1 -0
- package/dist/users-module.d.ts +30 -0
- package/dist/users-module.d.ts.map +1 -0
- package/package.json +33 -8
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural browser contracts for field-policy suggestion review.
|
|
3
|
+
*
|
|
4
|
+
* These types intentionally omit tenant, user, authorization, and field
|
|
5
|
+
* sensitivity data. Hosts bind methods to authenticated generated clients;
|
|
6
|
+
* the server derives identity and validates every action.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Validate generated custom-action output at the browser boundary. A malformed
|
|
10
|
+
* response is an error, never an empty queue that could conceal work.
|
|
11
|
+
*/
|
|
12
|
+
export function parsePendingFieldPolicySuggestions(value) {
|
|
13
|
+
if (!value || typeof value !== 'object') {
|
|
14
|
+
throw new Error('Unable to load pending field suggestions.');
|
|
15
|
+
}
|
|
16
|
+
const candidate = value;
|
|
17
|
+
const total = candidate.total;
|
|
18
|
+
if (!Array.isArray(candidate.suggestions) ||
|
|
19
|
+
typeof total !== 'number' ||
|
|
20
|
+
!Number.isSafeInteger(total) ||
|
|
21
|
+
total < 0) {
|
|
22
|
+
throw new Error('Unable to load pending field suggestions.');
|
|
23
|
+
}
|
|
24
|
+
const suggestions = candidate.suggestions.map(parseSuggestion);
|
|
25
|
+
if (total < suggestions.length) {
|
|
26
|
+
throw new Error('Unable to load pending field suggestions.');
|
|
27
|
+
}
|
|
28
|
+
return { suggestions, total };
|
|
29
|
+
}
|
|
30
|
+
function parseSuggestion(value) {
|
|
31
|
+
if (!value || typeof value !== 'object') {
|
|
32
|
+
throw new Error('Unable to load pending field suggestions.');
|
|
33
|
+
}
|
|
34
|
+
const candidate = value;
|
|
35
|
+
if (typeof candidate.id !== 'string' ||
|
|
36
|
+
typeof candidate.objectRef !== 'string' ||
|
|
37
|
+
typeof candidate.fieldName !== 'string' ||
|
|
38
|
+
(candidate.kind !== 'promote' && candidate.kind !== 'default') ||
|
|
39
|
+
(candidate.proposedValue !== null &&
|
|
40
|
+
typeof candidate.proposedValue !== 'string') ||
|
|
41
|
+
!isRecord(candidate.evidence) ||
|
|
42
|
+
(candidate.status !== undefined && candidate.status !== 'pending')) {
|
|
43
|
+
throw new Error('Unable to load pending field suggestions.');
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
id: candidate.id,
|
|
47
|
+
objectRef: candidate.objectRef,
|
|
48
|
+
fieldName: candidate.fieldName,
|
|
49
|
+
kind: candidate.kind,
|
|
50
|
+
proposedValue: candidate.proposedValue,
|
|
51
|
+
evidence: candidate.evidence,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function isRecord(value) {
|
|
55
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
56
|
+
}
|
|
57
|
+
/** Human-readable evidence without assuming a server-side evidence schema. */
|
|
58
|
+
export function fieldPolicySuggestionEvidence(suggestion) {
|
|
59
|
+
const summary = suggestion.evidence.summary;
|
|
60
|
+
if (typeof summary === 'string' && summary.trim())
|
|
61
|
+
return summary;
|
|
62
|
+
const distinctUsers = suggestion.evidence.distinctUsers;
|
|
63
|
+
const setCount = suggestion.evidence.setCount;
|
|
64
|
+
if (typeof distinctUsers === 'number' && typeof setCount === 'number') {
|
|
65
|
+
return `${distinctUsers} users set this field ${setCount} times.`;
|
|
66
|
+
}
|
|
67
|
+
return 'Based on recent organization field usage.';
|
|
68
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the field-policy Svelte primitives.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Props for the PolicyField headless snippet escape hatch — all the data a
|
|
6
|
+
* fully custom renderer needs.
|
|
7
|
+
*/
|
|
8
|
+
export interface PolicyFieldSnippetProps {
|
|
9
|
+
id: string;
|
|
10
|
+
helpId: string;
|
|
11
|
+
visible: boolean;
|
|
12
|
+
label: string | null;
|
|
13
|
+
help: string | null;
|
|
14
|
+
defaultValue: unknown;
|
|
15
|
+
required: boolean;
|
|
16
|
+
/** Resolved visibility tier from the policy. */
|
|
17
|
+
tier: 'basic' | 'advanced' | 'hidden';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Browser-safe subset of a generated SMRT web field definition. This mirrors
|
|
21
|
+
* the `@smrt/web` wire contract without making the reusable Svelte package
|
|
22
|
+
* depend on an application's generated virtual module.
|
|
23
|
+
*/
|
|
24
|
+
export interface ObjectFormFieldDefinition {
|
|
25
|
+
/**
|
|
26
|
+
* The persisted public wire types emitted by generated web collections.
|
|
27
|
+
* There is deliberately no `select` wire type: applications render
|
|
28
|
+
* select-like controls by registering a field-specific renderer for a text
|
|
29
|
+
* (or other persisted) wire field.
|
|
30
|
+
*/
|
|
31
|
+
type: ObjectFormWireType;
|
|
32
|
+
required?: boolean;
|
|
33
|
+
default?: unknown;
|
|
34
|
+
description?: string;
|
|
35
|
+
ui?: {
|
|
36
|
+
basic?: boolean;
|
|
37
|
+
group?: string;
|
|
38
|
+
order?: number;
|
|
39
|
+
locked?: boolean;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Browser-observable scalar types emitted by a generated web collection. */
|
|
43
|
+
export type ObjectFormWireType = 'text' | 'integer' | 'decimal' | 'boolean' | 'datetime' | 'json' | 'foreignKey' | 'crossPackageRef';
|
|
44
|
+
/** Structural subset of a generated `SmrtWebCollectionDefinition`. */
|
|
45
|
+
export interface ObjectFormCollectionDefinition {
|
|
46
|
+
/** Canonical qualified model identity, never a simple class name. */
|
|
47
|
+
objectRef: string;
|
|
48
|
+
/** Browser-safe generated field definitions. */
|
|
49
|
+
fields: Readonly<Record<string, ObjectFormFieldDefinition>>;
|
|
50
|
+
}
|
|
51
|
+
/** Generated custom-action client shape, intentionally independent of smrt-web. */
|
|
52
|
+
export interface ObjectFormPolicyClient {
|
|
53
|
+
resolveBatch(input: {
|
|
54
|
+
objectRefs: string[];
|
|
55
|
+
}): Promise<unknown>;
|
|
56
|
+
}
|
|
57
|
+
/** Resolved definition and policy consumed by `ObjectForm`. */
|
|
58
|
+
export interface ObjectFormResolvedSource {
|
|
59
|
+
definition: ObjectFormCollectionDefinition;
|
|
60
|
+
policy: import('../types.js').ResolvedObjectFieldPolicy;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Per-app source contract. The source owns generated definitions and the
|
|
64
|
+
* app's custom-action transport; ObjectForm never imports a client runtime.
|
|
65
|
+
*/
|
|
66
|
+
export interface ObjectFormSource {
|
|
67
|
+
load(objectRef: string): Promise<ObjectFormResolvedSource>;
|
|
68
|
+
}
|
|
69
|
+
/** A field selected from the safe web-definition × resolved-policy overlap. */
|
|
70
|
+
export interface ObjectFormField {
|
|
71
|
+
name: string;
|
|
72
|
+
definition: ObjectFormFieldDefinition;
|
|
73
|
+
group: string | null;
|
|
74
|
+
order: number | null;
|
|
75
|
+
}
|
|
76
|
+
/** Props shared by built-in and app-registered ObjectForm input renderers. */
|
|
77
|
+
export interface FieldInputProps {
|
|
78
|
+
id: string;
|
|
79
|
+
name: string;
|
|
80
|
+
/** Resolved human-facing label for controls whose native name is absent. */
|
|
81
|
+
label?: string | null;
|
|
82
|
+
field: ObjectFormField;
|
|
83
|
+
value: unknown;
|
|
84
|
+
required: boolean;
|
|
85
|
+
disabled: boolean;
|
|
86
|
+
onvaluechange: (value: unknown) => void;
|
|
87
|
+
/** Reports parser validity to the host form/editor. */
|
|
88
|
+
onvaliditychange?: (valid: boolean) => void;
|
|
89
|
+
}
|
|
90
|
+
/** Data exposed to an ObjectForm per-field snippet override. */
|
|
91
|
+
export interface ObjectFormFieldSnippetProps {
|
|
92
|
+
id: string;
|
|
93
|
+
helpId: string;
|
|
94
|
+
field: ObjectFormField;
|
|
95
|
+
value: unknown;
|
|
96
|
+
required: boolean;
|
|
97
|
+
disabled: boolean;
|
|
98
|
+
setValue(value: unknown): void;
|
|
99
|
+
setValidity(valid: boolean): void;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/svelte/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;CACvC;AAED;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,EAAE,CAAC,EAAE;QACH,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,6EAA6E;AAC7E,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,SAAS,GACT,SAAS,GACT,SAAS,GACT,UAAU,GACV,MAAM,GACN,YAAY,GACZ,iBAAiB,CAAC;AAEtB,sEAAsE;AACtE,MAAM,WAAW,8BAA8B;IAC7C,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,CAAC;CAC7D;AAED,mFAAmF;AACnF,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjE;AAED,+DAA+D;AAC/D,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,8BAA8B,CAAC;IAC3C,MAAM,EAAE,OAAO,aAAa,EAAE,yBAAyB,CAAC;CACzD;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC5D;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,yBAAyB,CAAC;IACtC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,uDAAuD;IACvD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED,gEAAgE;AAChE,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-safe usage capture primitives for the field-policy learning loop.
|
|
3
|
+
*
|
|
4
|
+
* Hosts own the authenticated transport. This module deliberately carries no
|
|
5
|
+
* tenant, user, permission, or field-sensitivity information: the server
|
|
6
|
+
* derives all of that from its ambient context and live object registry.
|
|
7
|
+
*/
|
|
8
|
+
/** One submitted field value sent to the host's usage transport. */
|
|
9
|
+
export interface FieldUsageEntry {
|
|
10
|
+
objectRef: string;
|
|
11
|
+
fieldName: string;
|
|
12
|
+
value?: unknown;
|
|
13
|
+
/** Optional value-less hint; normal ObjectForm capture sends the value. */
|
|
14
|
+
matchedDefault?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Resolved default metadata used only for a value-less count signal. */
|
|
17
|
+
export interface FieldUsageDefault {
|
|
18
|
+
hasDefault: boolean;
|
|
19
|
+
defaultValue: unknown;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Structural host transport for the counters collection's batched action.
|
|
23
|
+
* A reporter must never be allowed to affect a successful form submission.
|
|
24
|
+
*/
|
|
25
|
+
export interface FieldUsageReporter {
|
|
26
|
+
reportUsage(input: {
|
|
27
|
+
entries: readonly FieldUsageEntry[];
|
|
28
|
+
}): unknown;
|
|
29
|
+
}
|
|
30
|
+
export interface CollectFieldUsageEntriesOptions {
|
|
31
|
+
objectRef: string;
|
|
32
|
+
values: Readonly<Record<string, unknown>>;
|
|
33
|
+
/**
|
|
34
|
+
* Rendered field names and their persisted browser wire type. The type is
|
|
35
|
+
* used only to minimize value transit — it is never a sensitivity or
|
|
36
|
+
* authorization decision.
|
|
37
|
+
*/
|
|
38
|
+
fields?: Readonly<Record<string, FieldUsageWireType>>;
|
|
39
|
+
/**
|
|
40
|
+
* Resolved defaults for rendered fields. For count-only values, a matching
|
|
41
|
+
* default is sent as a positive hint so the server does not treat it as a
|
|
42
|
+
* deviation. Absent or non-matching defaults deliberately send no hint.
|
|
43
|
+
*/
|
|
44
|
+
defaults?: Readonly<Record<string, FieldUsageDefault>>;
|
|
45
|
+
}
|
|
46
|
+
export type FieldUsageWireType = 'text' | 'integer' | 'decimal' | 'boolean' | 'datetime' | 'json' | 'foreignKey' | 'crossPackageRef';
|
|
47
|
+
/** Values may transit only for bounded, identifier-like wire types. */
|
|
48
|
+
export declare function canCaptureFieldUsageValue(type: FieldUsageWireType | undefined): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Collect every non-blank submitted field, including values matching a
|
|
51
|
+
* resolved default. Values transit only for bounded boolean/reference fields;
|
|
52
|
+
* free text, numbers, dates, and JSON emit count-only signals. Capturing only
|
|
53
|
+
* deviations would make the default's dominance denominator disappear. The
|
|
54
|
+
* server still derives eligibility, sensitivity, and every aggregate.
|
|
55
|
+
*/
|
|
56
|
+
export declare function collectFieldUsageEntries(options: CollectFieldUsageEntriesOptions): FieldUsageEntry[];
|
|
57
|
+
/** Zero and false are submissions; only absent/null/empty-string values are not. */
|
|
58
|
+
export declare function isBlankFieldValue(value: unknown): boolean;
|
|
59
|
+
/** JSON-safe equality for the count-only default-match hint. */
|
|
60
|
+
export declare function fieldUsageValuesEqual(left: unknown, right: unknown): boolean;
|
|
61
|
+
/** Fire-and-forget by design: metrics transport failures never reject submit. */
|
|
62
|
+
export declare function reportFieldUsage(reporter: FieldUsageReporter | undefined, entries: readonly FieldUsageEntry[]): void;
|
|
63
|
+
//# sourceMappingURL=usage-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-capture.d.ts","sourceRoot":"","sources":["../../src/svelte/usage-capture.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,SAAS,eAAe,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC;CACtE;AAED,MAAM,WAAW,+BAA+B;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1C;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACtD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;CACxD;AAED,MAAM,MAAM,kBAAkB,GAC1B,MAAM,GACN,SAAS,GACT,SAAS,GACT,SAAS,GACT,UAAU,GACV,MAAM,GACN,YAAY,GACZ,iBAAiB,CAAC;AAEtB,uEAAuE;AACvE,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,kBAAkB,GAAG,SAAS,GACnC,OAAO,CAIT;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,+BAA+B,GACvC,eAAe,EAAE,CAyBnB;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEzD;AAED,gEAAgE;AAChE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAO5E;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,kBAAkB,GAAG,SAAS,EACxC,OAAO,EAAE,SAAS,eAAe,EAAE,GAClC,IAAI,CASN"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** Values may transit only for bounded, identifier-like wire types. */
|
|
2
|
+
export function canCaptureFieldUsageValue(type) {
|
|
3
|
+
return (type === 'boolean' || type === 'foreignKey' || type === 'crossPackageRef');
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Collect every non-blank submitted field, including values matching a
|
|
7
|
+
* resolved default. Values transit only for bounded boolean/reference fields;
|
|
8
|
+
* free text, numbers, dates, and JSON emit count-only signals. Capturing only
|
|
9
|
+
* deviations would make the default's dominance denominator disappear. The
|
|
10
|
+
* server still derives eligibility, sensitivity, and every aggregate.
|
|
11
|
+
*/
|
|
12
|
+
export function collectFieldUsageEntries(options) {
|
|
13
|
+
const fields = options.fields ??
|
|
14
|
+
Object.fromEntries(Object.keys(options.values).map((fieldName) => [fieldName, undefined]));
|
|
15
|
+
const entries = [];
|
|
16
|
+
for (const [fieldName, type] of Object.entries(fields)) {
|
|
17
|
+
const value = options.values[fieldName];
|
|
18
|
+
if (isBlankFieldValue(value))
|
|
19
|
+
continue;
|
|
20
|
+
if (canCaptureFieldUsageValue(type)) {
|
|
21
|
+
entries.push({ objectRef: options.objectRef, fieldName, value });
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const fieldDefault = options.defaults?.[fieldName];
|
|
25
|
+
entries.push({
|
|
26
|
+
objectRef: options.objectRef,
|
|
27
|
+
fieldName,
|
|
28
|
+
...(fieldDefault?.hasDefault &&
|
|
29
|
+
fieldUsageValuesEqual(value, fieldDefault.defaultValue)
|
|
30
|
+
? { matchedDefault: true }
|
|
31
|
+
: {}),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return entries;
|
|
35
|
+
}
|
|
36
|
+
/** Zero and false are submissions; only absent/null/empty-string values are not. */
|
|
37
|
+
export function isBlankFieldValue(value) {
|
|
38
|
+
return value === undefined || value === null || value === '';
|
|
39
|
+
}
|
|
40
|
+
/** JSON-safe equality for the count-only default-match hint. */
|
|
41
|
+
export function fieldUsageValuesEqual(left, right) {
|
|
42
|
+
if (left === right)
|
|
43
|
+
return true;
|
|
44
|
+
try {
|
|
45
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Fire-and-forget by design: metrics transport failures never reject submit. */
|
|
52
|
+
export function reportFieldUsage(reporter, entries) {
|
|
53
|
+
if (!reporter || entries.length === 0)
|
|
54
|
+
return;
|
|
55
|
+
try {
|
|
56
|
+
void Promise.resolve(reporter.reportUsage({ entries })).catch(() => undefined);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// A synchronous host adapter failure is non-fatal by the same contract.
|
|
60
|
+
}
|
|
61
|
+
}
|