@happyvertical/smrt-core 0.56.0 → 0.56.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/agents/generators.md +37 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +2 -1
- package/dist/cookbook/engine/commands.d.ts.map +1 -1
- package/dist/cookbook/engine/commands.js +12 -0
- package/dist/cookbook/engine/commands.js.map +1 -1
- package/dist/cookbook/engine/defaults.d.ts.map +1 -1
- package/dist/cookbook/engine/defaults.js +8 -0
- package/dist/cookbook/engine/defaults.js.map +1 -1
- package/dist/cookbook/engine/document.d.ts +4 -0
- package/dist/cookbook/engine/document.d.ts.map +1 -1
- package/dist/cookbook/engine/document.js +11 -3
- package/dist/cookbook/engine/document.js.map +1 -1
- package/dist/cookbook/engine/engine.d.ts.map +1 -1
- package/dist/cookbook/engine/engine.js +3 -1
- package/dist/cookbook/engine/engine.js.map +1 -1
- package/dist/cookbook/engine/schemas.d.ts.map +1 -1
- package/dist/cookbook/engine/schemas.js +8 -0
- package/dist/cookbook/engine/schemas.js.map +1 -1
- package/dist/cookbook/engine/types.d.ts +5 -1
- package/dist/cookbook/engine/types.d.ts.map +1 -1
- package/dist/cookbook/engine/types.js.map +1 -1
- package/dist/generators/index.d.ts +1 -0
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +2 -1
- package/dist/generators/mcp-runtime-template.d.ts +3 -0
- package/dist/generators/mcp-runtime-template.d.ts.map +1 -1
- package/dist/generators/mcp-runtime-template.js +30 -4
- package/dist/generators/mcp-runtime-template.js.map +1 -1
- package/dist/generators/mcp.d.ts +5 -0
- package/dist/generators/mcp.d.ts.map +1 -1
- package/dist/generators/mcp.js +78 -7
- package/dist/generators/mcp.js.map +1 -1
- package/dist/generators.js +2 -1
- package/dist/index.js +2 -1
- package/dist/manifest/browser-capability.generated.js +34 -5
- package/dist/manifest/browser-capability.generated.js.map +1 -1
- package/dist/manifest/index.js +1 -1
- package/dist/manifest/static-manifest.js +1 -1
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +1 -1
- package/dist/manifest.json +1 -1
- package/dist/mcp-serializer.d.ts +38 -0
- package/dist/mcp-serializer.d.ts.map +1 -0
- package/dist/mcp-serializer.js +60 -0
- package/dist/mcp-serializer.js.map +1 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/index.js +34 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/index.js.map +1 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/lib/errors.js +343 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/lib/errors.js.map +1 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/lib/get-format.js +109 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/lib/get-format.js.map +1 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/lib/package-json-reader.js +102 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/lib/package-json-reader.js.map +1 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/lib/resolve.js +673 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/lib/resolve.js.map +1 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/lib/utils.js +32 -0
- package/dist/node_modules/.pnpm/import-meta-resolve@4.2.0/node_modules/import-meta-resolve/lib/utils.js.map +1 -0
- package/dist/registry/types.d.ts +13 -0
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/smrt-knowledge.json +7 -5
- package/dist/utils/import-project-vite.js +1 -1
- package/dist/utils/import-workspace-module.js +1 -1
- package/dist/vite-plugin/dev-plane-route.js +1 -1
- package/dist/vite-plugin/import-build-aware.js +1 -1
- package/dist/vite-plugin/index.js +1 -1
- package/dist/vite-plugin/resources-route.js +1 -1
- package/dist/vite-plugin/sveltekit-generator.js +1 -1
- package/package.json +16 -10
package/agents/generators.md
CHANGED
|
@@ -42,6 +42,43 @@ identifier, or annotation changes cannot alter persisted row hydration.
|
|
|
42
42
|
|
|
43
43
|
Per-field web emission (#2046): `buildWebFieldDefinitions` carries `description` (from `@field({ description })`) and sanitized `ui` hints (from `@field({ ui: { basic, group, order, locked } })`, read off the manifest `_meta.ui` bag through per-key type guards) into each emitted field definition, and `buildWebToolDescriptors` threads the same `description` into browser MCP tool schemas. `sensitive`/`transient` fields are excluded from emission entirely, so their descriptions never ship. Both keys are conditional, so hint-less schemas emit byte-identical definitions (and hashes) as before; adding a description/ui hint changes the manifest hash — deliberate over-invalidation, harmless per the #1764 contract.
|
|
44
44
|
|
|
45
|
+
## MCP `get` serializers
|
|
46
|
+
|
|
47
|
+
A model may add an async serializer only to its standard generated MCP `get`
|
|
48
|
+
tool. Configure a module specifier and named export under `mcp.serializers.get`:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
@smrt({
|
|
52
|
+
mcp: {
|
|
53
|
+
serializers: {
|
|
54
|
+
get: {
|
|
55
|
+
importPath: '@scope/package',
|
|
56
|
+
exportName: 'serializeThingMcpGet',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
})
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
The named export receives `(item, options: PublicJsonOptions)` and returns the
|
|
64
|
+
get result (or a promise for it). Bare package specifiers resolve with ESM
|
|
65
|
+
conditions from the declaring model's loaded module, so the serializer's owning
|
|
66
|
+
package is an application dependency rather than a dependency of core or a
|
|
67
|
+
generic dispatcher. This anchor is independent of `process.cwd()`. Relative
|
|
68
|
+
references retain ordinary dynamic-import behavior. The MCP runtime imports
|
|
69
|
+
and caches the named module, then calls the serializer after normal
|
|
70
|
+
authentication, tenant-scoped lookup, and read access have admitted and loaded
|
|
71
|
+
the item. A missing or non-function export makes that `get` call fail. The hook
|
|
72
|
+
replaces only the standard `get` result; generated `list`, writes, deletes, and
|
|
73
|
+
custom actions keep their existing contracts.
|
|
74
|
+
|
|
75
|
+
The serializer owns its public projection. Start with
|
|
76
|
+
`item.toPublicJSON(options)`, and project each related model with that model's
|
|
77
|
+
`toPublicJSON(options)` before adding it. The final transport pass cannot make
|
|
78
|
+
arbitrary plain aliases permission-safe: returning a DTO does not cause fields
|
|
79
|
+
inside it to be filtered by model policy. Do not use `toJSON()` or spread model
|
|
80
|
+
instances into a serializer result.
|
|
81
|
+
|
|
45
82
|
## Generated MCP server output language
|
|
46
83
|
|
|
47
84
|
`MCPGenerator` builds every file as TypeScript, so the requested `outputPath`
|
package/dist/browser.d.ts
CHANGED
|
@@ -61,6 +61,7 @@ export { createFilesystemAdapter, type FilesystemAdapterFactory, registerFilesys
|
|
|
61
61
|
export { createGeneratedCollectionAccess, type GeneratedCollectionAccess, type GeneratedCollectionRuntime, } from "./generated-collection-access.js";
|
|
62
62
|
export { type ApiMethodExposure, type ApiMethodRejectionCode, buildCustomActionInputSchema, buildCustomActionInvocationArgs, CRUD_OPERATIONS, type CustomActionFailure, type CustomActionMetadata, type CustomActionScope, classifyMethodWireability, classifyParameterWireability, coerceCustomActionArgument, createClassNamePredicate, createManifestClassNamePredicate, customActionParameterInputName, declaredTypeAcceptsDate, declaresRuntimeRestRoute, declaresRuntimeRestRouteShape, type EffectiveActionMetadata, type ExposableMethod, isCrudOperation, isCrudToolAction, type MethodDecoratorConfig, normalizeCustomActionFailure, queryStringDecoderFor, type ResolveApiMethodExposureOptions, type ResolveCustomActionMetadataOptions, type ResolvedCustomActionMetadata, readMethodDecoratorConfig, resolveApiMethodExposure, resolveCustomActionMetadata, resolveDeclaredScopeMismatch, resolveEffectiveActionMetadata, SMRT_CUSTOM_ACTION_ERROR_METADATA_KEY, type ToolEffect, toCustomActionBoolean, toCustomActionDate, toCustomActionNumber, type WireabilityOptions, type WireabilityVerdict, type WireableParameter, } from "./generators/custom-action.js";
|
|
63
63
|
export { runWithTenantGate, setTenantEntryPointRunner, type TenantEntryPointRunner, type TenantGateOptions, } from "./generators/tenant-gate.js";
|
|
64
|
+
export { fieldTypeToJsonSchema, type ToolFieldMeta, type ToolJsonSchema, } from "./generators/tool-schema.js";
|
|
64
65
|
export { normalizeTypedHttpError, type TypedHttpFailure, } from "./generators/typed-http-error.js";
|
|
65
66
|
export { type HierarchyView, SmrtHierarchical } from "./hierarchical.js";
|
|
66
67
|
export * from "./interceptors.js";
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/browser.js
CHANGED
|
@@ -65,6 +65,7 @@ import { convertTypeToJsonSchema, generateToolFromMethod, generateToolManifest,
|
|
|
65
65
|
import { CRUD_OPERATIONS, SMRT_CUSTOM_ACTION_ERROR_METADATA_KEY, buildCustomActionInputSchema, buildCustomActionInvocationArgs, classifyMethodWireability, classifyParameterWireability, coerceCustomActionArgument, createClassNamePredicate, createManifestClassNamePredicate, customActionParameterInputName, declaredTypeAcceptsDate, declaresRuntimeRestRoute, declaresRuntimeRestRouteShape, isCrudOperation, isCrudToolAction, normalizeCustomActionFailure, queryStringDecoderFor, readMethodDecoratorConfig, resolveApiMethodExposure, resolveCustomActionMetadata, resolveDeclaredScopeMismatch, resolveEffectiveActionMetadata, toCustomActionBoolean, toCustomActionDate, toCustomActionNumber } from "./generators/custom-action.js";
|
|
66
66
|
import { DEFAULT_DISPLAY_LABEL_FIELDS, FIELD_UI_FORMATS, FIELD_UI_FORMAT_TYPES, FIELD_UI_WIDGETS, FIELD_UI_WIDGET_TYPES, RELATIONSHIP_ROLES, describeDisplayLabel, displayLabelFieldProblem, findSelectorFor, isFieldUIFormat, isFieldUIWidget, isRelationshipRole, resolveDisplayLabelField } from "./ui-metadata.js";
|
|
67
67
|
import { runWithTenantGate, setTenantEntryPointRunner } from "./generators/tenant-gate.js";
|
|
68
|
+
import { fieldTypeToJsonSchema } from "./generators/tool-schema.js";
|
|
68
69
|
import { MAX_SYNC_APPLY_BATCH_SIZE, SYNC_APPLY_ROUTE_SEGMENTS, SYNC_APPLY_UUID_PATTERN, applySyncWritablePolicy, isStaleWrite, parseSyncApplyBatch, payloadMatchesRow, processSyncApplyBatch, validateSyncApplyItem } from "./sync/apply.js";
|
|
69
70
|
import { resolveOperationPermissionAlias } from "./operation-permission.js";
|
|
70
71
|
import { normalizeTypedHttpError } from "./generators/typed-http-error.js";
|
|
@@ -87,4 +88,4 @@ import { DIAGNOSTICS_DEFAULT_LIMIT, SYSTEM_DIAGNOSTICS_TABLES, readDispatchHealt
|
|
|
87
88
|
import { DEFAULT_RETENTION_POLICY, clearRetentionTasks, getRetentionTasks, pruneAiUsage, pruneExpiredContexts, pruneRunOnceClaims, registerRetentionTask, runRetentionSweep, unregisterRetentionTask } from "./system/retention.js";
|
|
88
89
|
import "./system/browser.js";
|
|
89
90
|
import "./tools/index.js";
|
|
90
|
-
export { AIError, AiUsageCollector, AiUsagePersistenceHandler, CACHE_INVALIDATION_CHANNEL, CHANGE_FEED_CREDENTIAL_TABLES, CHANGE_FEED_INTERCEPTOR_NAME, CHANGE_FEED_TABLE, CHANGE_SIGNAL_CHANNEL, CRUD_OPERATIONS, ConfigurationError, ContentHasher, CosineSimilarity, DEFAULT_AI_COST_RATES, DEFAULT_CHANGES_LIMIT, DEFAULT_DATA_QUERY_PAGE_LIMIT, DEFAULT_DATA_QUERY_RESULT_BYTES, DEFAULT_DISPLAY_LABEL_FIELDS, DEFAULT_EMBEDDING_CONFIG, DEFAULT_FACET_LIMIT, DEFAULT_LEARNING_CONFIG, DEFAULT_LIST_LIMIT, DEFAULT_LIST_ORDER_BY, DEFAULT_POSTGRES_TIMEOUTS, DEFAULT_RETENTION_POLICY, DIAGNOSTICS_DEFAULT_LIMIT, DataQueryValidationError, DatabaseError, Dispatch, DispatchBus, DispatchCollection, DispatchSubscription, DispatchSubscriptionCollection, EmbeddingProvider, EmbeddingStorage, EmbeddingUnavailableError, ErrorUtils, FIELD_UI_FORMATS, FIELD_UI_FORMAT_TYPES, FIELD_UI_WIDGETS, FIELD_UI_WIDGET_TYPES, FilesystemError, GlobalInterceptors, IN_LIST_CHUNK_SIZE, LearningMemory, LiveSchemaParityError, MAX_CHANGES_LIMIT, MAX_DATA_QUERY_CURSOR_LENGTH, MAX_DATA_QUERY_FACETS, MAX_DATA_QUERY_FILTERS, MAX_DATA_QUERY_FILTER_DEPTH, MAX_DATA_QUERY_IN_VALUES, MAX_DATA_QUERY_OFFSET, MAX_DATA_QUERY_PAGE_LIMIT, MAX_DATA_QUERY_REQUEST_BYTES, MAX_DATA_QUERY_RESULT_BYTES, MAX_DATA_QUERY_WARNINGS, MAX_FACET_FIELDS, MAX_FACET_LIMIT, MAX_LIST_LIMIT, MAX_STI_READ_SCOPE_TYPES, MAX_SYNC_APPLY_BATCH_SIZE, MOCK_PROVIDER_OPTION, MetricsAdapter, NetworkError, ObjectRegistry, POSTGRES_REVISION_GUARD_EXPRESSION, POSTGRES_TIMEOUT_ENV_VARS, PubSubAdapter, QueryBoundsError, QueryOrderByError, RECIPE_DEMO_MODES, RELATIONSHIP_ROLES, RunOnceClaimError, RuntimeError, SMRT_COLLECTION_BASE_NAMES, SMRT_CUSTOM_ACTION_ERROR_METADATA_KEY, SMRT_SCHEMA_VERSION, SYNC_APPLY_ROUTE_SEGMENTS, SYNC_APPLY_UUID_PATTERN, SYSTEM_DIAGNOSTICS_TABLES, SYSTEM_TABLE_NAMES, SchemaComparer, SignalBus, SignalSanitizer, SmrtClass, SmrtCollection, SmrtError, SmrtHierarchical, SmrtJunction, SmrtJunctionBase, SmrtObject, SmrtPolymorphicAssociation, SmrtRecipe, TenantIsolationError, ValidationError, ValidationReport, ValidationUtils, appendChange, appendChanges, applyOneToManyChildAccessors, applyPendingDecoratorRegistrations, applyPostgresPermissions, applyPostgresRuntimeTimeouts, applySyncWritablePolicy, assertFiniteUnitInterval, assertPostgresSystemTimestampsCurrent, assertScopedPackageName, auditChanges, auditSnapshot, broadcastCacheInvalidation, buildCascadePlan, buildConnectSection, buildCustomActionInputSchema, buildCustomActionInvocationArgs, buildDefaultListOrderBy, buildGlossary, bumpChangeFeed, canonicalizeDataQuery, cascadeReferencesTo, checkLiveSchemaParity, childAccessorName, chunkArray, classifyDatabaseError, classifyDialectMessage, classifyMethodWireability, classifyParameterWireability, clearRetentionTasks, clone, coerceCustomActionArgument, collectForeignKeyOrphanCounts, config, convertTypeToJsonSchema, createClassNamePredicate, createDataQueryFingerprint, createDispatchBus, createFilesystemAdapter, createGeneratedCollectionAccess, createInterceptorContext, createManifestClassNamePredicate, createQualifiedName, createRecipeHelp, createSmrtClient, crossPackageRef, customActionParameterInputName, declareChangeFeedSensitiveTable, declaredTypeAcceptsDate, declaresRuntimeRestRoute, declaresRuntimeRestRouteShape, deriveRecipeDemo, describeDisplayLabel, detectEngine, displayLabelFieldProblem, drainChangeFeed, effectiveRecipeDemo, ensureBootstrapSystemTableCompatibility, ensureCacheInvalidationListener, ensureChangeFeedTable, ensureDeferredSystemTableCompatibility, ensureDispatchSubscriptionsSystemTableCompatibility, ensureDispatchSystemTableCompatibility, ensureJobEventsSystemTableCompatibility, ensureJobsSystemTableCompatibility, ensureLegacySystemTableCompatibility, ensureSystemTables, estimateAiUsageCost, executeCollectionReadPlan, executeDecision, executeToolCall, executeToolCalls, extractFieldRefs, field, filterVisibleChangeFeedEntries, findField, findSelectorFor, foreignKey, formatToolResults, generateDDLForEngine, generateSchemaDiff, generateToolFromMethod, generateToolManifest, getActiveAuditOptions, getAdapterInfo, getAuthorizedChangesSince, getAuthorizedTenantScopedChangesSince, getCacheGeneration, getChangeFeedSensitiveTables, getChangesSince, getClassConfigResolvers, getClassName, getConfigResolver, getDatabaseEngine, getPackageFromQualifiedName, getRetentionTasks, getSQLFromDiff, getSystemTableShapes, getTableVersion, getTenantScopedChangesSince, hasActionableChanges, hasBrowserOption, hasChangeFeedEntryVisibilityHook, hasChangeFeedTableAuthorizerHook, helpToMarkdown, importOptionalDependency, invalidateCollectionCache, isAbortedTransactionError, isAdvisoryOnlyChange, isAudited, isChangeFeedDenyAll, isChangeFeedEntryVisible, isChangeFeedSensitiveTable, isCrudOperation, isCrudToolAction, isDatabaseInterface, isDeterministicDatabaseError, isEmbeddedDatabase, isFieldUIFormat, isFieldUIWidget, isFrameworkBaseClass, isFromPackage, isLazyConfigSentinel, isManualOrAdvisoryChange, isMockableProvider, isNotNullViolationError, isPostgresDatabase, isQualifiedName, isRelationshipRole, isScopedPackageName, isSensitiveConnectionParam, isServerProvider, isSmrtCollectionExtendsName, isStaleWrite, isTenantScopedClassResolved, isTransientDatabaseError, isType, isUniqueViolationError, isValid, listConfigResolvers, manyToMany, meta, method, migratePostgresSystemTimestamps, normalizeCustomActionFailure, normalizeDataQueryRequest, normalizeDataQueryResult, normalizeDataQuerySchema, normalizeOnDelete, normalizeTypedHttpError, oneToMany, parse, parseHelp, parseQualifiedName, parseSyncApplyBatch, payloadMatchesRow, planForeignKeyCreation, planPostgresPermissions, planPostgresSystemTimestampMigrations, postgresRevisionCandidates, postgresRevisionCondition, processSyncApplyBatch, pruneAiUsage, pruneChangeFeed, pruneExpiredContexts, pruneRunOnceClaims, qualifiedNamesEqual, queryStringDecoderFor, readDispatchHealth, readJobHealth, readMethodDecoratorConfig, readMigrationStatus, readRecentChanges, readRegistryDrift, readScheduleHealth, readSystemDiagnostics, redactDatabaseUrl, redactDatabaseUrlsInText, registerChangeFeedWriter, registerCompatibleFieldDecorator, registerCompatibleMethodDecorator, registerConfigResolver, registerFilesystemAdapterFactory, registerOptionalDependency, registerRetentionTask, renderHelp, requireAuditOptions, resetChangeFeedWarnings, resetChangeSignals, resetCollectionCache, resetConfigResolvers, resetVerifiedTables, resolveApiMethodExposure, resolveAuthorizedChangeFeedTables, resolveCustomActionMetadata, resolveDatabase, resolveDbCacheKey, resolveDeclaredScopeMismatch, resolveDispatchTenantId, resolveDispatchTenantScope, resolveDisplayLabelField, resolveEffectiveActionMetadata, resolveGetStringFilter, resolveHelp, resolveLazyConfig, resolveListLimit, resolveListOffset, resolveOperationPermissionAlias, resolvePostgresTimeouts, runCascadeDelete, runRetentionSweep, runWithTenantGate, safeParse, safeStringify, setChangeFeedAuthorizer, setChangeFeedEntryVisibility, setDispatchTenantResolver, setTenantEntryPointRunner, setTenantScopedClassResolver, shouldIncludeMethod, smrt, smrt as smrtRegistry, stopCacheInvalidationListeners, stopChangeSignalListeners, stringify, subscribeToChangeSignals, tableExists, toCustomActionBoolean, toCustomActionDate, toCustomActionNumber, toSnakeCase, unregisterChangeFeedWriter, unregisterConfigResolver, unregisterRetentionTask, usesEmbeddedRevisionFallback, validateHelp, validatePostgresPermissionContract, validateSyncApplyItem, validateToolCall, withAuditContext, withEmbeddedWriteQueue, withEmbeddedWriteTransaction, writeAudit };
|
|
91
|
+
export { AIError, AiUsageCollector, AiUsagePersistenceHandler, CACHE_INVALIDATION_CHANNEL, CHANGE_FEED_CREDENTIAL_TABLES, CHANGE_FEED_INTERCEPTOR_NAME, CHANGE_FEED_TABLE, CHANGE_SIGNAL_CHANNEL, CRUD_OPERATIONS, ConfigurationError, ContentHasher, CosineSimilarity, DEFAULT_AI_COST_RATES, DEFAULT_CHANGES_LIMIT, DEFAULT_DATA_QUERY_PAGE_LIMIT, DEFAULT_DATA_QUERY_RESULT_BYTES, DEFAULT_DISPLAY_LABEL_FIELDS, DEFAULT_EMBEDDING_CONFIG, DEFAULT_FACET_LIMIT, DEFAULT_LEARNING_CONFIG, DEFAULT_LIST_LIMIT, DEFAULT_LIST_ORDER_BY, DEFAULT_POSTGRES_TIMEOUTS, DEFAULT_RETENTION_POLICY, DIAGNOSTICS_DEFAULT_LIMIT, DataQueryValidationError, DatabaseError, Dispatch, DispatchBus, DispatchCollection, DispatchSubscription, DispatchSubscriptionCollection, EmbeddingProvider, EmbeddingStorage, EmbeddingUnavailableError, ErrorUtils, FIELD_UI_FORMATS, FIELD_UI_FORMAT_TYPES, FIELD_UI_WIDGETS, FIELD_UI_WIDGET_TYPES, FilesystemError, GlobalInterceptors, IN_LIST_CHUNK_SIZE, LearningMemory, LiveSchemaParityError, MAX_CHANGES_LIMIT, MAX_DATA_QUERY_CURSOR_LENGTH, MAX_DATA_QUERY_FACETS, MAX_DATA_QUERY_FILTERS, MAX_DATA_QUERY_FILTER_DEPTH, MAX_DATA_QUERY_IN_VALUES, MAX_DATA_QUERY_OFFSET, MAX_DATA_QUERY_PAGE_LIMIT, MAX_DATA_QUERY_REQUEST_BYTES, MAX_DATA_QUERY_RESULT_BYTES, MAX_DATA_QUERY_WARNINGS, MAX_FACET_FIELDS, MAX_FACET_LIMIT, MAX_LIST_LIMIT, MAX_STI_READ_SCOPE_TYPES, MAX_SYNC_APPLY_BATCH_SIZE, MOCK_PROVIDER_OPTION, MetricsAdapter, NetworkError, ObjectRegistry, POSTGRES_REVISION_GUARD_EXPRESSION, POSTGRES_TIMEOUT_ENV_VARS, PubSubAdapter, QueryBoundsError, QueryOrderByError, RECIPE_DEMO_MODES, RELATIONSHIP_ROLES, RunOnceClaimError, RuntimeError, SMRT_COLLECTION_BASE_NAMES, SMRT_CUSTOM_ACTION_ERROR_METADATA_KEY, SMRT_SCHEMA_VERSION, SYNC_APPLY_ROUTE_SEGMENTS, SYNC_APPLY_UUID_PATTERN, SYSTEM_DIAGNOSTICS_TABLES, SYSTEM_TABLE_NAMES, SchemaComparer, SignalBus, SignalSanitizer, SmrtClass, SmrtCollection, SmrtError, SmrtHierarchical, SmrtJunction, SmrtJunctionBase, SmrtObject, SmrtPolymorphicAssociation, SmrtRecipe, TenantIsolationError, ValidationError, ValidationReport, ValidationUtils, appendChange, appendChanges, applyOneToManyChildAccessors, applyPendingDecoratorRegistrations, applyPostgresPermissions, applyPostgresRuntimeTimeouts, applySyncWritablePolicy, assertFiniteUnitInterval, assertPostgresSystemTimestampsCurrent, assertScopedPackageName, auditChanges, auditSnapshot, broadcastCacheInvalidation, buildCascadePlan, buildConnectSection, buildCustomActionInputSchema, buildCustomActionInvocationArgs, buildDefaultListOrderBy, buildGlossary, bumpChangeFeed, canonicalizeDataQuery, cascadeReferencesTo, checkLiveSchemaParity, childAccessorName, chunkArray, classifyDatabaseError, classifyDialectMessage, classifyMethodWireability, classifyParameterWireability, clearRetentionTasks, clone, coerceCustomActionArgument, collectForeignKeyOrphanCounts, config, convertTypeToJsonSchema, createClassNamePredicate, createDataQueryFingerprint, createDispatchBus, createFilesystemAdapter, createGeneratedCollectionAccess, createInterceptorContext, createManifestClassNamePredicate, createQualifiedName, createRecipeHelp, createSmrtClient, crossPackageRef, customActionParameterInputName, declareChangeFeedSensitiveTable, declaredTypeAcceptsDate, declaresRuntimeRestRoute, declaresRuntimeRestRouteShape, deriveRecipeDemo, describeDisplayLabel, detectEngine, displayLabelFieldProblem, drainChangeFeed, effectiveRecipeDemo, ensureBootstrapSystemTableCompatibility, ensureCacheInvalidationListener, ensureChangeFeedTable, ensureDeferredSystemTableCompatibility, ensureDispatchSubscriptionsSystemTableCompatibility, ensureDispatchSystemTableCompatibility, ensureJobEventsSystemTableCompatibility, ensureJobsSystemTableCompatibility, ensureLegacySystemTableCompatibility, ensureSystemTables, estimateAiUsageCost, executeCollectionReadPlan, executeDecision, executeToolCall, executeToolCalls, extractFieldRefs, field, fieldTypeToJsonSchema, filterVisibleChangeFeedEntries, findField, findSelectorFor, foreignKey, formatToolResults, generateDDLForEngine, generateSchemaDiff, generateToolFromMethod, generateToolManifest, getActiveAuditOptions, getAdapterInfo, getAuthorizedChangesSince, getAuthorizedTenantScopedChangesSince, getCacheGeneration, getChangeFeedSensitiveTables, getChangesSince, getClassConfigResolvers, getClassName, getConfigResolver, getDatabaseEngine, getPackageFromQualifiedName, getRetentionTasks, getSQLFromDiff, getSystemTableShapes, getTableVersion, getTenantScopedChangesSince, hasActionableChanges, hasBrowserOption, hasChangeFeedEntryVisibilityHook, hasChangeFeedTableAuthorizerHook, helpToMarkdown, importOptionalDependency, invalidateCollectionCache, isAbortedTransactionError, isAdvisoryOnlyChange, isAudited, isChangeFeedDenyAll, isChangeFeedEntryVisible, isChangeFeedSensitiveTable, isCrudOperation, isCrudToolAction, isDatabaseInterface, isDeterministicDatabaseError, isEmbeddedDatabase, isFieldUIFormat, isFieldUIWidget, isFrameworkBaseClass, isFromPackage, isLazyConfigSentinel, isManualOrAdvisoryChange, isMockableProvider, isNotNullViolationError, isPostgresDatabase, isQualifiedName, isRelationshipRole, isScopedPackageName, isSensitiveConnectionParam, isServerProvider, isSmrtCollectionExtendsName, isStaleWrite, isTenantScopedClassResolved, isTransientDatabaseError, isType, isUniqueViolationError, isValid, listConfigResolvers, manyToMany, meta, method, migratePostgresSystemTimestamps, normalizeCustomActionFailure, normalizeDataQueryRequest, normalizeDataQueryResult, normalizeDataQuerySchema, normalizeOnDelete, normalizeTypedHttpError, oneToMany, parse, parseHelp, parseQualifiedName, parseSyncApplyBatch, payloadMatchesRow, planForeignKeyCreation, planPostgresPermissions, planPostgresSystemTimestampMigrations, postgresRevisionCandidates, postgresRevisionCondition, processSyncApplyBatch, pruneAiUsage, pruneChangeFeed, pruneExpiredContexts, pruneRunOnceClaims, qualifiedNamesEqual, queryStringDecoderFor, readDispatchHealth, readJobHealth, readMethodDecoratorConfig, readMigrationStatus, readRecentChanges, readRegistryDrift, readScheduleHealth, readSystemDiagnostics, redactDatabaseUrl, redactDatabaseUrlsInText, registerChangeFeedWriter, registerCompatibleFieldDecorator, registerCompatibleMethodDecorator, registerConfigResolver, registerFilesystemAdapterFactory, registerOptionalDependency, registerRetentionTask, renderHelp, requireAuditOptions, resetChangeFeedWarnings, resetChangeSignals, resetCollectionCache, resetConfigResolvers, resetVerifiedTables, resolveApiMethodExposure, resolveAuthorizedChangeFeedTables, resolveCustomActionMetadata, resolveDatabase, resolveDbCacheKey, resolveDeclaredScopeMismatch, resolveDispatchTenantId, resolveDispatchTenantScope, resolveDisplayLabelField, resolveEffectiveActionMetadata, resolveGetStringFilter, resolveHelp, resolveLazyConfig, resolveListLimit, resolveListOffset, resolveOperationPermissionAlias, resolvePostgresTimeouts, runCascadeDelete, runRetentionSweep, runWithTenantGate, safeParse, safeStringify, setChangeFeedAuthorizer, setChangeFeedEntryVisibility, setDispatchTenantResolver, setTenantEntryPointRunner, setTenantScopedClassResolver, shouldIncludeMethod, smrt, smrt as smrtRegistry, stopCacheInvalidationListeners, stopChangeSignalListeners, stringify, subscribeToChangeSignals, tableExists, toCustomActionBoolean, toCustomActionDate, toCustomActionNumber, toSnakeCase, unregisterChangeFeedWriter, unregisterConfigResolver, unregisterRetentionTask, usesEmbeddedRevisionFallback, validateHelp, validatePostgresPermissionContract, validateSyncApplyItem, validateToolCall, withAuditContext, withEmbeddedWriteQueue, withEmbeddedWriteTransaction, writeAudit };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/cookbook/engine/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,2BAA2B,CAAC;AA6B7E,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,EAEb,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,uFAAuF;AACvF,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,QAAQ,CAAC;IACd,0DAA0D;IAC1D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,MAAM,OAAO,GACf;IACE,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAEvC,eAAO,MAAM,IAAI,GACf,MAAM,gBAAgB,EACtB,SAAS,MAAM,EACf,QAAO;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAO,KAC/D,OAA8D,CAAC;AAalE,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,eAAO,MAAM,iBAAiB,GAAI,KAAK,QAAQ,KAAG,MACb,CAAC;AAEtC;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAUrE;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,GAAG,IAAI,GAChB,MAAM,GAAG,SAAS,CAEpB;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../../src/cookbook/engine/commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,2BAA2B,CAAC;AA6B7E,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,aAAa,EAEb,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,uFAAuF;AACvF,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,QAAQ,CAAC;IACd,0DAA0D;IAC1D,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,MAAM,OAAO,GACf;IACE,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAEvC,eAAO,MAAM,IAAI,GACf,MAAM,gBAAgB,EACtB,SAAS,MAAM,EACf,QAAO;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAO,KAC/D,OAA8D,CAAC;AAalE,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAQpD;AAED,eAAO,MAAM,iBAAiB,GAAI,KAAK,QAAQ,KAAG,MACb,CAAC;AAEtC;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAUrE;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,GAAG,IAAI,GAChB,MAAM,GAAG,SAAS,CAEpB;AAkbD,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,CAAC,SAAS,WAAW,EAC3C,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GACtB,OAAO,CAIT"}
|
|
@@ -156,6 +156,18 @@ var handlers = {
|
|
|
156
156
|
parts.push(`terms ${terms}`);
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
|
+
if (input.pricesIncludeTax !== void 0) {
|
|
160
|
+
if (input.pricesIncludeTax !== before.pricesIncludeTax) {
|
|
161
|
+
next.pricesIncludeTax = input.pricesIncludeTax;
|
|
162
|
+
parts.push(input.pricesIncludeTax ? "prices include tax" : "prices exclude tax");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (input.taxRounding !== void 0) {
|
|
166
|
+
if (input.taxRounding !== before.taxRounding) {
|
|
167
|
+
next.taxRounding = input.taxRounding;
|
|
168
|
+
parts.push(`${input.taxRounding} tax rounding`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
159
171
|
if (!parts.length) return done(state);
|
|
160
172
|
const text = parts.join(", ");
|
|
161
173
|
return done(withDoc(state, writeSettings(catalog, state.doc, next)), `${text[0].toUpperCase()}${text.slice(1)}.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","names":[],"sources":["../../../src/cookbook/engine/commands.ts"],"sourcesContent":["import type { Cookbook, CookbookPolicyRow } from '@happyvertical/smrt-types';\nimport { validateCookbook } from '../validate.js';\nimport {\n type AppSettings,\n canonical,\n clone,\n coveredModels,\n describeTheme,\n diagnose,\n isEmptyCookbook,\n mergeChanges,\n prune,\n readSettings,\n withFeaturesChanged,\n withRecipesAdded,\n withRecipesRemoved,\n withRequirements,\n withThemePatch,\n writeSettings,\n} from './document.js';\nimport {\n buildNav,\n findModel,\n humanize,\n modelLabel,\n withHidden,\n withItemRenamed,\n withSectionRenamed,\n} from './nav.js';\nimport type {\n CommandError,\n CommandErrorCode,\n CommandInputs,\n CommandName,\n EngineCatalog,\n ExportData,\n RecipeChanges,\n ValidateData,\n} from './types.js';\n\n/** What the engine holds besides its counters: the document and where it came from. */\nexport interface PlanState {\n doc: Cookbook;\n /** The library cookbook the plan was last set up from. */\n applied: string | null;\n}\n\nexport type Outcome =\n | {\n ok: true;\n state: PlanState;\n summary: string;\n changes?: RecipeChanges;\n data?: unknown;\n warnings?: string[];\n }\n | { ok: false; error: CommandError };\n\nexport const fail = (\n code: CommandErrorCode,\n message: string,\n extra: { path?: string; details?: Record<string, unknown> } = {},\n): Outcome => ({ ok: false, error: { code, message, ...extra } });\n\nconst done = (\n state: PlanState,\n summary = '',\n extra: Partial<Extract<Outcome, { ok: true }>> = {},\n): Outcome => ({ ok: true, state, summary, ...extra });\n\nconst REPLACE_NEEDED =\n 'This replaces the recipes, options, menu and look. Send replace: true to confirm.';\n\nconst list = (values: readonly string[]) => values.join(', ');\n\n/** The file name an export gets: a slug of the app name. */\nexport function exportFileName(name?: string): string {\n const slug = (name ?? '')\n .normalize('NFD')\n .replace(/\\p{M}/gu, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return `${slug || 'my-app'}.cookbook.json`;\n}\n\nexport const serializeCookbook = (doc: Cookbook): string =>\n `${JSON.stringify(doc, null, 2)}\\n`;\n\n/**\n * A document from outside (a library entry, an import, a restored state) as\n * the engine holds it: requirements included, options pruned to what is\n * covered. Recipe and feature ids the catalog lacks stay, reported as\n * `unavailable`, so a round trip loses nothing.\n */\nexport function adopt(catalog: EngineCatalog, doc: Cookbook): Cookbook {\n const byId = new Map(catalog.recipes.map((r) => [r.id, r]));\n const known = doc.recipes.filter((id) => byId.has(id));\n const unknown = doc.recipes.filter((id) => !byId.has(id));\n return canonical(\n prune(catalog, {\n ...clone(doc),\n recipes: [...withRequirements(known, byId), ...unknown],\n }),\n );\n}\n\nexport function libraryName(\n catalog: EngineCatalog,\n id: string | null,\n): string | undefined {\n return id ? catalog.cookbooks?.find((c) => c.id === id)?.name : undefined;\n}\n\nconst describeChange = (catalog: EngineCatalog, changes: RecipeChanges) => {\n const label = (id: string) =>\n catalog.recipes.find((r) => r.id === id)?.label ?? id;\n return [\n changes.added.length ? `Added ${list(changes.added.map(label))}.` : '',\n changes.removed.length\n ? `Removed ${list(changes.removed.map(label))}.`\n : '',\n changes.kept.length\n ? `Kept ${list(changes.kept.map(label))} (needed).`\n : '',\n ]\n .filter(Boolean)\n .join(' ');\n};\n\nconst describeFeatures = (catalog: EngineCatalog, changes: RecipeChanges) =>\n [\n changes.added.length\n ? `Added ${list(changes.added.map((id) => modelLabel(catalog, id)))}.`\n : '',\n changes.removed.length\n ? `Removed ${list(changes.removed.map((id) => modelLabel(catalog, id)))}.`\n : '',\n ]\n .filter(Boolean)\n .join(' ');\n\nconst percent = (fraction: number) => `${Number((fraction * 100).toFixed(4))}%`;\n\ntype Handler<N extends CommandName> = (\n catalog: EngineCatalog,\n state: PlanState,\n input: CommandInputs[N],\n) => Outcome;\n\nconst withDoc = (state: PlanState, doc: Cookbook): PlanState => ({\n ...state,\n doc: canonical(doc),\n});\n\nfunction navOf(catalog: EngineCatalog, doc: Cookbook) {\n const sections = buildNav(catalog, doc);\n return {\n sections,\n section: (id: string) => sections.find((s) => s.id === id),\n item: (id: string) =>\n sections.flatMap((s) => s.items).find((i) => i.id === id),\n };\n}\n\nconst setLayout = (doc: Cookbook, layout: Cookbook['layout']): Cookbook => {\n const next = { ...doc };\n if (layout) next.layout = layout;\n else delete next.layout;\n return next;\n};\n\nconst handlers: { [N in CommandName]?: Handler<N> } = {\n add_recipes(catalog, state, { ids }) {\n const missing = ids.filter(\n (id) => !catalog.recipes.some((r) => r.id === id),\n );\n if (missing.length) {\n return fail('not_found', `No such recipe: ${list(missing)}.`, {\n path: 'input.ids',\n });\n }\n const { doc, changes } = withRecipesAdded(catalog, state.doc, ids);\n return done(withDoc(state, doc), describeChange(catalog, changes), {\n changes,\n });\n },\n remove_recipes(catalog, state, { ids }) {\n const { doc, changes } = withRecipesRemoved(catalog, state.doc, ids);\n return done(withDoc(state, doc), describeChange(catalog, changes), {\n changes,\n });\n },\n add_features(catalog, state, { ids }) {\n const missing = ids.filter((id) => !findModel(catalog, id)?.exposed);\n if (missing.length) {\n return fail('not_found', `No such model to add: ${list(missing)}.`, {\n path: 'input.ids',\n });\n }\n const { doc, changes } = withFeaturesChanged(catalog, state.doc, ids, true);\n return done(withDoc(state, doc), describeFeatures(catalog, changes), {\n changes,\n });\n },\n remove_features(catalog, state, { ids }) {\n const { doc, changes } = withFeaturesChanged(\n catalog,\n state.doc,\n ids,\n false,\n );\n return done(withDoc(state, doc), describeFeatures(catalog, changes), {\n changes,\n });\n },\n add_cookbook(catalog, state, { id }) {\n const book = catalog.cookbooks?.find((c) => c.id === id);\n if (!book)\n return fail('not_found', `No cookbook \"${id}\".`, { path: 'input.id' });\n const recipes = withRecipesAdded(catalog, state.doc, book.document.recipes);\n const features = withFeaturesChanged(\n catalog,\n recipes.doc,\n book.document.features.filter((f) => findModel(catalog, f)?.exposed),\n true,\n );\n const changes = mergeChanges(recipes.changes, features.changes);\n return done(\n withDoc(state, features.doc),\n changes.added.length ? `Added the ${book.name} cookbook.` : '',\n { changes },\n );\n },\n remove_cookbook(catalog, state, { id }) {\n const book = catalog.cookbooks?.find((c) => c.id === id);\n if (!book)\n return fail('not_found', `No cookbook \"${id}\".`, { path: 'input.id' });\n const recipes = withRecipesRemoved(\n catalog,\n state.doc,\n book.document.recipes,\n );\n const features = withFeaturesChanged(\n catalog,\n recipes.doc,\n book.document.features,\n false,\n );\n const changes = mergeChanges(recipes.changes, features.changes);\n return done(\n withDoc(state, features.doc),\n [\n describeChange(catalog, recipes.changes),\n describeFeatures(catalog, features.changes),\n ]\n .filter(Boolean)\n .join(' '),\n { changes },\n );\n },\n apply_cookbook(catalog, state, { id, replace }) {\n const book = catalog.cookbooks?.find((c) => c.id === id);\n if (!book)\n return fail('not_found', `No cookbook \"${id}\".`, { path: 'input.id' });\n if (!replace && !isEmptyCookbook(state.doc)) {\n return fail('confirmation_required', REPLACE_NEEDED);\n }\n return done(\n { doc: adopt(catalog, book.document), applied: id },\n `${book.name} set up.`,\n );\n },\n import_cookbook(catalog, state, { document, replace }) {\n const checked = validateCookbook(document);\n if (!checked.ok) {\n return fail('invalid_input', checked.errors[0] ?? 'Not a cookbook.', {\n path: 'input.document',\n details: { errors: checked.errors },\n });\n }\n if (!replace && !isEmptyCookbook(state.doc)) {\n return fail('confirmation_required', REPLACE_NEEDED);\n }\n const n = checked.cookbook.recipes.length;\n return done(\n { doc: adopt(catalog, checked.cookbook), applied: null },\n `Imported ${n} ${n === 1 ? 'recipe' : 'recipes'}.`,\n checked.warnings.length ? { warnings: checked.warnings } : {},\n );\n },\n set_settings(catalog, state, input) {\n const before = readSettings(catalog, state.doc);\n const next: AppSettings = { ...before };\n const parts: string[] = [];\n if (input.currency !== undefined) {\n const code = input.currency.trim().toUpperCase();\n if (catalog.currencies && !catalog.currencies.includes(code)) {\n return fail('invalid_input', `${code} is not a known currency.`, {\n path: 'input.currency',\n });\n }\n if (!/^[A-Z]{3}$/.test(code)) {\n return fail('invalid_input', 'currency must be a three-letter code.', {\n path: 'input.currency',\n });\n }\n if (code !== before.currency) {\n next.currency = code;\n parts.push(`currency ${code}`);\n }\n }\n if (input.taxRate !== undefined) {\n const fraction = Number((input.taxRate / 100).toFixed(6));\n if (fraction !== before.taxRate) {\n next.taxRate = fraction;\n parts.push(`tax ${percent(fraction)}`);\n }\n }\n if (input.paymentTerms !== undefined) {\n const terms = [...input.paymentTerms]\n .map((ch) =>\n ch.charCodeAt(0) < 32 || ch.charCodeAt(0) === 127 ? ' ' : ch,\n )\n .join('')\n .trim();\n if (!terms) {\n return fail('invalid_input', 'paymentTerms must not be empty.', {\n path: 'input.paymentTerms',\n });\n }\n if (terms !== before.paymentTerms) {\n next.paymentTerms = terms;\n parts.push(`terms ${terms}`);\n }\n }\n if (!parts.length) return done(state);\n const text = parts.join(', ');\n return done(\n withDoc(state, writeSettings(catalog, state.doc, next)),\n `${text[0].toUpperCase()}${text.slice(1)}.`,\n );\n },\n set_policy(catalog, state, input) {\n const model = findModel(catalog, input.model);\n if (!model)\n return fail('not_found', `No such model: ${input.model}.`, {\n path: 'input.model',\n });\n if (model.fields) {\n const field = model.fields.find((f) => f.name === input.field);\n if (!field || field.system) {\n return fail('not_found', `${model.name} has no field ${input.field}.`, {\n path: 'input.field',\n });\n }\n }\n if (!coveredModels(catalog, state.doc).has(model.id)) {\n return fail(\n 'not_found',\n `${humanize(model.name)} is not in the app yet; add its recipe or feature first.`,\n { path: 'input.model' },\n );\n }\n const locked = state.doc.recipes.some(\n (id) =>\n catalog.recipes.find((r) => r.id === id)?.options?.[model.id]?.fields?.[\n input.field\n ]?.locked,\n );\n if (locked)\n return fail('failed', `${input.field} is locked by its recipe.`, {\n path: 'input.field',\n });\n const rows = state.doc.policies.map((row) => ({ ...row }));\n const existing = rows.find(\n (r) => r.objectRef === model.id && r.fieldName === input.field,\n );\n const row: CookbookPolicyRow = existing ?? {\n objectRef: model.id,\n fieldName: input.field,\n scopeType: 'app',\n };\n const before = JSON.stringify(row);\n for (const key of ['visibility', 'label', 'help'] as const) {\n const value = input[key];\n if (value === undefined) continue;\n if (value === null) delete row[key];\n else (row as unknown as Record<string, unknown>)[key] = value;\n }\n if (input.defaultValue !== undefined) {\n if (input.defaultValue === null) delete row.defaultValue;\n else {\n const encoded = JSON.stringify(input.defaultValue);\n if (encoded === undefined) {\n return fail('invalid_input', 'defaultValue is not a JSON value.', {\n path: 'input.defaultValue',\n });\n }\n row.defaultValue = encoded;\n }\n }\n // A row with only its identity says nothing: it is removed, not stored.\n const empty = Object.keys(row).length <= 3;\n if (JSON.stringify(row) === before || (empty && !existing))\n return done(state);\n const rest = rows.filter((r) => r !== existing);\n return done(\n withDoc(state, { ...state.doc, policies: empty ? rest : [...rest, row] }),\n `Updated ${humanize(model.name)} ${input.field}.`,\n );\n },\n set_theme(_catalog, state, input) {\n const doc = withThemePatch(state.doc, input);\n if (\n JSON.stringify(canonical(doc).theme ?? null) ===\n JSON.stringify(state.doc.theme ?? null)\n ) {\n return done(state);\n }\n return done(\n withDoc(state, doc),\n `Theme: ${describeTheme(canonical(doc).theme)}.`,\n );\n },\n reset_theme(_catalog, state) {\n if (!state.doc.theme) return done(state);\n const doc = { ...state.doc };\n delete doc.theme;\n return done(withDoc(state, doc), 'Theme: default.');\n },\n set_name(_catalog, state, input) {\n const doc = { ...state.doc };\n for (const key of ['name', 'description'] as const) {\n const value = input[key];\n if (value === undefined) continue;\n const clean = value?.trim();\n if (clean) doc[key] = clean;\n else delete doc[key];\n }\n if (JSON.stringify(canonical(doc)) === JSON.stringify(state.doc))\n return done(state);\n return done(\n withDoc(state, doc),\n input.name\n ? `Named the app ${input.name.trim()}.`\n : 'Updated the app details.',\n );\n },\n rename_section(catalog, state, { id, label }) {\n const section = navOf(catalog, state.doc).section(id);\n if (!section)\n return fail('not_found', `No menu section \"${id}\".`, {\n path: 'input.id',\n });\n const layout = withSectionRenamed(state.doc.layout, section, label);\n return JSON.stringify(layout ?? null) ===\n JSON.stringify(state.doc.layout ?? null)\n ? done(state)\n : done(\n withDoc(state, setLayout(state.doc, layout)),\n `Renamed the section to ${label.trim()}.`,\n );\n },\n rename_item(catalog, state, { id, label }) {\n const item = navOf(catalog, state.doc).item(id);\n if (!item)\n return fail('not_found', `No menu entry \"${id}\".`, { path: 'input.id' });\n const layout = withItemRenamed(state.doc.layout, item, label);\n return JSON.stringify(layout ?? null) ===\n JSON.stringify(state.doc.layout ?? null)\n ? done(state)\n : done(\n withDoc(state, setLayout(state.doc, layout)),\n label\n ? `Renamed the entry to ${label.trim()}.`\n : 'Entry name restored.',\n );\n },\n hide(catalog, state, { id }) {\n const nav = navOf(catalog, state.doc);\n const target = nav.section(id) ?? nav.item(id);\n if (!target)\n return fail('not_found', `No menu section or entry \"${id}\".`, {\n path: 'input.id',\n });\n if (state.doc.layout?.hidden?.includes(id)) return done(state);\n return done(\n withDoc(\n state,\n setLayout(state.doc, withHidden(state.doc.layout, id, true)),\n ),\n 'Hidden.',\n );\n },\n show(catalog, state, { id }) {\n const nav = navOf(catalog, state.doc);\n if (!nav.section(id) && !nav.item(id)) {\n return fail('not_found', `No menu section or entry \"${id}\".`, {\n path: 'input.id',\n });\n }\n if (!state.doc.layout?.hidden?.includes(id)) return done(state);\n return done(\n withDoc(\n state,\n setLayout(state.doc, withHidden(state.doc.layout, id, false)),\n ),\n 'Shown.',\n );\n },\n validate(catalog, state) {\n const diagnostics = diagnose(catalog, state.doc);\n const data: ValidateData = {\n ok: !diagnostics.some((d) => d.severity === 'error'),\n diagnostics,\n };\n return done(state, '', { data });\n },\n export_cookbook(catalog, state, { name }) {\n const fileName = exportFileName(\n name ?? state.doc.name ?? libraryName(catalog, state.applied),\n );\n const data: ExportData = {\n fileName,\n text: serializeCookbook(state.doc),\n cookbook: clone(state.doc),\n };\n return done(state, '', { data });\n },\n};\n\n/** Run one validated command over a state. Pure: returns the next state, never mutates. */\nexport function execute<N extends CommandName>(\n catalog: EngineCatalog,\n state: PlanState,\n name: N,\n input: CommandInputs[N],\n): Outcome {\n const handler = handlers[name] as Handler<N> | undefined;\n if (!handler) return fail('unknown_command', `No command \"${name}\".`);\n return handler(catalog, state, input);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"commands.js","names":[],"sources":["../../../src/cookbook/engine/commands.ts"],"sourcesContent":["import type { Cookbook, CookbookPolicyRow } from '@happyvertical/smrt-types';\nimport { validateCookbook } from '../validate.js';\nimport {\n type AppSettings,\n canonical,\n clone,\n coveredModels,\n describeTheme,\n diagnose,\n isEmptyCookbook,\n mergeChanges,\n prune,\n readSettings,\n withFeaturesChanged,\n withRecipesAdded,\n withRecipesRemoved,\n withRequirements,\n withThemePatch,\n writeSettings,\n} from './document.js';\nimport {\n buildNav,\n findModel,\n humanize,\n modelLabel,\n withHidden,\n withItemRenamed,\n withSectionRenamed,\n} from './nav.js';\nimport type {\n CommandError,\n CommandErrorCode,\n CommandInputs,\n CommandName,\n EngineCatalog,\n ExportData,\n RecipeChanges,\n ValidateData,\n} from './types.js';\n\n/** What the engine holds besides its counters: the document and where it came from. */\nexport interface PlanState {\n doc: Cookbook;\n /** The library cookbook the plan was last set up from. */\n applied: string | null;\n}\n\nexport type Outcome =\n | {\n ok: true;\n state: PlanState;\n summary: string;\n changes?: RecipeChanges;\n data?: unknown;\n warnings?: string[];\n }\n | { ok: false; error: CommandError };\n\nexport const fail = (\n code: CommandErrorCode,\n message: string,\n extra: { path?: string; details?: Record<string, unknown> } = {},\n): Outcome => ({ ok: false, error: { code, message, ...extra } });\n\nconst done = (\n state: PlanState,\n summary = '',\n extra: Partial<Extract<Outcome, { ok: true }>> = {},\n): Outcome => ({ ok: true, state, summary, ...extra });\n\nconst REPLACE_NEEDED =\n 'This replaces the recipes, options, menu and look. Send replace: true to confirm.';\n\nconst list = (values: readonly string[]) => values.join(', ');\n\n/** The file name an export gets: a slug of the app name. */\nexport function exportFileName(name?: string): string {\n const slug = (name ?? '')\n .normalize('NFD')\n .replace(/\\p{M}/gu, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return `${slug || 'my-app'}.cookbook.json`;\n}\n\nexport const serializeCookbook = (doc: Cookbook): string =>\n `${JSON.stringify(doc, null, 2)}\\n`;\n\n/**\n * A document from outside (a library entry, an import, a restored state) as\n * the engine holds it: requirements included, options pruned to what is\n * covered. Recipe and feature ids the catalog lacks stay, reported as\n * `unavailable`, so a round trip loses nothing.\n */\nexport function adopt(catalog: EngineCatalog, doc: Cookbook): Cookbook {\n const byId = new Map(catalog.recipes.map((r) => [r.id, r]));\n const known = doc.recipes.filter((id) => byId.has(id));\n const unknown = doc.recipes.filter((id) => !byId.has(id));\n return canonical(\n prune(catalog, {\n ...clone(doc),\n recipes: [...withRequirements(known, byId), ...unknown],\n }),\n );\n}\n\nexport function libraryName(\n catalog: EngineCatalog,\n id: string | null,\n): string | undefined {\n return id ? catalog.cookbooks?.find((c) => c.id === id)?.name : undefined;\n}\n\nconst describeChange = (catalog: EngineCatalog, changes: RecipeChanges) => {\n const label = (id: string) =>\n catalog.recipes.find((r) => r.id === id)?.label ?? id;\n return [\n changes.added.length ? `Added ${list(changes.added.map(label))}.` : '',\n changes.removed.length\n ? `Removed ${list(changes.removed.map(label))}.`\n : '',\n changes.kept.length\n ? `Kept ${list(changes.kept.map(label))} (needed).`\n : '',\n ]\n .filter(Boolean)\n .join(' ');\n};\n\nconst describeFeatures = (catalog: EngineCatalog, changes: RecipeChanges) =>\n [\n changes.added.length\n ? `Added ${list(changes.added.map((id) => modelLabel(catalog, id)))}.`\n : '',\n changes.removed.length\n ? `Removed ${list(changes.removed.map((id) => modelLabel(catalog, id)))}.`\n : '',\n ]\n .filter(Boolean)\n .join(' ');\n\nconst percent = (fraction: number) => `${Number((fraction * 100).toFixed(4))}%`;\n\ntype Handler<N extends CommandName> = (\n catalog: EngineCatalog,\n state: PlanState,\n input: CommandInputs[N],\n) => Outcome;\n\nconst withDoc = (state: PlanState, doc: Cookbook): PlanState => ({\n ...state,\n doc: canonical(doc),\n});\n\nfunction navOf(catalog: EngineCatalog, doc: Cookbook) {\n const sections = buildNav(catalog, doc);\n return {\n sections,\n section: (id: string) => sections.find((s) => s.id === id),\n item: (id: string) =>\n sections.flatMap((s) => s.items).find((i) => i.id === id),\n };\n}\n\nconst setLayout = (doc: Cookbook, layout: Cookbook['layout']): Cookbook => {\n const next = { ...doc };\n if (layout) next.layout = layout;\n else delete next.layout;\n return next;\n};\n\nconst handlers: { [N in CommandName]?: Handler<N> } = {\n add_recipes(catalog, state, { ids }) {\n const missing = ids.filter(\n (id) => !catalog.recipes.some((r) => r.id === id),\n );\n if (missing.length) {\n return fail('not_found', `No such recipe: ${list(missing)}.`, {\n path: 'input.ids',\n });\n }\n const { doc, changes } = withRecipesAdded(catalog, state.doc, ids);\n return done(withDoc(state, doc), describeChange(catalog, changes), {\n changes,\n });\n },\n remove_recipes(catalog, state, { ids }) {\n const { doc, changes } = withRecipesRemoved(catalog, state.doc, ids);\n return done(withDoc(state, doc), describeChange(catalog, changes), {\n changes,\n });\n },\n add_features(catalog, state, { ids }) {\n const missing = ids.filter((id) => !findModel(catalog, id)?.exposed);\n if (missing.length) {\n return fail('not_found', `No such model to add: ${list(missing)}.`, {\n path: 'input.ids',\n });\n }\n const { doc, changes } = withFeaturesChanged(catalog, state.doc, ids, true);\n return done(withDoc(state, doc), describeFeatures(catalog, changes), {\n changes,\n });\n },\n remove_features(catalog, state, { ids }) {\n const { doc, changes } = withFeaturesChanged(\n catalog,\n state.doc,\n ids,\n false,\n );\n return done(withDoc(state, doc), describeFeatures(catalog, changes), {\n changes,\n });\n },\n add_cookbook(catalog, state, { id }) {\n const book = catalog.cookbooks?.find((c) => c.id === id);\n if (!book)\n return fail('not_found', `No cookbook \"${id}\".`, { path: 'input.id' });\n const recipes = withRecipesAdded(catalog, state.doc, book.document.recipes);\n const features = withFeaturesChanged(\n catalog,\n recipes.doc,\n book.document.features.filter((f) => findModel(catalog, f)?.exposed),\n true,\n );\n const changes = mergeChanges(recipes.changes, features.changes);\n return done(\n withDoc(state, features.doc),\n changes.added.length ? `Added the ${book.name} cookbook.` : '',\n { changes },\n );\n },\n remove_cookbook(catalog, state, { id }) {\n const book = catalog.cookbooks?.find((c) => c.id === id);\n if (!book)\n return fail('not_found', `No cookbook \"${id}\".`, { path: 'input.id' });\n const recipes = withRecipesRemoved(\n catalog,\n state.doc,\n book.document.recipes,\n );\n const features = withFeaturesChanged(\n catalog,\n recipes.doc,\n book.document.features,\n false,\n );\n const changes = mergeChanges(recipes.changes, features.changes);\n return done(\n withDoc(state, features.doc),\n [\n describeChange(catalog, recipes.changes),\n describeFeatures(catalog, features.changes),\n ]\n .filter(Boolean)\n .join(' '),\n { changes },\n );\n },\n apply_cookbook(catalog, state, { id, replace }) {\n const book = catalog.cookbooks?.find((c) => c.id === id);\n if (!book)\n return fail('not_found', `No cookbook \"${id}\".`, { path: 'input.id' });\n if (!replace && !isEmptyCookbook(state.doc)) {\n return fail('confirmation_required', REPLACE_NEEDED);\n }\n return done(\n { doc: adopt(catalog, book.document), applied: id },\n `${book.name} set up.`,\n );\n },\n import_cookbook(catalog, state, { document, replace }) {\n const checked = validateCookbook(document);\n if (!checked.ok) {\n return fail('invalid_input', checked.errors[0] ?? 'Not a cookbook.', {\n path: 'input.document',\n details: { errors: checked.errors },\n });\n }\n if (!replace && !isEmptyCookbook(state.doc)) {\n return fail('confirmation_required', REPLACE_NEEDED);\n }\n const n = checked.cookbook.recipes.length;\n return done(\n { doc: adopt(catalog, checked.cookbook), applied: null },\n `Imported ${n} ${n === 1 ? 'recipe' : 'recipes'}.`,\n checked.warnings.length ? { warnings: checked.warnings } : {},\n );\n },\n set_settings(catalog, state, input) {\n const before = readSettings(catalog, state.doc);\n const next: AppSettings = { ...before };\n const parts: string[] = [];\n if (input.currency !== undefined) {\n const code = input.currency.trim().toUpperCase();\n if (catalog.currencies && !catalog.currencies.includes(code)) {\n return fail('invalid_input', `${code} is not a known currency.`, {\n path: 'input.currency',\n });\n }\n if (!/^[A-Z]{3}$/.test(code)) {\n return fail('invalid_input', 'currency must be a three-letter code.', {\n path: 'input.currency',\n });\n }\n if (code !== before.currency) {\n next.currency = code;\n parts.push(`currency ${code}`);\n }\n }\n if (input.taxRate !== undefined) {\n const fraction = Number((input.taxRate / 100).toFixed(6));\n if (fraction !== before.taxRate) {\n next.taxRate = fraction;\n parts.push(`tax ${percent(fraction)}`);\n }\n }\n if (input.paymentTerms !== undefined) {\n const terms = [...input.paymentTerms]\n .map((ch) =>\n ch.charCodeAt(0) < 32 || ch.charCodeAt(0) === 127 ? ' ' : ch,\n )\n .join('')\n .trim();\n if (!terms) {\n return fail('invalid_input', 'paymentTerms must not be empty.', {\n path: 'input.paymentTerms',\n });\n }\n if (terms !== before.paymentTerms) {\n next.paymentTerms = terms;\n parts.push(`terms ${terms}`);\n }\n }\n if (input.pricesIncludeTax !== undefined) {\n if (input.pricesIncludeTax !== before.pricesIncludeTax) {\n next.pricesIncludeTax = input.pricesIncludeTax;\n parts.push(\n input.pricesIncludeTax ? 'prices include tax' : 'prices exclude tax',\n );\n }\n }\n if (input.taxRounding !== undefined) {\n if (input.taxRounding !== before.taxRounding) {\n next.taxRounding = input.taxRounding;\n parts.push(`${input.taxRounding} tax rounding`);\n }\n }\n if (!parts.length) return done(state);\n const text = parts.join(', ');\n return done(\n withDoc(state, writeSettings(catalog, state.doc, next)),\n `${text[0].toUpperCase()}${text.slice(1)}.`,\n );\n },\n set_policy(catalog, state, input) {\n const model = findModel(catalog, input.model);\n if (!model)\n return fail('not_found', `No such model: ${input.model}.`, {\n path: 'input.model',\n });\n if (model.fields) {\n const field = model.fields.find((f) => f.name === input.field);\n if (!field || field.system) {\n return fail('not_found', `${model.name} has no field ${input.field}.`, {\n path: 'input.field',\n });\n }\n }\n if (!coveredModels(catalog, state.doc).has(model.id)) {\n return fail(\n 'not_found',\n `${humanize(model.name)} is not in the app yet; add its recipe or feature first.`,\n { path: 'input.model' },\n );\n }\n const locked = state.doc.recipes.some(\n (id) =>\n catalog.recipes.find((r) => r.id === id)?.options?.[model.id]?.fields?.[\n input.field\n ]?.locked,\n );\n if (locked)\n return fail('failed', `${input.field} is locked by its recipe.`, {\n path: 'input.field',\n });\n const rows = state.doc.policies.map((row) => ({ ...row }));\n const existing = rows.find(\n (r) => r.objectRef === model.id && r.fieldName === input.field,\n );\n const row: CookbookPolicyRow = existing ?? {\n objectRef: model.id,\n fieldName: input.field,\n scopeType: 'app',\n };\n const before = JSON.stringify(row);\n for (const key of ['visibility', 'label', 'help'] as const) {\n const value = input[key];\n if (value === undefined) continue;\n if (value === null) delete row[key];\n else (row as unknown as Record<string, unknown>)[key] = value;\n }\n if (input.defaultValue !== undefined) {\n if (input.defaultValue === null) delete row.defaultValue;\n else {\n const encoded = JSON.stringify(input.defaultValue);\n if (encoded === undefined) {\n return fail('invalid_input', 'defaultValue is not a JSON value.', {\n path: 'input.defaultValue',\n });\n }\n row.defaultValue = encoded;\n }\n }\n // A row with only its identity says nothing: it is removed, not stored.\n const empty = Object.keys(row).length <= 3;\n if (JSON.stringify(row) === before || (empty && !existing))\n return done(state);\n const rest = rows.filter((r) => r !== existing);\n return done(\n withDoc(state, { ...state.doc, policies: empty ? rest : [...rest, row] }),\n `Updated ${humanize(model.name)} ${input.field}.`,\n );\n },\n set_theme(_catalog, state, input) {\n const doc = withThemePatch(state.doc, input);\n if (\n JSON.stringify(canonical(doc).theme ?? null) ===\n JSON.stringify(state.doc.theme ?? null)\n ) {\n return done(state);\n }\n return done(\n withDoc(state, doc),\n `Theme: ${describeTheme(canonical(doc).theme)}.`,\n );\n },\n reset_theme(_catalog, state) {\n if (!state.doc.theme) return done(state);\n const doc = { ...state.doc };\n delete doc.theme;\n return done(withDoc(state, doc), 'Theme: default.');\n },\n set_name(_catalog, state, input) {\n const doc = { ...state.doc };\n for (const key of ['name', 'description'] as const) {\n const value = input[key];\n if (value === undefined) continue;\n const clean = value?.trim();\n if (clean) doc[key] = clean;\n else delete doc[key];\n }\n if (JSON.stringify(canonical(doc)) === JSON.stringify(state.doc))\n return done(state);\n return done(\n withDoc(state, doc),\n input.name\n ? `Named the app ${input.name.trim()}.`\n : 'Updated the app details.',\n );\n },\n rename_section(catalog, state, { id, label }) {\n const section = navOf(catalog, state.doc).section(id);\n if (!section)\n return fail('not_found', `No menu section \"${id}\".`, {\n path: 'input.id',\n });\n const layout = withSectionRenamed(state.doc.layout, section, label);\n return JSON.stringify(layout ?? null) ===\n JSON.stringify(state.doc.layout ?? null)\n ? done(state)\n : done(\n withDoc(state, setLayout(state.doc, layout)),\n `Renamed the section to ${label.trim()}.`,\n );\n },\n rename_item(catalog, state, { id, label }) {\n const item = navOf(catalog, state.doc).item(id);\n if (!item)\n return fail('not_found', `No menu entry \"${id}\".`, { path: 'input.id' });\n const layout = withItemRenamed(state.doc.layout, item, label);\n return JSON.stringify(layout ?? null) ===\n JSON.stringify(state.doc.layout ?? null)\n ? done(state)\n : done(\n withDoc(state, setLayout(state.doc, layout)),\n label\n ? `Renamed the entry to ${label.trim()}.`\n : 'Entry name restored.',\n );\n },\n hide(catalog, state, { id }) {\n const nav = navOf(catalog, state.doc);\n const target = nav.section(id) ?? nav.item(id);\n if (!target)\n return fail('not_found', `No menu section or entry \"${id}\".`, {\n path: 'input.id',\n });\n if (state.doc.layout?.hidden?.includes(id)) return done(state);\n return done(\n withDoc(\n state,\n setLayout(state.doc, withHidden(state.doc.layout, id, true)),\n ),\n 'Hidden.',\n );\n },\n show(catalog, state, { id }) {\n const nav = navOf(catalog, state.doc);\n if (!nav.section(id) && !nav.item(id)) {\n return fail('not_found', `No menu section or entry \"${id}\".`, {\n path: 'input.id',\n });\n }\n if (!state.doc.layout?.hidden?.includes(id)) return done(state);\n return done(\n withDoc(\n state,\n setLayout(state.doc, withHidden(state.doc.layout, id, false)),\n ),\n 'Shown.',\n );\n },\n validate(catalog, state) {\n const diagnostics = diagnose(catalog, state.doc);\n const data: ValidateData = {\n ok: !diagnostics.some((d) => d.severity === 'error'),\n diagnostics,\n };\n return done(state, '', { data });\n },\n export_cookbook(catalog, state, { name }) {\n const fileName = exportFileName(\n name ?? state.doc.name ?? libraryName(catalog, state.applied),\n );\n const data: ExportData = {\n fileName,\n text: serializeCookbook(state.doc),\n cookbook: clone(state.doc),\n };\n return done(state, '', { data });\n },\n};\n\n/** Run one validated command over a state. Pure: returns the next state, never mutates. */\nexport function execute<N extends CommandName>(\n catalog: EngineCatalog,\n state: PlanState,\n name: N,\n input: CommandInputs[N],\n): Outcome {\n const handler = handlers[name] as Handler<N> | undefined;\n if (!handler) return fail('unknown_command', `No command \"${name}\".`);\n return handler(catalog, state, input);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/cookbook/engine/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAMlD,CAAC;AACF,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,gBAAgB,WAAW,CAAC;AACzC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAInC,gEAAgE;AAChE,eAAO,MAAM,wBAAwB,EAAE,
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/cookbook/engine/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAMlD,CAAC;AACF,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,oBAAoB,WAAW,CAAC;AAC7C,eAAO,MAAM,gBAAgB,WAAW,CAAC;AACzC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAInC,gEAAgE;AAChE,eAAO,MAAM,wBAAwB,EAAE,cA2BtC,CAAC"}
|
|
@@ -29,6 +29,14 @@ var COMMERCE_SETTING_TARGETS = {
|
|
|
29
29
|
model: `${C}${model}`,
|
|
30
30
|
field: "taxRate"
|
|
31
31
|
})),
|
|
32
|
+
pricesIncludeTax: ["Invoice", "Contract"].map((model) => ({
|
|
33
|
+
model: `${C}${model}`,
|
|
34
|
+
field: "lineAmountType"
|
|
35
|
+
})),
|
|
36
|
+
taxRounding: ["Invoice", "Contract"].map((model) => ({
|
|
37
|
+
model: `${C}${model}`,
|
|
38
|
+
field: "taxRoundingScope"
|
|
39
|
+
})),
|
|
32
40
|
paymentTerms: [...[
|
|
33
41
|
"Order",
|
|
34
42
|
"WholesaleOrder",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","names":[],"sources":["../../../src/cookbook/engine/defaults.ts"],"sourcesContent":["import type { SettingTargets } from './types.js';\n\n/** smrt-ui's built-in presets (kept as data so the engine imports no UI package). */\nexport const DEFAULT_THEME_PRESETS: readonly string[] = [\n 'material',\n 'glass',\n 'studio',\n 'smrt',\n 'happyvertical',\n];\nexport const DEFAULT_PRESET = 'smrt';\nexport const DEFAULT_COLOR_SCHEME = 'system';\nexport const DEFAULT_APP_NAME = 'my-app';\nexport const MAX_TERMS_LENGTH = 40;\n\nconst C = '@happyvertical/smrt-commerce:';\n\n/** The commerce fields the app settings are the defaults of. */\nexport const COMMERCE_SETTING_TARGETS: SettingTargets = {\n currency: [\n 'Order',\n 'PurchaseOrder',\n 'WholesaleOrder',\n 'Estimate',\n 'Invoice',\n 'Agreement',\n ].map((model) => ({ model: `${C}${model}`, field: 'currency' })),\n taxRate: ['InvoiceLineItem', 'ContractLineItem'].map((model) => ({\n model: `${C}${model}`,\n field: 'taxRate',\n })),\n paymentTerms: [\n ...['Order', 'WholesaleOrder', 'Estimate', 'Invoice', 'Agreement'].map(\n (model) => ({ model: `${C}${model}`, field: 'terms' }),\n ),\n { model: `${C}Customer`, field: 'paymentTerms' },\n ],\n};\n"],"mappings":";;AAGA,IAAa,wBAA2C;CACtD;CACA;CACA;CACA;CACA;AACF;AACA,IAAa,iBAAiB;AAC9B,IAAa,uBAAuB;AACpC,IAAa,mBAAmB;AAChC,IAAa,mBAAmB;AAEhC,IAAM,IAAI;;AAGV,IAAa,2BAA2C;CACtD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,WAAW;EAAE,OAAO,GAAG,IAAI;EAAS,OAAO;CAAW,EAAE;CAC/D,SAAS,CAAC,mBAAmB,kBAAkB,CAAC,CAAC,KAAK,WAAW;EAC/D,OAAO,GAAG,IAAI;EACd,OAAO;CACT,EAAE;CACF,cAAc,CACZ,GAAG;EAAC;EAAS;EAAkB;EAAY;EAAW;CAAW,CAAC,CAAC,KAChE,WAAW;EAAE,OAAO,GAAG,IAAI;EAAS,OAAO;CAAQ,EACtD,GACA;EAAE,OAAO,GAAG,EAAE;EAAW,OAAO;CAAe,CACjD;AACF"}
|
|
1
|
+
{"version":3,"file":"defaults.js","names":[],"sources":["../../../src/cookbook/engine/defaults.ts"],"sourcesContent":["import type { SettingTargets } from './types.js';\n\n/** smrt-ui's built-in presets (kept as data so the engine imports no UI package). */\nexport const DEFAULT_THEME_PRESETS: readonly string[] = [\n 'material',\n 'glass',\n 'studio',\n 'smrt',\n 'happyvertical',\n];\nexport const DEFAULT_PRESET = 'smrt';\nexport const DEFAULT_COLOR_SCHEME = 'system';\nexport const DEFAULT_APP_NAME = 'my-app';\nexport const MAX_TERMS_LENGTH = 40;\n\nconst C = '@happyvertical/smrt-commerce:';\n\n/** The commerce fields the app settings are the defaults of. */\nexport const COMMERCE_SETTING_TARGETS: SettingTargets = {\n currency: [\n 'Order',\n 'PurchaseOrder',\n 'WholesaleOrder',\n 'Estimate',\n 'Invoice',\n 'Agreement',\n ].map((model) => ({ model: `${C}${model}`, field: 'currency' })),\n taxRate: ['InvoiceLineItem', 'ContractLineItem'].map((model) => ({\n model: `${C}${model}`,\n field: 'taxRate',\n })),\n pricesIncludeTax: ['Invoice', 'Contract'].map((model) => ({\n model: `${C}${model}`,\n field: 'lineAmountType',\n })),\n taxRounding: ['Invoice', 'Contract'].map((model) => ({\n model: `${C}${model}`,\n field: 'taxRoundingScope',\n })),\n paymentTerms: [\n ...['Order', 'WholesaleOrder', 'Estimate', 'Invoice', 'Agreement'].map(\n (model) => ({ model: `${C}${model}`, field: 'terms' }),\n ),\n { model: `${C}Customer`, field: 'paymentTerms' },\n ],\n};\n"],"mappings":";;AAGA,IAAa,wBAA2C;CACtD;CACA;CACA;CACA;CACA;AACF;AACA,IAAa,iBAAiB;AAC9B,IAAa,uBAAuB;AACpC,IAAa,mBAAmB;AAChC,IAAa,mBAAmB;AAEhC,IAAM,IAAI;;AAGV,IAAa,2BAA2C;CACtD,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,WAAW;EAAE,OAAO,GAAG,IAAI;EAAS,OAAO;CAAW,EAAE;CAC/D,SAAS,CAAC,mBAAmB,kBAAkB,CAAC,CAAC,KAAK,WAAW;EAC/D,OAAO,GAAG,IAAI;EACd,OAAO;CACT,EAAE;CACF,kBAAkB,CAAC,WAAW,UAAU,CAAC,CAAC,KAAK,WAAW;EACxD,OAAO,GAAG,IAAI;EACd,OAAO;CACT,EAAE;CACF,aAAa,CAAC,WAAW,UAAU,CAAC,CAAC,KAAK,WAAW;EACnD,OAAO,GAAG,IAAI;EACd,OAAO;CACT,EAAE;CACF,cAAc,CACZ,GAAG;EAAC;EAAS;EAAkB;EAAY;EAAW;CAAW,CAAC,CAAC,KAChE,WAAW;EAAE,OAAO,GAAG,IAAI;EAAS,OAAO;CAAQ,EACtD,GACA;EAAE,OAAO,GAAG,EAAE;EAAW,OAAO;CAAe,CACjD;AACF"}
|
|
@@ -36,6 +36,10 @@ export interface AppSettings {
|
|
|
36
36
|
/** A fraction: 0.0825 is 8.25%. */
|
|
37
37
|
taxRate: number;
|
|
38
38
|
paymentTerms: string;
|
|
39
|
+
/** Whether new document prices are tax-inclusive. */
|
|
40
|
+
pricesIncludeTax: boolean;
|
|
41
|
+
/** Whether tax rounds per line or per document component. */
|
|
42
|
+
taxRounding: 'line' | 'document';
|
|
39
43
|
}
|
|
40
44
|
export declare const DEFAULT_SETTINGS: Readonly<AppSettings>;
|
|
41
45
|
/** The app's settings: the first stored row of each, else the defaults. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/cookbook/engine/document.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAER,aAAa,EACd,MAAM,2BAA2B,CAAC;AAanC,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAC;AAOpB,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,CACkB,CAAC;AAEvD,eAAO,MAAM,IAAI,GAAI,GAAG,OAAO,EAAE,GAAG,OAAO,KAAG,OACW,CAAC;AAE1D,eAAO,MAAM,aAAa,QAAO,QAM/B,CAAC;AAEH,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAUtD;AAID;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAsDjD;AAOD,wEAAwE;AACxE,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,EACrB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,GACzC,MAAM,EAAE,CAwBV;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,QAAQ,GACZ,GAAG,CAAC,MAAM,CAAC,CAMb;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CAErE;AAQD,4EAA4E;AAC5E,wBAAgB,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAgBrE;AAwBD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB;IAAE,GAAG,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAS3C;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB;IAAE,GAAG,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAqB3C;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,EAAE,EAAE,OAAO,GACV;IAAE,GAAG,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,CAa3C;AAED,eAAO,MAAM,YAAY,GACvB,GAAG,aAAa,EAChB,GAAG,aAAa,KACf,aAID,CAAC;AAIH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/cookbook/engine/document.ts"],"names":[],"mappings":"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"}
|
|
@@ -180,12 +180,16 @@ var mergeChanges = (a, b) => ({
|
|
|
180
180
|
var DEFAULT_SETTINGS = {
|
|
181
181
|
currency: "USD",
|
|
182
182
|
taxRate: 0,
|
|
183
|
-
paymentTerms: ""
|
|
183
|
+
paymentTerms: "",
|
|
184
|
+
pricesIncludeTax: false,
|
|
185
|
+
taxRounding: "line"
|
|
184
186
|
};
|
|
185
187
|
var SETTING_KEYS = [
|
|
186
188
|
"currency",
|
|
187
189
|
"taxRate",
|
|
188
|
-
"paymentTerms"
|
|
190
|
+
"paymentTerms",
|
|
191
|
+
"pricesIncludeTax",
|
|
192
|
+
"taxRounding"
|
|
189
193
|
];
|
|
190
194
|
function rowValue(row) {
|
|
191
195
|
if (row?.defaultValue === void 0 || row.defaultValue === null) return void 0;
|
|
@@ -209,9 +213,13 @@ function readSettings(catalog, doc) {
|
|
|
209
213
|
const currency = first("currency", "string");
|
|
210
214
|
const taxRate = first("taxRate", "number");
|
|
211
215
|
const paymentTerms = first("paymentTerms", "string");
|
|
216
|
+
const lineAmountType = first("pricesIncludeTax", "string");
|
|
217
|
+
const taxRounding = first("taxRounding", "string");
|
|
212
218
|
if (typeof currency === "string") out.currency = currency;
|
|
213
219
|
if (typeof taxRate === "number") out.taxRate = taxRate;
|
|
214
220
|
if (typeof paymentTerms === "string") out.paymentTerms = paymentTerms;
|
|
221
|
+
if (lineAmountType === "inclusive" || lineAmountType === "exclusive") out.pricesIncludeTax = lineAmountType === "inclusive";
|
|
222
|
+
if (taxRounding === "line" || taxRounding === "document") out.taxRounding = taxRounding;
|
|
215
223
|
return out;
|
|
216
224
|
}
|
|
217
225
|
var isUnset = (v) => v === void 0 || v === null || v === "";
|
|
@@ -234,7 +242,7 @@ function writeSettings(catalog, doc, settings) {
|
|
|
234
242
|
let policies = doc.policies.map((row) => ({ ...row }));
|
|
235
243
|
for (const key of SETTING_KEYS) {
|
|
236
244
|
const raw = settings[key];
|
|
237
|
-
const value = key === "paymentTerms" ? String(raw).trim() : key === "currency" ? String(raw).trim().toUpperCase() : raw;
|
|
245
|
+
const value = key === "paymentTerms" ? String(raw).trim() : key === "currency" ? String(raw).trim().toUpperCase() : key === "pricesIncludeTax" ? raw ? "inclusive" : "exclusive" : raw;
|
|
238
246
|
for (const { model, field } of targets[key]) {
|
|
239
247
|
const seed = seedDefault(catalog, doc, model, field);
|
|
240
248
|
const wanted = !isUnset(value) && !(!isUnset(seed) && seed === value) && !(isUnset(seed) && key === "taxRate" && value === 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document.js","names":[],"sources":["../../../src/cookbook/engine/document.ts"],"sourcesContent":["import type {\n Cookbook,\n CookbookPolicyRow,\n CookbookTheme,\n} from '@happyvertical/smrt-types';\nimport {\n COOKBOOK_SCHEMA_URL,\n COOKBOOK_VERSION,\n validateCookbook,\n} from '../validate.js';\nimport {\n COMMERCE_SETTING_TARGETS,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_PRESET,\n DEFAULT_THEME_PRESETS,\n} from './defaults.js';\nimport { buildNav, findModel } from './nav.js';\nimport type {\n Diagnostic,\n EngineCatalog,\n EngineRecipe,\n RecipeChanges,\n SettingTargets,\n} from './types.js';\n\n/*\n * Pure document rules: every function takes a cookbook and returns a new one.\n * The engine holds a document and calls these; nothing here keeps state.\n */\n\nexport const clone = <T>(value: T): T =>\n value === undefined ? value : structuredClone(value);\n\nexport const same = (a: unknown, b: unknown): boolean =>\n JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n\nexport const emptyCookbook = (): Cookbook => ({\n $schema: COOKBOOK_SCHEMA_URL,\n version: COOKBOOK_VERSION,\n recipes: [],\n features: [],\n policies: [],\n});\n\n/** Does the document hold nothing yet (so replacing it needs no say-so)? */\nexport function isEmptyCookbook(doc: Cookbook): boolean {\n return (\n !doc.recipes.length &&\n !doc.features.length &&\n !doc.policies.length &&\n !Object.keys(doc.exposure ?? {}).length &&\n !doc.layout &&\n !doc.theme &&\n !Object.keys(doc.overviews ?? {}).length\n );\n}\n\nconst sortedUnique = (ids: Iterable<string>) => [...new Set(ids)].sort();\n\n/**\n * The document in its stable shape: sorted ids, sorted policies, empty optional\n * sections absent, key order fixed. Unknown top-level keys are kept (additive\n * fields in v1). Two engines given the same commands export identical text.\n */\nexport function canonical(doc: Cookbook): Cookbook {\n const known = new Set([\n '$schema',\n 'version',\n 'name',\n 'description',\n 'recipes',\n 'features',\n 'policies',\n 'exposure',\n 'layout',\n 'theme',\n 'overviews',\n ]);\n const out: Cookbook = {\n $schema: COOKBOOK_SCHEMA_URL,\n version: COOKBOOK_VERSION,\n ...(doc.name ? { name: doc.name } : {}),\n ...(doc.description ? { description: doc.description } : {}),\n recipes: sortedUnique(doc.recipes),\n features: sortedUnique(doc.features),\n policies: [...doc.policies]\n .sort(\n (a, b) =>\n a.objectRef.localeCompare(b.objectRef) ||\n a.fieldName.localeCompare(b.fieldName),\n )\n .map((row) => ({ ...row })),\n };\n const exposure = Object.fromEntries(\n Object.keys(doc.exposure ?? {})\n .sort()\n .filter((ref) => doc.exposure?.[ref]?.length)\n .map((ref) => [ref, [...(doc.exposure?.[ref] ?? [])].sort()]),\n );\n if (Object.keys(exposure).length) {\n out.exposure = exposure as NonNullable<Cookbook['exposure']>;\n }\n if (doc.layout) out.layout = clone(doc.layout);\n const theme = compactTheme(doc.theme);\n if (theme) out.theme = theme;\n const overviews = Object.entries(doc.overviews ?? {}).sort(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0,\n );\n if (overviews.length) {\n out.overviews = Object.fromEntries(\n overviews.map(([id, value]) => [id, clone(value)]),\n );\n }\n for (const [key, value] of Object.entries(doc)) {\n if (!known.has(key))\n (out as unknown as Record<string, unknown>)[key] = clone(value);\n }\n return out;\n}\n\n// ---- recipes ---------------------------------------------------------------\n\nconst recipeMap = (catalog: EngineCatalog) =>\n new Map(catalog.recipes.map((r) => [r.id, r]));\n\n/** `ids` plus everything they transitively require, as a sorted set. */\nexport function withRequirements(\n ids: Iterable<string>,\n recipes: ReadonlyMap<string, EngineRecipe>,\n): string[] {\n const result = new Set<string>();\n const visit = (id: string) => {\n const recipe = recipes.get(id);\n if (!recipe || result.has(id)) return;\n result.add(id);\n for (const required of recipe.requires) visit(required);\n };\n for (const id of ids) visit(id);\n let changed = true;\n while (changed) {\n changed = false;\n for (const id of [...result]) {\n for (const alternatives of recipes.get(id)?.requiresAny ?? []) {\n if (alternatives.some((alt) => result.has(alt))) continue;\n const first = alternatives.find((alt) => recipes.has(alt));\n if (first) {\n visit(first);\n changed = true;\n }\n }\n }\n }\n return sortedUnique(result);\n}\n\n/** Models the added recipes and features cover. */\nexport function coveredModels(\n catalog: EngineCatalog,\n doc: Cookbook,\n): Set<string> {\n const byId = recipeMap(catalog);\n return new Set([\n ...doc.recipes.flatMap((id) => byId.get(id)?.models ?? []),\n ...doc.features,\n ]);\n}\n\nexport function settingTargets(catalog: EngineCatalog): SettingTargets {\n return catalog.settingTargets ?? COMMERCE_SETTING_TARGETS;\n}\n\nfunction isSettingRow(catalog: EngineCatalog, row: CookbookPolicyRow): boolean {\n return Object.values(settingTargets(catalog)).some((targets) =>\n targets.some((t) => t.model === row.objectRef && t.field === row.fieldName),\n );\n}\n\n/** Drop options for models nothing covers any more (settings rows stay). */\nexport function prune(catalog: EngineCatalog, doc: Cookbook): Cookbook {\n const covered = coveredModels(catalog, doc);\n const next: Cookbook = {\n ...doc,\n policies: doc.policies.filter(\n (r) => covered.has(r.objectRef) || isSettingRow(catalog, r),\n ),\n };\n if (doc.exposure) {\n const exposure = Object.fromEntries(\n Object.entries(doc.exposure).filter(([ref]) => covered.has(ref)),\n );\n if (Object.keys(exposure).length) next.exposure = exposure;\n else delete next.exposure;\n }\n return next;\n}\n\nconst knownRecipeIds = (catalog: EngineCatalog, doc: Cookbook) => {\n const byId = recipeMap(catalog);\n return doc.recipes.filter((id) => byId.has(id));\n};\n\nconst unknownRecipeIds = (catalog: EngineCatalog, doc: Cookbook) => {\n const byId = recipeMap(catalog);\n return doc.recipes.filter((id) => !byId.has(id));\n};\n\nfunction diff(\n before: string[],\n after: string[],\n): Pick<RecipeChanges, 'added' | 'removed'> {\n const b = new Set(before);\n const a = new Set(after);\n return {\n added: after.filter((id) => !b.has(id)),\n removed: before.filter((id) => !a.has(id)),\n };\n}\n\nexport function withRecipesAdded(\n catalog: EngineCatalog,\n doc: Cookbook,\n ids: readonly string[],\n): { doc: Cookbook; changes: RecipeChanges } {\n const byId = recipeMap(catalog);\n const before = knownRecipeIds(catalog, doc);\n const known = withRequirements([...before, ...ids], byId);\n const next = {\n ...doc,\n recipes: sortedUnique([...known, ...unknownRecipeIds(catalog, doc)]),\n };\n return { doc: next, changes: { ...diff(before, known), kept: [] } };\n}\n\nexport function withRecipesRemoved(\n catalog: EngineCatalog,\n doc: Cookbook,\n ids: readonly string[],\n): { doc: Cookbook; changes: RecipeChanges } {\n const byId = recipeMap(catalog);\n const before = knownRecipeIds(catalog, doc);\n const removing = new Set(ids);\n const known = withRequirements(\n before.filter((id) => !removing.has(id)),\n byId,\n );\n const next = prune(catalog, {\n ...doc,\n recipes: sortedUnique([...known, ...unknownRecipeIds(catalog, doc)]),\n });\n const { added, removed } = diff(before, known);\n return {\n doc: next,\n changes: {\n added,\n removed,\n kept: ids.filter((id) => known.includes(id) && before.includes(id)),\n },\n };\n}\n\nexport function withFeaturesChanged(\n catalog: EngineCatalog,\n doc: Cookbook,\n ids: readonly string[],\n on: boolean,\n): { doc: Cookbook; changes: RecipeChanges } {\n const set = new Set(doc.features);\n for (const id of ids) {\n if (on) set.add(id);\n else set.delete(id);\n }\n const features = [...set].sort();\n let next: Cookbook = { ...doc, features };\n if (!on) next = prune(catalog, next);\n return {\n doc: next,\n changes: { ...diff(doc.features, features), kept: [] },\n };\n}\n\nexport const mergeChanges = (\n a: RecipeChanges,\n b: RecipeChanges,\n): RecipeChanges => ({\n added: [...a.added, ...b.added],\n removed: [...a.removed, ...b.removed],\n kept: [...a.kept, ...b.kept],\n});\n\n// ---- settings --------------------------------------------------------------\n\nexport interface AppSettings {\n currency: string;\n /** A fraction: 0.0825 is 8.25%. */\n taxRate: number;\n paymentTerms: string;\n}\n\nexport const DEFAULT_SETTINGS: Readonly<AppSettings> = {\n currency: 'USD',\n taxRate: 0,\n paymentTerms: '',\n};\n\nconst SETTING_KEYS = ['currency', 'taxRate', 'paymentTerms'] as const;\n\nfunction rowValue(row: CookbookPolicyRow | undefined): unknown {\n if (row?.defaultValue === undefined || row.defaultValue === null)\n return undefined;\n try {\n return JSON.parse(row.defaultValue);\n } catch {\n return undefined;\n }\n}\n\nconst findRow = (\n policies: readonly CookbookPolicyRow[],\n model: string,\n field: string,\n) =>\n policies.find(\n (r) =>\n r.scopeType === 'app' && r.objectRef === model && r.fieldName === field,\n );\n\n/** The app's settings: the first stored row of each, else the defaults. */\nexport function readSettings(\n catalog: EngineCatalog,\n doc: Cookbook,\n): AppSettings {\n const targets = settingTargets(catalog);\n const out: AppSettings = { ...DEFAULT_SETTINGS };\n const first = (key: keyof AppSettings, type: 'number' | 'string') => {\n for (const { model, field } of targets[key]) {\n const value = rowValue(findRow(doc.policies, model, field));\n if (typeof value === type) return value;\n }\n return undefined;\n };\n const currency = first('currency', 'string');\n const taxRate = first('taxRate', 'number');\n const paymentTerms = first('paymentTerms', 'string');\n if (typeof currency === 'string') out.currency = currency;\n if (typeof taxRate === 'number') out.taxRate = taxRate;\n if (typeof paymentTerms === 'string') out.paymentTerms = paymentTerms;\n return out;\n}\n\nconst isUnset = (v: unknown) => v === undefined || v === null || v === '';\n\nfunction seedDefault(\n catalog: EngineCatalog,\n doc: Cookbook,\n modelId: string,\n field: string,\n): unknown {\n const byId = recipeMap(catalog);\n for (const id of doc.recipes) {\n const hint = byId.get(id)?.options?.[modelId]?.fields?.[field];\n if (hint && 'default' in hint) return hint.default;\n }\n return findModel(catalog, modelId)?.fields?.find((f) => f.name === field)\n ?.default;\n}\n\n/**\n * The document with the settings written as app-scope policy rows. A row is\n * written for every model a setting covers (covered or not, so a recipe added\n * later picks it up) and only where the value differs from what the model\n * starts as; otherwise the row's default is removed. Other row keys are kept.\n */\nexport function writeSettings(\n catalog: EngineCatalog,\n doc: Cookbook,\n settings: AppSettings,\n): Cookbook {\n const targets = settingTargets(catalog);\n let policies = doc.policies.map((row) => ({ ...row }));\n for (const key of SETTING_KEYS) {\n const raw = settings[key];\n const value =\n key === 'paymentTerms'\n ? String(raw).trim()\n : key === 'currency'\n ? String(raw).trim().toUpperCase()\n : raw;\n for (const { model, field } of targets[key]) {\n const seed = seedDefault(catalog, doc, model, field);\n const wanted =\n !isUnset(value) &&\n !(!isUnset(seed) && seed === value) &&\n !(isUnset(seed) && key === 'taxRate' && value === 0);\n const existing = findRow(policies, model, field);\n if (wanted) {\n const encoded = JSON.stringify(value);\n if (existing) existing.defaultValue = encoded;\n else\n policies.push({\n objectRef: model,\n fieldName: field,\n scopeType: 'app',\n defaultValue: encoded,\n });\n } else if (existing) {\n delete existing.defaultValue;\n if (Object.keys(existing).length <= 3) {\n policies = policies.filter((r) => r !== existing);\n }\n }\n }\n }\n return { ...doc, policies };\n}\n\n// ---- theme -----------------------------------------------------------------\n\nexport function compactTheme(\n theme: CookbookTheme | undefined,\n): CookbookTheme | undefined {\n if (!theme) return undefined;\n const out: CookbookTheme = {};\n if (theme.preset) out.preset = theme.preset;\n if (theme.colorScheme) out.colorScheme = theme.colorScheme;\n if (theme.borderRadius) out.borderRadius = theme.borderRadius;\n if (theme.density) out.density = theme.density;\n if (theme.contrast) out.contrast = theme.contrast;\n if (theme.fontFamily) out.fontFamily = theme.fontFamily;\n if (theme.custom) out.custom = { ...theme.custom };\n if (theme.customCss) out.customCss = theme.customCss;\n return Object.keys(out).length ? out : undefined;\n}\n\nexport function describeTheme(theme: CookbookTheme | undefined): string {\n const scheme = theme?.colorScheme ?? DEFAULT_COLOR_SCHEME;\n const base = theme?.custom\n ? `brand colour ${theme.custom.primary}`\n : (theme?.preset ?? DEFAULT_PRESET);\n return scheme === 'system' ? base : `${base}, ${scheme}`;\n}\n\n/** A preset replaces a brand colour; a brand colour sits on the preset; the scheme is kept. */\nexport function withThemePatch(\n doc: Cookbook,\n patch: {\n preset?: string;\n primary?: string;\n colorScheme?: CookbookTheme['colorScheme'];\n fontFamily?: string | null;\n borderRadius?: CookbookTheme['borderRadius'];\n density?: CookbookTheme['density'];\n contrast?: CookbookTheme['contrast'];\n },\n): Cookbook {\n const next: CookbookTheme = { ...(doc.theme ?? {}) };\n if (patch.preset) {\n next.preset = patch.preset;\n delete next.custom;\n }\n if (patch.primary) {\n next.custom = {\n primary: patch.primary.toLowerCase(),\n ...(doc.theme?.custom?.fontFamily\n ? { fontFamily: doc.theme.custom.fontFamily }\n : {}),\n };\n }\n if (patch.colorScheme) next.colorScheme = patch.colorScheme;\n if (patch.borderRadius) next.borderRadius = patch.borderRadius;\n if (patch.density) next.density = patch.density;\n if (patch.contrast) next.contrast = patch.contrast;\n if (patch.fontFamily === null) {\n // Null restores the preset font, so a legacy brand font goes too.\n delete next.fontFamily;\n if (next.custom?.fontFamily) next.custom = { primary: next.custom.primary };\n } else if (patch.fontFamily !== undefined) next.fontFamily = patch.fontFamily;\n const theme = compactTheme(next);\n const out = { ...doc };\n if (theme) out.theme = theme;\n else delete out.theme;\n return out;\n}\n\n// ---- validation ------------------------------------------------------------\n\n/**\n * Check a document against the catalog. Structural errors come from\n * `validateCookbook`; the rest need the catalog: unknown ids, unmet `requires`,\n * policy targets nothing covers, layout ids the menu does not have, theme\n * values. Errors mean the app would not build as written; warnings mean\n * something is carried but unused.\n */\nexport function diagnose(\n catalog: EngineCatalog,\n input: Cookbook,\n): Diagnostic[] {\n const out: Diagnostic[] = [];\n const add = (\n severity: Diagnostic['severity'],\n code: string,\n path: string,\n message: string,\n ) => out.push({ severity, code, path, message });\n\n const structural = validateCookbook(input);\n if (!structural.ok) {\n for (const issue of structural.diagnostics.filter(\n (diagnostic) => diagnostic.severity === 'error',\n )) {\n add('error', 'invalid_document', issue.path, issue.message);\n }\n return out;\n }\n for (const issue of structural.diagnostics) {\n add(\n issue.severity,\n issue.code === 'migrated_schema' ? 'migrated' : issue.code,\n issue.path,\n issue.message,\n );\n }\n const doc = structural.cookbook;\n const byId = recipeMap(catalog);\n\n const nav = buildNav(catalog, { ...doc, layout: undefined });\n const checked = validateCookbook(doc, {\n themePresets: catalog.themePresets ?? DEFAULT_THEME_PRESETS,\n layout: {\n sections: nav.map((section) => section.id),\n items: nav.flatMap((section) => section.items.map((item) => item.id)),\n ...(catalog.placementItems\n ? { placementItems: catalog.placementItems }\n : {}),\n },\n overviewIds: [\n ...nav.map((section) => section.id),\n ...(doc.layout?.customSections ?? []).map((section) => section.id),\n ],\n });\n for (const issue of checked.diagnostics) {\n if (\n issue.code === 'unknown_theme_preset' ||\n issue.code === 'unknown_layout_id' ||\n issue.code === 'unknown_overview'\n ) {\n add(\n issue.code === 'unknown_layout_id' &&\n !issue.path.startsWith('layout.placements.')\n ? 'warning'\n : issue.severity,\n issue.code === 'unknown_theme_preset' ? 'unknown_preset' : issue.code,\n issue.path,\n issue.message,\n );\n }\n }\n\n for (const [i, id] of doc.recipes.entries()) {\n if (!byId.has(id))\n add(\n 'error',\n 'unknown_recipe',\n `recipes[${i}]`,\n `Unknown recipe \"${id}\".`,\n );\n }\n const closure = new Set(withRequirements(doc.recipes, byId));\n for (const id of closure) {\n if (!doc.recipes.includes(id)) {\n add(\n 'error',\n 'missing_requirement',\n 'recipes',\n `A recipe needs \"${id}\", which is not listed.`,\n );\n }\n }\n for (const [i, id] of doc.features.entries()) {\n const model = findModel(catalog, id);\n if (!model)\n add('error', 'unknown_model', `features[${i}]`, `Unknown model \"${id}\".`);\n else if (model.exposed === false) {\n add(\n 'error',\n 'model_not_exposed',\n `features[${i}]`,\n `${id} cannot be added as a feature.`,\n );\n }\n }\n const covered = coveredModels(catalog, doc);\n for (const [i, row] of doc.policies.entries()) {\n const at = `policies[${i}]`;\n const model = findModel(catalog, row.objectRef);\n if (!model) {\n add(\n 'error',\n 'unknown_model',\n `${at}.objectRef`,\n `Unknown model \"${row.objectRef}\".`,\n );\n continue;\n }\n if (\n model.fields &&\n !model.fields.some((f) => f.name === row.fieldName && !f.system)\n ) {\n add(\n 'error',\n 'unknown_field',\n `${at}.fieldName`,\n `${model.name} has no field \"${row.fieldName}\".`,\n );\n }\n if (!covered.has(row.objectRef) && !isSettingRow(catalog, row)) {\n add(\n 'warning',\n 'policy_not_covered',\n at,\n `${model.name} is not in the app, so this row has no effect.`,\n );\n }\n }\n for (const ref of Object.keys(doc.exposure ?? {})) {\n if (!findModel(catalog, ref)) {\n add(\n 'error',\n 'unknown_model',\n `exposure.${ref}`,\n `Unknown model \"${ref}\".`,\n );\n }\n }\n return out;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"document.js","names":[],"sources":["../../../src/cookbook/engine/document.ts"],"sourcesContent":["import type {\n Cookbook,\n CookbookPolicyRow,\n CookbookTheme,\n} from '@happyvertical/smrt-types';\nimport {\n COOKBOOK_SCHEMA_URL,\n COOKBOOK_VERSION,\n validateCookbook,\n} from '../validate.js';\nimport {\n COMMERCE_SETTING_TARGETS,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_PRESET,\n DEFAULT_THEME_PRESETS,\n} from './defaults.js';\nimport { buildNav, findModel } from './nav.js';\nimport type {\n Diagnostic,\n EngineCatalog,\n EngineRecipe,\n RecipeChanges,\n SettingTargets,\n} from './types.js';\n\n/*\n * Pure document rules: every function takes a cookbook and returns a new one.\n * The engine holds a document and calls these; nothing here keeps state.\n */\n\nexport const clone = <T>(value: T): T =>\n value === undefined ? value : structuredClone(value);\n\nexport const same = (a: unknown, b: unknown): boolean =>\n JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n\nexport const emptyCookbook = (): Cookbook => ({\n $schema: COOKBOOK_SCHEMA_URL,\n version: COOKBOOK_VERSION,\n recipes: [],\n features: [],\n policies: [],\n});\n\n/** Does the document hold nothing yet (so replacing it needs no say-so)? */\nexport function isEmptyCookbook(doc: Cookbook): boolean {\n return (\n !doc.recipes.length &&\n !doc.features.length &&\n !doc.policies.length &&\n !Object.keys(doc.exposure ?? {}).length &&\n !doc.layout &&\n !doc.theme &&\n !Object.keys(doc.overviews ?? {}).length\n );\n}\n\nconst sortedUnique = (ids: Iterable<string>) => [...new Set(ids)].sort();\n\n/**\n * The document in its stable shape: sorted ids, sorted policies, empty optional\n * sections absent, key order fixed. Unknown top-level keys are kept (additive\n * fields in v1). Two engines given the same commands export identical text.\n */\nexport function canonical(doc: Cookbook): Cookbook {\n const known = new Set([\n '$schema',\n 'version',\n 'name',\n 'description',\n 'recipes',\n 'features',\n 'policies',\n 'exposure',\n 'layout',\n 'theme',\n 'overviews',\n ]);\n const out: Cookbook = {\n $schema: COOKBOOK_SCHEMA_URL,\n version: COOKBOOK_VERSION,\n ...(doc.name ? { name: doc.name } : {}),\n ...(doc.description ? { description: doc.description } : {}),\n recipes: sortedUnique(doc.recipes),\n features: sortedUnique(doc.features),\n policies: [...doc.policies]\n .sort(\n (a, b) =>\n a.objectRef.localeCompare(b.objectRef) ||\n a.fieldName.localeCompare(b.fieldName),\n )\n .map((row) => ({ ...row })),\n };\n const exposure = Object.fromEntries(\n Object.keys(doc.exposure ?? {})\n .sort()\n .filter((ref) => doc.exposure?.[ref]?.length)\n .map((ref) => [ref, [...(doc.exposure?.[ref] ?? [])].sort()]),\n );\n if (Object.keys(exposure).length) {\n out.exposure = exposure as NonNullable<Cookbook['exposure']>;\n }\n if (doc.layout) out.layout = clone(doc.layout);\n const theme = compactTheme(doc.theme);\n if (theme) out.theme = theme;\n const overviews = Object.entries(doc.overviews ?? {}).sort(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0,\n );\n if (overviews.length) {\n out.overviews = Object.fromEntries(\n overviews.map(([id, value]) => [id, clone(value)]),\n );\n }\n for (const [key, value] of Object.entries(doc)) {\n if (!known.has(key))\n (out as unknown as Record<string, unknown>)[key] = clone(value);\n }\n return out;\n}\n\n// ---- recipes ---------------------------------------------------------------\n\nconst recipeMap = (catalog: EngineCatalog) =>\n new Map(catalog.recipes.map((r) => [r.id, r]));\n\n/** `ids` plus everything they transitively require, as a sorted set. */\nexport function withRequirements(\n ids: Iterable<string>,\n recipes: ReadonlyMap<string, EngineRecipe>,\n): string[] {\n const result = new Set<string>();\n const visit = (id: string) => {\n const recipe = recipes.get(id);\n if (!recipe || result.has(id)) return;\n result.add(id);\n for (const required of recipe.requires) visit(required);\n };\n for (const id of ids) visit(id);\n let changed = true;\n while (changed) {\n changed = false;\n for (const id of [...result]) {\n for (const alternatives of recipes.get(id)?.requiresAny ?? []) {\n if (alternatives.some((alt) => result.has(alt))) continue;\n const first = alternatives.find((alt) => recipes.has(alt));\n if (first) {\n visit(first);\n changed = true;\n }\n }\n }\n }\n return sortedUnique(result);\n}\n\n/** Models the added recipes and features cover. */\nexport function coveredModels(\n catalog: EngineCatalog,\n doc: Cookbook,\n): Set<string> {\n const byId = recipeMap(catalog);\n return new Set([\n ...doc.recipes.flatMap((id) => byId.get(id)?.models ?? []),\n ...doc.features,\n ]);\n}\n\nexport function settingTargets(catalog: EngineCatalog): SettingTargets {\n return catalog.settingTargets ?? COMMERCE_SETTING_TARGETS;\n}\n\nfunction isSettingRow(catalog: EngineCatalog, row: CookbookPolicyRow): boolean {\n return Object.values(settingTargets(catalog)).some((targets) =>\n targets.some((t) => t.model === row.objectRef && t.field === row.fieldName),\n );\n}\n\n/** Drop options for models nothing covers any more (settings rows stay). */\nexport function prune(catalog: EngineCatalog, doc: Cookbook): Cookbook {\n const covered = coveredModels(catalog, doc);\n const next: Cookbook = {\n ...doc,\n policies: doc.policies.filter(\n (r) => covered.has(r.objectRef) || isSettingRow(catalog, r),\n ),\n };\n if (doc.exposure) {\n const exposure = Object.fromEntries(\n Object.entries(doc.exposure).filter(([ref]) => covered.has(ref)),\n );\n if (Object.keys(exposure).length) next.exposure = exposure;\n else delete next.exposure;\n }\n return next;\n}\n\nconst knownRecipeIds = (catalog: EngineCatalog, doc: Cookbook) => {\n const byId = recipeMap(catalog);\n return doc.recipes.filter((id) => byId.has(id));\n};\n\nconst unknownRecipeIds = (catalog: EngineCatalog, doc: Cookbook) => {\n const byId = recipeMap(catalog);\n return doc.recipes.filter((id) => !byId.has(id));\n};\n\nfunction diff(\n before: string[],\n after: string[],\n): Pick<RecipeChanges, 'added' | 'removed'> {\n const b = new Set(before);\n const a = new Set(after);\n return {\n added: after.filter((id) => !b.has(id)),\n removed: before.filter((id) => !a.has(id)),\n };\n}\n\nexport function withRecipesAdded(\n catalog: EngineCatalog,\n doc: Cookbook,\n ids: readonly string[],\n): { doc: Cookbook; changes: RecipeChanges } {\n const byId = recipeMap(catalog);\n const before = knownRecipeIds(catalog, doc);\n const known = withRequirements([...before, ...ids], byId);\n const next = {\n ...doc,\n recipes: sortedUnique([...known, ...unknownRecipeIds(catalog, doc)]),\n };\n return { doc: next, changes: { ...diff(before, known), kept: [] } };\n}\n\nexport function withRecipesRemoved(\n catalog: EngineCatalog,\n doc: Cookbook,\n ids: readonly string[],\n): { doc: Cookbook; changes: RecipeChanges } {\n const byId = recipeMap(catalog);\n const before = knownRecipeIds(catalog, doc);\n const removing = new Set(ids);\n const known = withRequirements(\n before.filter((id) => !removing.has(id)),\n byId,\n );\n const next = prune(catalog, {\n ...doc,\n recipes: sortedUnique([...known, ...unknownRecipeIds(catalog, doc)]),\n });\n const { added, removed } = diff(before, known);\n return {\n doc: next,\n changes: {\n added,\n removed,\n kept: ids.filter((id) => known.includes(id) && before.includes(id)),\n },\n };\n}\n\nexport function withFeaturesChanged(\n catalog: EngineCatalog,\n doc: Cookbook,\n ids: readonly string[],\n on: boolean,\n): { doc: Cookbook; changes: RecipeChanges } {\n const set = new Set(doc.features);\n for (const id of ids) {\n if (on) set.add(id);\n else set.delete(id);\n }\n const features = [...set].sort();\n let next: Cookbook = { ...doc, features };\n if (!on) next = prune(catalog, next);\n return {\n doc: next,\n changes: { ...diff(doc.features, features), kept: [] },\n };\n}\n\nexport const mergeChanges = (\n a: RecipeChanges,\n b: RecipeChanges,\n): RecipeChanges => ({\n added: [...a.added, ...b.added],\n removed: [...a.removed, ...b.removed],\n kept: [...a.kept, ...b.kept],\n});\n\n// ---- settings --------------------------------------------------------------\n\nexport interface AppSettings {\n currency: string;\n /** A fraction: 0.0825 is 8.25%. */\n taxRate: number;\n paymentTerms: string;\n /** Whether new document prices are tax-inclusive. */\n pricesIncludeTax: boolean;\n /** Whether tax rounds per line or per document component. */\n taxRounding: 'line' | 'document';\n}\n\nexport const DEFAULT_SETTINGS: Readonly<AppSettings> = {\n currency: 'USD',\n taxRate: 0,\n paymentTerms: '',\n pricesIncludeTax: false,\n taxRounding: 'line',\n};\n\nconst SETTING_KEYS = [\n 'currency',\n 'taxRate',\n 'paymentTerms',\n 'pricesIncludeTax',\n 'taxRounding',\n] as const;\n\nfunction rowValue(row: CookbookPolicyRow | undefined): unknown {\n if (row?.defaultValue === undefined || row.defaultValue === null)\n return undefined;\n try {\n return JSON.parse(row.defaultValue);\n } catch {\n return undefined;\n }\n}\n\nconst findRow = (\n policies: readonly CookbookPolicyRow[],\n model: string,\n field: string,\n) =>\n policies.find(\n (r) =>\n r.scopeType === 'app' && r.objectRef === model && r.fieldName === field,\n );\n\n/** The app's settings: the first stored row of each, else the defaults. */\nexport function readSettings(\n catalog: EngineCatalog,\n doc: Cookbook,\n): AppSettings {\n const targets = settingTargets(catalog);\n const out: AppSettings = { ...DEFAULT_SETTINGS };\n const first = (\n key: keyof AppSettings,\n type: 'number' | 'string' | 'boolean',\n ) => {\n for (const { model, field } of targets[key]) {\n const value = rowValue(findRow(doc.policies, model, field));\n if (typeof value === type) return value;\n }\n return undefined;\n };\n const currency = first('currency', 'string');\n const taxRate = first('taxRate', 'number');\n const paymentTerms = first('paymentTerms', 'string');\n const lineAmountType = first('pricesIncludeTax', 'string');\n const taxRounding = first('taxRounding', 'string');\n if (typeof currency === 'string') out.currency = currency;\n if (typeof taxRate === 'number') out.taxRate = taxRate;\n if (typeof paymentTerms === 'string') out.paymentTerms = paymentTerms;\n if (lineAmountType === 'inclusive' || lineAmountType === 'exclusive')\n out.pricesIncludeTax = lineAmountType === 'inclusive';\n if (taxRounding === 'line' || taxRounding === 'document')\n out.taxRounding = taxRounding;\n return out;\n}\n\nconst isUnset = (v: unknown) => v === undefined || v === null || v === '';\n\nfunction seedDefault(\n catalog: EngineCatalog,\n doc: Cookbook,\n modelId: string,\n field: string,\n): unknown {\n const byId = recipeMap(catalog);\n for (const id of doc.recipes) {\n const hint = byId.get(id)?.options?.[modelId]?.fields?.[field];\n if (hint && 'default' in hint) return hint.default;\n }\n return findModel(catalog, modelId)?.fields?.find((f) => f.name === field)\n ?.default;\n}\n\n/**\n * The document with the settings written as app-scope policy rows. A row is\n * written for every model a setting covers (covered or not, so a recipe added\n * later picks it up) and only where the value differs from what the model\n * starts as; otherwise the row's default is removed. Other row keys are kept.\n */\nexport function writeSettings(\n catalog: EngineCatalog,\n doc: Cookbook,\n settings: AppSettings,\n): Cookbook {\n const targets = settingTargets(catalog);\n let policies = doc.policies.map((row) => ({ ...row }));\n for (const key of SETTING_KEYS) {\n const raw = settings[key];\n const value =\n key === 'paymentTerms'\n ? String(raw).trim()\n : key === 'currency'\n ? String(raw).trim().toUpperCase()\n : key === 'pricesIncludeTax'\n ? raw\n ? 'inclusive'\n : 'exclusive'\n : raw;\n for (const { model, field } of targets[key]) {\n const seed = seedDefault(catalog, doc, model, field);\n const wanted =\n !isUnset(value) &&\n !(!isUnset(seed) && seed === value) &&\n !(isUnset(seed) && key === 'taxRate' && value === 0);\n const existing = findRow(policies, model, field);\n if (wanted) {\n const encoded = JSON.stringify(value);\n if (existing) existing.defaultValue = encoded;\n else\n policies.push({\n objectRef: model,\n fieldName: field,\n scopeType: 'app',\n defaultValue: encoded,\n });\n } else if (existing) {\n delete existing.defaultValue;\n if (Object.keys(existing).length <= 3) {\n policies = policies.filter((r) => r !== existing);\n }\n }\n }\n }\n return { ...doc, policies };\n}\n\n// ---- theme -----------------------------------------------------------------\n\nexport function compactTheme(\n theme: CookbookTheme | undefined,\n): CookbookTheme | undefined {\n if (!theme) return undefined;\n const out: CookbookTheme = {};\n if (theme.preset) out.preset = theme.preset;\n if (theme.colorScheme) out.colorScheme = theme.colorScheme;\n if (theme.borderRadius) out.borderRadius = theme.borderRadius;\n if (theme.density) out.density = theme.density;\n if (theme.contrast) out.contrast = theme.contrast;\n if (theme.fontFamily) out.fontFamily = theme.fontFamily;\n if (theme.custom) out.custom = { ...theme.custom };\n if (theme.customCss) out.customCss = theme.customCss;\n return Object.keys(out).length ? out : undefined;\n}\n\nexport function describeTheme(theme: CookbookTheme | undefined): string {\n const scheme = theme?.colorScheme ?? DEFAULT_COLOR_SCHEME;\n const base = theme?.custom\n ? `brand colour ${theme.custom.primary}`\n : (theme?.preset ?? DEFAULT_PRESET);\n return scheme === 'system' ? base : `${base}, ${scheme}`;\n}\n\n/** A preset replaces a brand colour; a brand colour sits on the preset; the scheme is kept. */\nexport function withThemePatch(\n doc: Cookbook,\n patch: {\n preset?: string;\n primary?: string;\n colorScheme?: CookbookTheme['colorScheme'];\n fontFamily?: string | null;\n borderRadius?: CookbookTheme['borderRadius'];\n density?: CookbookTheme['density'];\n contrast?: CookbookTheme['contrast'];\n },\n): Cookbook {\n const next: CookbookTheme = { ...(doc.theme ?? {}) };\n if (patch.preset) {\n next.preset = patch.preset;\n delete next.custom;\n }\n if (patch.primary) {\n next.custom = {\n primary: patch.primary.toLowerCase(),\n ...(doc.theme?.custom?.fontFamily\n ? { fontFamily: doc.theme.custom.fontFamily }\n : {}),\n };\n }\n if (patch.colorScheme) next.colorScheme = patch.colorScheme;\n if (patch.borderRadius) next.borderRadius = patch.borderRadius;\n if (patch.density) next.density = patch.density;\n if (patch.contrast) next.contrast = patch.contrast;\n if (patch.fontFamily === null) {\n // Null restores the preset font, so a legacy brand font goes too.\n delete next.fontFamily;\n if (next.custom?.fontFamily) next.custom = { primary: next.custom.primary };\n } else if (patch.fontFamily !== undefined) next.fontFamily = patch.fontFamily;\n const theme = compactTheme(next);\n const out = { ...doc };\n if (theme) out.theme = theme;\n else delete out.theme;\n return out;\n}\n\n// ---- validation ------------------------------------------------------------\n\n/**\n * Check a document against the catalog. Structural errors come from\n * `validateCookbook`; the rest need the catalog: unknown ids, unmet `requires`,\n * policy targets nothing covers, layout ids the menu does not have, theme\n * values. Errors mean the app would not build as written; warnings mean\n * something is carried but unused.\n */\nexport function diagnose(\n catalog: EngineCatalog,\n input: Cookbook,\n): Diagnostic[] {\n const out: Diagnostic[] = [];\n const add = (\n severity: Diagnostic['severity'],\n code: string,\n path: string,\n message: string,\n ) => out.push({ severity, code, path, message });\n\n const structural = validateCookbook(input);\n if (!structural.ok) {\n for (const issue of structural.diagnostics.filter(\n (diagnostic) => diagnostic.severity === 'error',\n )) {\n add('error', 'invalid_document', issue.path, issue.message);\n }\n return out;\n }\n for (const issue of structural.diagnostics) {\n add(\n issue.severity,\n issue.code === 'migrated_schema' ? 'migrated' : issue.code,\n issue.path,\n issue.message,\n );\n }\n const doc = structural.cookbook;\n const byId = recipeMap(catalog);\n\n const nav = buildNav(catalog, { ...doc, layout: undefined });\n const checked = validateCookbook(doc, {\n themePresets: catalog.themePresets ?? DEFAULT_THEME_PRESETS,\n layout: {\n sections: nav.map((section) => section.id),\n items: nav.flatMap((section) => section.items.map((item) => item.id)),\n ...(catalog.placementItems\n ? { placementItems: catalog.placementItems }\n : {}),\n },\n overviewIds: [\n ...nav.map((section) => section.id),\n ...(doc.layout?.customSections ?? []).map((section) => section.id),\n ],\n });\n for (const issue of checked.diagnostics) {\n if (\n issue.code === 'unknown_theme_preset' ||\n issue.code === 'unknown_layout_id' ||\n issue.code === 'unknown_overview'\n ) {\n add(\n issue.code === 'unknown_layout_id' &&\n !issue.path.startsWith('layout.placements.')\n ? 'warning'\n : issue.severity,\n issue.code === 'unknown_theme_preset' ? 'unknown_preset' : issue.code,\n issue.path,\n issue.message,\n );\n }\n }\n\n for (const [i, id] of doc.recipes.entries()) {\n if (!byId.has(id))\n add(\n 'error',\n 'unknown_recipe',\n `recipes[${i}]`,\n `Unknown recipe \"${id}\".`,\n );\n }\n const closure = new Set(withRequirements(doc.recipes, byId));\n for (const id of closure) {\n if (!doc.recipes.includes(id)) {\n add(\n 'error',\n 'missing_requirement',\n 'recipes',\n `A recipe needs \"${id}\", which is not listed.`,\n );\n }\n }\n for (const [i, id] of doc.features.entries()) {\n const model = findModel(catalog, id);\n if (!model)\n add('error', 'unknown_model', `features[${i}]`, `Unknown model \"${id}\".`);\n else if (model.exposed === false) {\n add(\n 'error',\n 'model_not_exposed',\n `features[${i}]`,\n `${id} cannot be added as a feature.`,\n );\n }\n }\n const covered = coveredModels(catalog, doc);\n for (const [i, row] of doc.policies.entries()) {\n const at = `policies[${i}]`;\n const model = findModel(catalog, row.objectRef);\n if (!model) {\n add(\n 'error',\n 'unknown_model',\n `${at}.objectRef`,\n `Unknown model \"${row.objectRef}\".`,\n );\n continue;\n }\n if (\n model.fields &&\n !model.fields.some((f) => f.name === row.fieldName && !f.system)\n ) {\n add(\n 'error',\n 'unknown_field',\n `${at}.fieldName`,\n `${model.name} has no field \"${row.fieldName}\".`,\n );\n }\n if (!covered.has(row.objectRef) && !isSettingRow(catalog, row)) {\n add(\n 'warning',\n 'policy_not_covered',\n at,\n `${model.name} is not in the app, so this row has no effect.`,\n );\n }\n }\n for (const ref of Object.keys(doc.exposure ?? {})) {\n if (!findModel(catalog, ref)) {\n add(\n 'error',\n 'unknown_model',\n `exposure.${ref}`,\n `Unknown model \"${ref}\".`,\n );\n }\n }\n return out;\n}\n"],"mappings":";;;;AA8BA,IAAa,SAAY,UACvB,UAAU,KAAA,IAAY,QAAQ,gBAAgB,KAAK;AAErD,IAAa,QAAQ,GAAY,MAC/B,KAAK,UAAU,KAAK,IAAI,MAAM,KAAK,UAAU,KAAK,IAAI;AAExD,IAAa,uBAAiC;CAC5C,SAAS;CACT,SAAA;CACA,SAAS,CAAC;CACV,UAAU,CAAC;CACX,UAAU,CAAC;AACb;;AAGA,SAAgB,gBAAgB,KAAwB;CACtD,OACE,CAAC,IAAI,QAAQ,UACb,CAAC,IAAI,SAAS,UACd,CAAC,IAAI,SAAS,UACd,CAAC,OAAO,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,UACjC,CAAC,IAAI,UACL,CAAC,IAAI,SACL,CAAC,OAAO,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;AAEtC;AAEA,IAAM,gBAAgB,QAA0B,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK;;;;;;AAOvE,SAAgB,UAAU,KAAyB;CACjD,MAAM,wBAAQ,IAAI,IAAI;EACpB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,MAAM,MAAgB;EACpB,SAAS;EACT,SAAA;EACA,GAAI,IAAI,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;EACrC,GAAI,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI,CAAC;EAC1D,SAAS,aAAa,IAAI,OAAO;EACjC,UAAU,aAAa,IAAI,QAAQ;EACnC,UAAU,CAAC,GAAG,IAAI,QAAQ,CAAC,CACxB,MACE,GAAG,MACF,EAAE,UAAU,cAAc,EAAE,SAAS,KACrC,EAAE,UAAU,cAAc,EAAE,SAAS,CACzC,CAAC,CACA,KAAK,SAAS,EAAE,GAAG,IAAI,EAAE;CAC9B;CACA,MAAM,WAAW,OAAO,YACtB,OAAO,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,CAC5B,KAAK,CAAC,CACN,QAAQ,QAAQ,IAAI,WAAW,IAAI,EAAE,MAAM,CAAC,CAC5C,KAAK,QAAQ,CAAC,KAAK,CAAC,GAAI,IAAI,WAAW,QAAQ,CAAC,CAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAChE;CACA,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC,QACxB,IAAI,WAAW;CAEjB,IAAI,IAAI,QAAQ,IAAI,SAAS,MAAM,IAAI,MAAM;CAC7C,MAAM,QAAQ,aAAa,IAAI,KAAK;CACpC,IAAI,OAAO,IAAI,QAAQ;CACvB,MAAM,YAAY,OAAO,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAChE,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAC3B;CACA,IAAI,UAAU,QACZ,IAAI,YAAY,OAAO,YACrB,UAAU,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,CACnD;CAEF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,GAAG,GAC3C,IAAI,CAAC,MAAM,IAAI,GAAG,GAChB,IAA4C,OAAO,MAAM,KAAK;CAElE,OAAO;AACT;AAIA,IAAM,aAAa,YACjB,IAAI,IAAI,QAAQ,QAAQ,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;;AAG/C,SAAgB,iBACd,KACA,SACU;CACV,MAAM,yBAAS,IAAI,IAAY;CAC/B,MAAM,SAAS,OAAe;EAC5B,MAAM,SAAS,QAAQ,IAAI,EAAE;EAC7B,IAAI,CAAC,UAAU,OAAO,IAAI,EAAE,GAAG;EAC/B,OAAO,IAAI,EAAE;EACb,KAAK,MAAM,YAAY,OAAO,UAAU,MAAM,QAAQ;CACxD;CACA,KAAK,MAAM,MAAM,KAAK,MAAM,EAAE;CAC9B,IAAI,UAAU;CACd,OAAO,SAAS;EACd,UAAU;EACV,KAAK,MAAM,MAAM,CAAC,GAAG,MAAM,GACzB,KAAK,MAAM,gBAAgB,QAAQ,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,GAAG;GAC7D,IAAI,aAAa,MAAM,QAAQ,OAAO,IAAI,GAAG,CAAC,GAAG;GACjD,MAAM,QAAQ,aAAa,MAAM,QAAQ,QAAQ,IAAI,GAAG,CAAC;GACzD,IAAI,OAAO;IACT,MAAM,KAAK;IACX,UAAU;GACZ;EACF;CAEJ;CACA,OAAO,aAAa,MAAM;AAC5B;;AAGA,SAAgB,cACd,SACA,KACa;CACb,MAAM,OAAO,UAAU,OAAO;CAC9B,uBAAO,IAAI,IAAI,CACb,GAAG,IAAI,QAAQ,SAAS,OAAO,KAAK,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,GACzD,GAAG,IAAI,QACT,CAAC;AACH;AAEA,SAAgB,eAAe,SAAwC;CACrE,OAAO,QAAQ,kBAAkB;AACnC;AAEA,SAAS,aAAa,SAAwB,KAAiC;CAC7E,OAAO,OAAO,OAAO,eAAe,OAAO,CAAC,CAAC,CAAC,MAAM,YAClD,QAAQ,MAAM,MAAM,EAAE,UAAU,IAAI,aAAa,EAAE,UAAU,IAAI,SAAS,CAC5E;AACF;;AAGA,SAAgB,MAAM,SAAwB,KAAyB;CACrE,MAAM,UAAU,cAAc,SAAS,GAAG;CAC1C,MAAM,OAAiB;EACrB,GAAG;EACH,UAAU,IAAI,SAAS,QACpB,MAAM,QAAQ,IAAI,EAAE,SAAS,KAAK,aAAa,SAAS,CAAC,CAC5D;CACF;CACA,IAAI,IAAI,UAAU;EAChB,MAAM,WAAW,OAAO,YACtB,OAAO,QAAQ,IAAI,QAAQ,CAAC,CAAC,QAAQ,CAAC,SAAS,QAAQ,IAAI,GAAG,CAAC,CACjE;EACA,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC,QAAQ,KAAK,WAAW;OAC7C,OAAO,KAAK;CACnB;CACA,OAAO;AACT;AAEA,IAAM,kBAAkB,SAAwB,QAAkB;CAChE,MAAM,OAAO,UAAU,OAAO;CAC9B,OAAO,IAAI,QAAQ,QAAQ,OAAO,KAAK,IAAI,EAAE,CAAC;AAChD;AAEA,IAAM,oBAAoB,SAAwB,QAAkB;CAClE,MAAM,OAAO,UAAU,OAAO;CAC9B,OAAO,IAAI,QAAQ,QAAQ,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;AACjD;AAEA,SAAS,KACP,QACA,OAC0C;CAC1C,MAAM,IAAI,IAAI,IAAI,MAAM;CACxB,MAAM,IAAI,IAAI,IAAI,KAAK;CACvB,OAAO;EACL,OAAO,MAAM,QAAQ,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;EACtC,SAAS,OAAO,QAAQ,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;CAC3C;AACF;AAEA,SAAgB,iBACd,SACA,KACA,KAC2C;CAC3C,MAAM,OAAO,UAAU,OAAO;CAC9B,MAAM,SAAS,eAAe,SAAS,GAAG;CAC1C,MAAM,QAAQ,iBAAiB,CAAC,GAAG,QAAQ,GAAG,GAAG,GAAG,IAAI;CAKxD,OAAO;EAAE,KAAK;GAHZ,GAAG;GACH,SAAS,aAAa,CAAC,GAAG,OAAO,GAAG,iBAAiB,SAAS,GAAG,CAAC,CAAC;EAEvD;EAAM,SAAS;GAAE,GAAG,KAAK,QAAQ,KAAK;GAAG,MAAM,CAAC;EAAE;CAAE;AACpE;AAEA,SAAgB,mBACd,SACA,KACA,KAC2C;CAC3C,MAAM,OAAO,UAAU,OAAO;CAC9B,MAAM,SAAS,eAAe,SAAS,GAAG;CAC1C,MAAM,WAAW,IAAI,IAAI,GAAG;CAC5B,MAAM,QAAQ,iBACZ,OAAO,QAAQ,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,GACvC,IACF;CACA,MAAM,OAAO,MAAM,SAAS;EAC1B,GAAG;EACH,SAAS,aAAa,CAAC,GAAG,OAAO,GAAG,iBAAiB,SAAS,GAAG,CAAC,CAAC;CACrE,CAAC;CACD,MAAM,EAAE,OAAO,YAAY,KAAK,QAAQ,KAAK;CAC7C,OAAO;EACL,KAAK;EACL,SAAS;GACP;GACA;GACA,MAAM,IAAI,QAAQ,OAAO,MAAM,SAAS,EAAE,KAAK,OAAO,SAAS,EAAE,CAAC;EACpE;CACF;AACF;AAEA,SAAgB,oBACd,SACA,KACA,KACA,IAC2C;CAC3C,MAAM,MAAM,IAAI,IAAI,IAAI,QAAQ;CAChC,KAAK,MAAM,MAAM,KACf,IAAI,IAAI,IAAI,IAAI,EAAE;MACb,IAAI,OAAO,EAAE;CAEpB,MAAM,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK;CAC/B,IAAI,OAAiB;EAAE,GAAG;EAAK;CAAS;CACxC,IAAI,CAAC,IAAI,OAAO,MAAM,SAAS,IAAI;CACnC,OAAO;EACL,KAAK;EACL,SAAS;GAAE,GAAG,KAAK,IAAI,UAAU,QAAQ;GAAG,MAAM,CAAC;EAAE;CACvD;AACF;AAEA,IAAa,gBACX,GACA,OACmB;CACnB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE,KAAK;CAC9B,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,EAAE,OAAO;CACpC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI;AAC7B;AAeA,IAAa,mBAA0C;CACrD,UAAU;CACV,SAAS;CACT,cAAc;CACd,kBAAkB;CAClB,aAAa;AACf;AAEA,IAAM,eAAe;CACnB;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,SAAS,KAA6C;CAC7D,IAAI,KAAK,iBAAiB,KAAA,KAAa,IAAI,iBAAiB,MAC1D,OAAO,KAAA;CACT,IAAI;EACF,OAAO,KAAK,MAAM,IAAI,YAAY;CACpC,QAAQ;EACN;CACF;AACF;AAEA,IAAM,WACJ,UACA,OACA,UAEA,SAAS,MACN,MACC,EAAE,cAAc,SAAS,EAAE,cAAc,SAAS,EAAE,cAAc,KACtE;;AAGF,SAAgB,aACd,SACA,KACa;CACb,MAAM,UAAU,eAAe,OAAO;CACtC,MAAM,MAAmB,EAAE,GAAG,iBAAiB;CAC/C,MAAM,SACJ,KACA,SACG;EACH,KAAK,MAAM,EAAE,OAAO,WAAW,QAAQ,MAAM;GAC3C,MAAM,QAAQ,SAAS,QAAQ,IAAI,UAAU,OAAO,KAAK,CAAC;GAC1D,IAAI,OAAO,UAAU,MAAM,OAAO;EACpC;CAEF;CACA,MAAM,WAAW,MAAM,YAAY,QAAQ;CAC3C,MAAM,UAAU,MAAM,WAAW,QAAQ;CACzC,MAAM,eAAe,MAAM,gBAAgB,QAAQ;CACnD,MAAM,iBAAiB,MAAM,oBAAoB,QAAQ;CACzD,MAAM,cAAc,MAAM,eAAe,QAAQ;CACjD,IAAI,OAAO,aAAa,UAAU,IAAI,WAAW;CACjD,IAAI,OAAO,YAAY,UAAU,IAAI,UAAU;CAC/C,IAAI,OAAO,iBAAiB,UAAU,IAAI,eAAe;CACzD,IAAI,mBAAmB,eAAe,mBAAmB,aACvD,IAAI,mBAAmB,mBAAmB;CAC5C,IAAI,gBAAgB,UAAU,gBAAgB,YAC5C,IAAI,cAAc;CACpB,OAAO;AACT;AAEA,IAAM,WAAW,MAAe,MAAM,KAAA,KAAa,MAAM,QAAQ,MAAM;AAEvE,SAAS,YACP,SACA,KACA,SACA,OACS;CACT,MAAM,OAAO,UAAU,OAAO;CAC9B,KAAK,MAAM,MAAM,IAAI,SAAS;EAC5B,MAAM,OAAO,KAAK,IAAI,EAAE,CAAC,EAAE,UAAU,QAAQ,EAAE,SAAS;EACxD,IAAI,QAAQ,aAAa,MAAM,OAAO,KAAK;CAC7C;CACA,OAAO,UAAU,SAAS,OAAO,CAAC,EAAE,QAAQ,MAAM,MAAM,EAAE,SAAS,KAAK,CAAC,EACrE;AACN;;;;;;;AAQA,SAAgB,cACd,SACA,KACA,UACU;CACV,MAAM,UAAU,eAAe,OAAO;CACtC,IAAI,WAAW,IAAI,SAAS,KAAK,SAAS,EAAE,GAAG,IAAI,EAAE;CACrD,KAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,MAAM,SAAS;EACrB,MAAM,QACJ,QAAQ,iBACJ,OAAO,GAAG,CAAC,CAAC,KAAK,IACjB,QAAQ,aACN,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,IAC/B,QAAQ,qBACN,MACE,cACA,cACF;EACV,KAAK,MAAM,EAAE,OAAO,WAAW,QAAQ,MAAM;GAC3C,MAAM,OAAO,YAAY,SAAS,KAAK,OAAO,KAAK;GACnD,MAAM,SACJ,CAAC,QAAQ,KAAK,KACd,EAAE,CAAC,QAAQ,IAAI,KAAK,SAAS,UAC7B,EAAE,QAAQ,IAAI,KAAK,QAAQ,aAAa,UAAU;GACpD,MAAM,WAAW,QAAQ,UAAU,OAAO,KAAK;GAC/C,IAAI,QAAQ;IACV,MAAM,UAAU,KAAK,UAAU,KAAK;IACpC,IAAI,UAAU,SAAS,eAAe;SAEpC,SAAS,KAAK;KACZ,WAAW;KACX,WAAW;KACX,WAAW;KACX,cAAc;IAChB,CAAC;GACL,OAAO,IAAI,UAAU;IACnB,OAAO,SAAS;IAChB,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC,UAAU,GAClC,WAAW,SAAS,QAAQ,MAAM,MAAM,QAAQ;GAEpD;EACF;CACF;CACA,OAAO;EAAE,GAAG;EAAK;CAAS;AAC5B;AAIA,SAAgB,aACd,OAC2B;CAC3B,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,MAAM,MAAqB,CAAC;CAC5B,IAAI,MAAM,QAAQ,IAAI,SAAS,MAAM;CACrC,IAAI,MAAM,aAAa,IAAI,cAAc,MAAM;CAC/C,IAAI,MAAM,cAAc,IAAI,eAAe,MAAM;CACjD,IAAI,MAAM,SAAS,IAAI,UAAU,MAAM;CACvC,IAAI,MAAM,UAAU,IAAI,WAAW,MAAM;CACzC,IAAI,MAAM,YAAY,IAAI,aAAa,MAAM;CAC7C,IAAI,MAAM,QAAQ,IAAI,SAAS,EAAE,GAAG,MAAM,OAAO;CACjD,IAAI,MAAM,WAAW,IAAI,YAAY,MAAM;CAC3C,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,MAAM,KAAA;AACzC;AAEA,SAAgB,cAAc,OAA0C;CACtE,MAAM,SAAS,OAAO,eAAA;CACtB,MAAM,OAAO,OAAO,SAChB,gBAAgB,MAAM,OAAO,YAC5B,OAAO,UAAA;CACZ,OAAO,WAAW,WAAW,OAAO,GAAG,KAAK,IAAI;AAClD;;AAGA,SAAgB,eACd,KACA,OASU;CACV,MAAM,OAAsB,EAAE,GAAI,IAAI,SAAS,CAAC,EAAG;CACnD,IAAI,MAAM,QAAQ;EAChB,KAAK,SAAS,MAAM;EACpB,OAAO,KAAK;CACd;CACA,IAAI,MAAM,SACR,KAAK,SAAS;EACZ,SAAS,MAAM,QAAQ,YAAY;EACnC,GAAI,IAAI,OAAO,QAAQ,aACnB,EAAE,YAAY,IAAI,MAAM,OAAO,WAAW,IAC1C,CAAC;CACP;CAEF,IAAI,MAAM,aAAa,KAAK,cAAc,MAAM;CAChD,IAAI,MAAM,cAAc,KAAK,eAAe,MAAM;CAClD,IAAI,MAAM,SAAS,KAAK,UAAU,MAAM;CACxC,IAAI,MAAM,UAAU,KAAK,WAAW,MAAM;CAC1C,IAAI,MAAM,eAAe,MAAM;EAE7B,OAAO,KAAK;EACZ,IAAI,KAAK,QAAQ,YAAY,KAAK,SAAS,EAAE,SAAS,KAAK,OAAO,QAAQ;CAC5E,OAAO,IAAI,MAAM,eAAe,KAAA,GAAW,KAAK,aAAa,MAAM;CACnE,MAAM,QAAQ,aAAa,IAAI;CAC/B,MAAM,MAAM,EAAE,GAAG,IAAI;CACrB,IAAI,OAAO,IAAI,QAAQ;MAClB,OAAO,IAAI;CAChB,OAAO;AACT;;;;;;;;AAWA,SAAgB,SACd,SACA,OACc;CACd,MAAM,MAAoB,CAAC;CAC3B,MAAM,OACJ,UACA,MACA,MACA,YACG,IAAI,KAAK;EAAE;EAAU;EAAM;EAAM;CAAQ,CAAC;CAE/C,MAAM,aAAa,iBAAiB,KAAK;CACzC,IAAI,CAAC,WAAW,IAAI;EAClB,KAAK,MAAM,SAAS,WAAW,YAAY,QACxC,eAAe,WAAW,aAAa,OAC1C,GACE,IAAI,SAAS,oBAAoB,MAAM,MAAM,MAAM,OAAO;EAE5D,OAAO;CACT;CACA,KAAK,MAAM,SAAS,WAAW,aAC7B,IACE,MAAM,UACN,MAAM,SAAS,oBAAoB,aAAa,MAAM,MACtD,MAAM,MACN,MAAM,OACR;CAEF,MAAM,MAAM,WAAW;CACvB,MAAM,OAAO,UAAU,OAAO;CAE9B,MAAM,MAAM,SAAS,SAAS;EAAE,GAAG;EAAK,QAAQ,KAAA;CAAU,CAAC;CAC3D,MAAM,UAAU,iBAAiB,KAAK;EACpC,cAAc,QAAQ,gBAAgB;EACtC,QAAQ;GACN,UAAU,IAAI,KAAK,YAAY,QAAQ,EAAE;GACzC,OAAO,IAAI,SAAS,YAAY,QAAQ,MAAM,KAAK,SAAS,KAAK,EAAE,CAAC;GACpE,GAAI,QAAQ,iBACR,EAAE,gBAAgB,QAAQ,eAAe,IACzC,CAAC;EACP;EACA,aAAa,CACX,GAAG,IAAI,KAAK,YAAY,QAAQ,EAAE,GAClC,IAAI,IAAI,QAAQ,kBAAkB,CAAC,EAAA,CAAG,KAAK,YAAY,QAAQ,EAAE,CACnE;CACF,CAAC;CACD,KAAK,MAAM,SAAS,QAAQ,aAC1B,IACE,MAAM,SAAS,0BACf,MAAM,SAAS,uBACf,MAAM,SAAS,oBAEf,IACE,MAAM,SAAS,uBACb,CAAC,MAAM,KAAK,WAAW,oBAAoB,IACzC,YACA,MAAM,UACV,MAAM,SAAS,yBAAyB,mBAAmB,MAAM,MACjE,MAAM,MACN,MAAM,OACR;CAIJ,KAAK,MAAM,CAAC,GAAG,OAAO,IAAI,QAAQ,QAAQ,GACxC,IAAI,CAAC,KAAK,IAAI,EAAE,GACd,IACE,SACA,kBACA,WAAW,EAAE,IACb,mBAAmB,GAAG,GACxB;CAEJ,MAAM,UAAU,IAAI,IAAI,iBAAiB,IAAI,SAAS,IAAI,CAAC;CAC3D,KAAK,MAAM,MAAM,SACf,IAAI,CAAC,IAAI,QAAQ,SAAS,EAAE,GAC1B,IACE,SACA,uBACA,WACA,mBAAmB,GAAG,wBACxB;CAGJ,KAAK,MAAM,CAAC,GAAG,OAAO,IAAI,SAAS,QAAQ,GAAG;EAC5C,MAAM,QAAQ,UAAU,SAAS,EAAE;EACnC,IAAI,CAAC,OACH,IAAI,SAAS,iBAAiB,YAAY,EAAE,IAAI,kBAAkB,GAAG,GAAG;OACrE,IAAI,MAAM,YAAY,OACzB,IACE,SACA,qBACA,YAAY,EAAE,IACd,GAAG,GAAG,+BACR;CAEJ;CACA,MAAM,UAAU,cAAc,SAAS,GAAG;CAC1C,KAAK,MAAM,CAAC,GAAG,QAAQ,IAAI,SAAS,QAAQ,GAAG;EAC7C,MAAM,KAAK,YAAY,EAAE;EACzB,MAAM,QAAQ,UAAU,SAAS,IAAI,SAAS;EAC9C,IAAI,CAAC,OAAO;GACV,IACE,SACA,iBACA,GAAG,GAAG,aACN,kBAAkB,IAAI,UAAU,GAClC;GACA;EACF;EACA,IACE,MAAM,UACN,CAAC,MAAM,OAAO,MAAM,MAAM,EAAE,SAAS,IAAI,aAAa,CAAC,EAAE,MAAM,GAE/D,IACE,SACA,iBACA,GAAG,GAAG,aACN,GAAG,MAAM,KAAK,iBAAiB,IAAI,UAAU,GAC/C;EAEF,IAAI,CAAC,QAAQ,IAAI,IAAI,SAAS,KAAK,CAAC,aAAa,SAAS,GAAG,GAC3D,IACE,WACA,sBACA,IACA,GAAG,MAAM,KAAK,+CAChB;CAEJ;CACA,KAAK,MAAM,OAAO,OAAO,KAAK,IAAI,YAAY,CAAC,CAAC,GAC9C,IAAI,CAAC,UAAU,SAAS,GAAG,GACzB,IACE,SACA,iBACA,YAAY,OACZ,kBAAkB,IAAI,GACxB;CAGJ,OAAO;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/cookbook/engine/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,KAAK,EAKN,MAAM,eAAe,CAAC;AASvB,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,YAAY,EAGjB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAEhB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,aAAa,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sEAAsE;IACtE,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC;IAC3D;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,GAAG,WAAW,CAAC;IAClD,+DAA+D;IAC/D,QAAQ,IAAI,YAAY,CAAC;IACzB,6BAA6B;IAC7B,QAAQ,IAAI,UAAU,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvD,uEAAuE;IACvE,KAAK,IAAI,WAAW,CAAC;IACrB,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAClE,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,wCAAwC;IACxC,QAAQ,CAAC,SAAS,EAAE;QAClB,IAAI,EAAE,WAAW,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,UAAU,CAAC;KACzB,CAAC;CACH;AAsGD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,cAAc,
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/cookbook/engine/engine.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,KAAK,EAKN,MAAM,eAAe,CAAC;AASvB,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,YAAY,EAGjB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,WAAW,EAEhB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,aAAa,CAAC;IACvB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sEAAsE;IACtE,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,aAAa,CAAC;IAC3D;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,GAAG,WAAW,CAAC;IAClD,+DAA+D;IAC/D,QAAQ,IAAI,YAAY,CAAC;IACzB,6BAA6B;IAC7B,QAAQ,IAAI,UAAU,CAAC,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvD,uEAAuE;IACvE,KAAK,IAAI,WAAW,CAAC;IACrB,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAClE,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,wCAAwC;IACxC,QAAQ,CAAC,SAAS,EAAE;QAClB,IAAI,EAAE,WAAW,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,UAAU,CAAC;KACzB,CAAC;CACH;AAsGD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,cAAc,CAmgBhB"}
|
|
@@ -113,7 +113,9 @@ function createCookbookEngine(options) {
|
|
|
113
113
|
settings: {
|
|
114
114
|
currency: settings.currency,
|
|
115
115
|
taxRate: Number((settings.taxRate * 100).toFixed(4)),
|
|
116
|
-
paymentTerms: settings.paymentTerms
|
|
116
|
+
paymentTerms: settings.paymentTerms,
|
|
117
|
+
pricesIncludeTax: settings.pricesIncludeTax,
|
|
118
|
+
taxRounding: settings.taxRounding
|
|
117
119
|
},
|
|
118
120
|
theme: {
|
|
119
121
|
text: describeTheme(doc.theme),
|