@wildo-ai/saas-models 1.1.3 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/applications/application-metadata.shared.resources-config.schemas.d.ts +1 -1
- package/dist/esm/applications/application-versions.shared.resources-config.schemas.d.ts +1 -1
- package/dist/esm/applications/application-versions.shared.resources-config.schemas.js +2 -2
- package/dist/esm/applications/application-versions.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/applications/applications-context.schemas.d.ts +236 -18
- package/dist/esm/applications/applications-context.schemas.d.ts.map +1 -1
- package/dist/esm/applications/applications.shared.resources-config.schemas.d.ts +1 -0
- package/dist/esm/applications/applications.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/applications/applications.shared.resources-config.schemas.js +1 -1
- package/dist/esm/applications/applications.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/applications/applications.shared.schemas.d.ts +3 -2
- package/dist/esm/applications/applications.shared.schemas.d.ts.map +1 -1
- package/dist/esm/applications/applications.shared.schemas.js +40 -5
- package/dist/esm/applications/applications.shared.schemas.js.map +1 -1
- package/dist/esm/billing/billing-account.shared.resources-config.schemas.d.ts +1 -2
- package/dist/esm/billing/billing-account.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/billing-account.shared.resources-config.schemas.js +1 -2
- package/dist/esm/billing/billing-account.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/billing-enums.shared.schemas.d.ts +87 -5
- package/dist/esm/billing/billing-enums.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/billing-enums.shared.schemas.js +91 -5
- package/dist/esm/billing/billing-enums.shared.schemas.js.map +1 -1
- package/dist/esm/billing/billing-types.shared.schemas.d.ts +25 -4
- package/dist/esm/billing/billing-types.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/billing-types.shared.schemas.js +61 -0
- package/dist/esm/billing/billing-types.shared.schemas.js.map +1 -1
- package/dist/esm/billing/price.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/price.shared.resources-config.schemas.js +32 -2
- package/dist/esm/billing/price.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/product-behavior-policy.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/product-behavior-policy.shared.schemas.js +1 -1
- package/dist/esm/billing/product-behavior-policy.shared.schemas.js.map +1 -1
- package/dist/esm/billing/product.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/product.shared.resources-config.schemas.js +32 -2
- package/dist/esm/billing/product.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/product.shared.schemas.d.ts +1 -0
- package/dist/esm/billing/product.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/product.shared.schemas.js +3 -0
- package/dist/esm/billing/product.shared.schemas.js.map +1 -1
- package/dist/esm/billing/promotions.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/promotions.shared.resources-config.schemas.js +33 -3
- package/dist/esm/billing/promotions.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/referral.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/referral.shared.resources-config.schemas.js +22 -2
- package/dist/esm/billing/referral.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/referral.shared.schemas.d.ts +1 -0
- package/dist/esm/billing/referral.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/referral.shared.schemas.js +3 -0
- package/dist/esm/billing/referral.shared.schemas.js.map +1 -1
- package/dist/esm/billing/subscription.shared.resources-config.schemas.d.ts +23 -1
- package/dist/esm/billing/subscription.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/billing/subscription.shared.resources-config.schemas.js +48 -2
- package/dist/esm/billing/subscription.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/billing/subscription.shared.schemas.d.ts +1 -0
- package/dist/esm/billing/subscription.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/subscription.shared.schemas.js +3 -0
- package/dist/esm/billing/subscription.shared.schemas.js.map +1 -1
- package/dist/esm/billing/usage-flush-evidence.shared.schemas.d.ts +49 -0
- package/dist/esm/billing/usage-flush-evidence.shared.schemas.d.ts.map +1 -0
- package/dist/esm/billing/usage-flush-evidence.shared.schemas.js +48 -0
- package/dist/esm/billing/usage-flush-evidence.shared.schemas.js.map +1 -0
- package/dist/esm/billing/usage-record.shared.schemas.d.ts +1 -0
- package/dist/esm/billing/usage-record.shared.schemas.d.ts.map +1 -1
- package/dist/esm/billing/usage-record.shared.schemas.js +3 -0
- package/dist/esm/billing/usage-record.shared.schemas.js.map +1 -1
- package/dist/esm/companion/provider-discovery.shared.schemas.d.ts +8 -0
- package/dist/esm/companion/provider-discovery.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/application-audit-logs.shared.resources-config.schemas.d.ts +14 -3
- package/dist/esm/compliance/audit-trails/application-audit-logs.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/application-audit-logs.shared.resources-config.schemas.js +21 -7
- package/dist/esm/compliance/audit-trails/application-audit-logs.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-export-projection.shared.schemas.d.ts +450 -0
- package/dist/esm/compliance/audit-trails/audit-export-projection.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/audit-trails/audit-export-projection.shared.schemas.js +723 -0
- package/dist/esm/compliance/audit-trails/audit-export-projection.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/audit-trails/audit-logs.shared.resources-config.schemas.d.ts +2 -2
- package/dist/esm/compliance/audit-trails/audit-trail-config.shared.schemas.d.ts +8 -0
- package/dist/esm/compliance/audit-trails/audit-trail-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/audit-trail-config.shared.schemas.js +15 -0
- package/dist/esm/compliance/audit-trails/audit-trail-config.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/audit-trails/auditable-events.shared.schema.d.ts +787 -21
- package/dist/esm/compliance/audit-trails/auditable-events.shared.schema.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/auditable-events.shared.schema.js +1079 -26
- package/dist/esm/compliance/audit-trails/auditable-events.shared.schema.js.map +1 -1
- package/dist/esm/compliance/audit-trails/security-audit-event-envelope.shared.schema.d.ts.map +1 -1
- package/dist/esm/compliance/audit-trails/security-audit-event-envelope.shared.schema.js +51 -0
- package/dist/esm/compliance/audit-trails/security-audit-event-envelope.shared.schema.js.map +1 -1
- package/dist/esm/compliance/documents/governed-document-interactions.shared.schemas.d.ts +463 -0
- package/dist/esm/compliance/documents/governed-document-interactions.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/documents/governed-document-interactions.shared.schemas.js +526 -0
- package/dist/esm/compliance/documents/governed-document-interactions.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/documents/governed-documents.shared.schemas.d.ts +539 -15
- package/dist/esm/compliance/documents/governed-documents.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/documents/governed-documents.shared.schemas.js +402 -14
- package/dist/esm/compliance/documents/governed-documents.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.resources-config.schemas.d.ts +18 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.resources-config.schemas.js +89 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.schemas.d.ts +47 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.schemas.js +73 -0
- package/dist/esm/compliance/documents/user-governed-document-acceptances.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/ai-use-posture.shared.schemas.d.ts +21 -0
- package/dist/esm/compliance/privacy/ai-use-posture.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/ai-use-posture.shared.schemas.js +39 -1
- package/dist/esm/compliance/privacy/ai-use-posture.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/capability-consent-purposes.shared.utils.d.ts +33 -0
- package/dist/esm/compliance/privacy/capability-consent-purposes.shared.utils.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/capability-consent-purposes.shared.utils.js +30 -0
- package/dist/esm/compliance/privacy/capability-consent-purposes.shared.utils.js.map +1 -0
- package/dist/esm/compliance/privacy/client-storage.shared.schemas.d.ts +6 -5
- package/dist/esm/compliance/privacy/client-storage.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/client-storage.shared.schemas.js +15 -5
- package/dist/esm/compliance/privacy/client-storage.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/consent-gate-vocabulary.shared.schemas.d.ts +127 -0
- package/dist/esm/compliance/privacy/consent-gate-vocabulary.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/consent-gate-vocabulary.shared.schemas.js +94 -0
- package/dist/esm/compliance/privacy/consent-gate-vocabulary.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/consent-purposes.shared.d.ts +125 -0
- package/dist/esm/compliance/privacy/consent-purposes.shared.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/consent-purposes.shared.js +136 -0
- package/dist/esm/compliance/privacy/consent-purposes.shared.js.map +1 -0
- package/dist/esm/compliance/privacy/data-subject-rights.shared.schemas.d.ts +91 -0
- package/dist/esm/compliance/privacy/data-subject-rights.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/data-subject-rights.shared.schemas.js +123 -0
- package/dist/esm/compliance/privacy/data-subject-rights.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/operating-jurisdictions.shared.schemas.d.ts +27 -0
- package/dist/esm/compliance/privacy/operating-jurisdictions.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/operating-jurisdictions.shared.schemas.js +36 -2
- package/dist/esm/compliance/privacy/operating-jurisdictions.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.d.ts +68 -25
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.js +74 -22
- package/dist/esm/compliance/privacy/operator-compliance-identity.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/privacy.shared.schemas.d.ts +9 -17
- package/dist/esm/compliance/privacy/privacy.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/privacy.shared.schemas.js +74 -31
- package/dist/esm/compliance/privacy/privacy.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/privacy/subject-erasure-lane-evidence.shared.schemas.d.ts +47 -0
- package/dist/esm/compliance/privacy/subject-erasure-lane-evidence.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/privacy/subject-erasure-lane-evidence.shared.schemas.js +98 -0
- package/dist/esm/compliance/privacy/subject-erasure-lane-evidence.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/privacy/subject-erasure.shared.schemas.d.ts +368 -35
- package/dist/esm/compliance/privacy/subject-erasure.shared.schemas.d.ts.map +1 -1
- package/dist/esm/compliance/privacy/subject-erasure.shared.schemas.js +403 -17
- package/dist/esm/compliance/privacy/subject-erasure.shared.schemas.js.map +1 -1
- package/dist/esm/compliance/review-cadence.shared.schemas.d.ts +56 -0
- package/dist/esm/compliance/review-cadence.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/review-cadence.shared.schemas.js +71 -0
- package/dist/esm/compliance/review-cadence.shared.schemas.js.map +1 -0
- package/dist/esm/compliance/risk-posture.shared.schemas.d.ts +161 -0
- package/dist/esm/compliance/risk-posture.shared.schemas.d.ts.map +1 -0
- package/dist/esm/compliance/risk-posture.shared.schemas.js +166 -0
- package/dist/esm/compliance/risk-posture.shared.schemas.js.map +1 -0
- package/dist/esm/config/analytics-value-moments.shared.schemas.d.ts +4 -3
- package/dist/esm/config/analytics-value-moments.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/analytics-value-moments.shared.schemas.js +4 -3
- package/dist/esm/config/analytics-value-moments.shared.schemas.js.map +1 -1
- package/dist/esm/config/app-configuration-shared.shared.schemas.d.ts +222 -9
- package/dist/esm/config/app-configuration-shared.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/app-configuration-shared.shared.schemas.js +232 -9
- package/dist/esm/config/app-configuration-shared.shared.schemas.js.map +1 -1
- package/dist/esm/config/auth-config-resolution.shared.utils.d.ts +75 -3
- package/dist/esm/config/auth-config-resolution.shared.utils.d.ts.map +1 -1
- package/dist/esm/config/auth-config-resolution.shared.utils.js +93 -4
- package/dist/esm/config/auth-config-resolution.shared.utils.js.map +1 -1
- package/dist/esm/config/brand-assets.shared.schemas.d.ts +5 -4
- package/dist/esm/config/brand-assets.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/brand-assets.shared.schemas.js +14 -4
- package/dist/esm/config/brand-assets.shared.schemas.js.map +1 -1
- package/dist/esm/config/entity-identity-config.shared.schemas.d.ts +463 -19
- package/dist/esm/config/entity-identity-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/entity-identity-config.shared.schemas.js +535 -28
- package/dist/esm/config/entity-identity-config.shared.schemas.js.map +1 -1
- package/dist/esm/config/frontend/chart-definition.shared.schemas.d.ts +14 -14
- package/dist/esm/config/frontend/chart-registration-alignment.shared.d.ts +139 -3
- package/dist/esm/config/frontend/chart-registration-alignment.shared.d.ts.map +1 -1
- package/dist/esm/config/frontend/chart-registration-alignment.shared.js +151 -4
- package/dist/esm/config/frontend/chart-registration-alignment.shared.js.map +1 -1
- package/dist/esm/config/frontend/navigation.shared.schemas.d.ts +21 -17
- package/dist/esm/config/frontend/navigation.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/frontend/navigation.shared.schemas.js +58 -40
- package/dist/esm/config/frontend/navigation.shared.schemas.js.map +1 -1
- package/dist/esm/config/frontend/onboarding.shared.schemas.d.ts +90 -133
- package/dist/esm/config/frontend/onboarding.shared.schemas.d.ts.map +1 -1
- package/dist/esm/config/frontend/onboarding.shared.schemas.js +148 -100
- package/dist/esm/config/frontend/onboarding.shared.schemas.js.map +1 -1
- package/dist/esm/errors/errors.custom-message-ref.shared.definitions.d.ts +146 -43
- package/dist/esm/errors/errors.custom-message-ref.shared.definitions.d.ts.map +1 -1
- package/dist/esm/errors/errors.custom-message-ref.shared.definitions.js +147 -42
- package/dist/esm/errors/errors.custom-message-ref.shared.definitions.js.map +1 -1
- package/dist/esm/errors/errors.shared.definitions.js +1 -1
- package/dist/esm/errors/errors.shared.definitions.js.map +1 -1
- package/dist/esm/errors/errors.shared.schemas.d.ts +29 -40
- package/dist/esm/errors/errors.shared.schemas.d.ts.map +1 -1
- package/dist/esm/errors/errors.shared.schemas.js +37 -54
- package/dist/esm/errors/errors.shared.schemas.js.map +1 -1
- package/dist/esm/errors/errors.shared.utils.d.ts +24 -0
- package/dist/esm/errors/errors.shared.utils.d.ts.map +1 -1
- package/dist/esm/errors/errors.shared.utils.js +39 -0
- package/dist/esm/errors/errors.shared.utils.js.map +1 -1
- package/dist/esm/errors/thrown-value-description.shared.utils.d.ts +27 -0
- package/dist/esm/errors/thrown-value-description.shared.utils.d.ts.map +1 -0
- package/dist/esm/errors/thrown-value-description.shared.utils.js +67 -0
- package/dist/esm/errors/thrown-value-description.shared.utils.js.map +1 -0
- package/dist/esm/external-data/external-data-pipeline.shared.schemas.d.ts +48 -73
- package/dist/esm/external-data/external-data-pipeline.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-data/external-data-pipeline.shared.schemas.js +103 -9
- package/dist/esm/external-data/external-data-pipeline.shared.schemas.js.map +1 -1
- package/dist/esm/external-data.exports.d.ts +1 -0
- package/dist/esm/external-data.exports.d.ts.map +1 -1
- package/dist/esm/external-data.exports.js +1 -0
- package/dist/esm/external-data.exports.js.map +1 -1
- package/dist/esm/external-providers/engine-capabilities.shared.schemas.d.ts +18 -12
- package/dist/esm/external-providers/engine-capabilities.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/engine-capabilities.shared.schemas.js +18 -12
- package/dist/esm/external-providers/engine-capabilities.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/engine-capability-resolution-mode.shared.d.ts +5 -3
- package/dist/esm/external-providers/engine-capability-resolution-mode.shared.d.ts.map +1 -1
- package/dist/esm/external-providers/engine-capability-resolution-mode.shared.js +5 -3
- package/dist/esm/external-providers/engine-capability-resolution-mode.shared.js.map +1 -1
- package/dist/esm/external-providers/engine-capability-surface.shared.d.ts +77 -0
- package/dist/esm/external-providers/engine-capability-surface.shared.d.ts.map +1 -0
- package/dist/esm/external-providers/engine-capability-surface.shared.js +173 -0
- package/dist/esm/external-providers/engine-capability-surface.shared.js.map +1 -0
- package/dist/esm/external-providers/external-providers.shared.schemas.d.ts +2 -0
- package/dist/esm/external-providers/external-providers.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/external-providers.shared.schemas.js +21 -0
- package/dist/esm/external-providers/external-providers.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/frontend-bootstrap.shared.schemas.d.ts +131 -7
- package/dist/esm/external-providers/frontend-bootstrap.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/frontend-capability-public-config.shared.schemas.d.ts +114 -0
- package/dist/esm/external-providers/frontend-capability-public-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/frontend-capability-public-config.shared.schemas.js +148 -0
- package/dist/esm/external-providers/frontend-capability-public-config.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/frontend-provider-entry.shared.schemas.d.ts +108 -0
- package/dist/esm/external-providers/frontend-provider-entry.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/frontend-provider-entry.shared.schemas.js +86 -0
- package/dist/esm/external-providers/frontend-provider-entry.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/frontend-provider-public-config.shared.d.ts +184 -0
- package/dist/esm/external-providers/frontend-provider-public-config.shared.d.ts.map +1 -0
- package/dist/esm/external-providers/frontend-provider-public-config.shared.js +216 -0
- package/dist/esm/external-providers/frontend-provider-public-config.shared.js.map +1 -0
- package/dist/esm/external-providers/provider-authentication-assurance.shared.schemas.d.ts +30 -0
- package/dist/esm/external-providers/provider-authentication-assurance.shared.schemas.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-authentication-assurance.shared.schemas.js +32 -0
- package/dist/esm/external-providers/provider-authentication-assurance.shared.schemas.js.map +1 -0
- package/dist/esm/external-providers/provider-browser-operations.shared.schemas.d.ts +86 -0
- package/dist/esm/external-providers/provider-browser-operations.shared.schemas.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-browser-operations.shared.schemas.js +85 -0
- package/dist/esm/external-providers/provider-browser-operations.shared.schemas.js.map +1 -0
- package/dist/esm/external-providers/provider-capability.shared.schemas.d.ts +14 -13
- package/dist/esm/external-providers/provider-capability.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-capability.shared.schemas.js +10 -10
- package/dist/esm/external-providers/provider-capability.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/provider-compliance-profile.shared.schemas.d.ts +18 -8
- package/dist/esm/external-providers/provider-compliance-profile.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-compliance-profile.shared.schemas.js +10 -4
- package/dist/esm/external-providers/provider-compliance-profile.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/provider-frontend-component-contract.shared.types.d.ts +165 -0
- package/dist/esm/external-providers/provider-frontend-component-contract.shared.types.d.ts.map +1 -0
- package/dist/esm/external-providers/provider-frontend-component-contract.shared.types.js +39 -0
- package/dist/esm/external-providers/provider-frontend-component-contract.shared.types.js.map +1 -0
- package/dist/esm/external-providers/provider-frontend-surface.shared.schemas.d.ts +7 -5
- package/dist/esm/external-providers/provider-frontend-surface.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-frontend-surface.shared.schemas.js +7 -5
- package/dist/esm/external-providers/provider-frontend-surface.shared.schemas.js.map +1 -1
- package/dist/esm/external-providers/provider-metadata.shared.schemas.d.ts +8 -5
- package/dist/esm/external-providers/provider-metadata.shared.schemas.d.ts.map +1 -1
- package/dist/esm/external-providers/provider-metadata.shared.schemas.js +5 -2
- package/dist/esm/external-providers/provider-metadata.shared.schemas.js.map +1 -1
- package/dist/esm/features/application-features.shared.resources-config.schemas.d.ts +2 -0
- package/dist/esm/features/application-features.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/features/application-features.shared.resources-config.schemas.js +42 -3
- package/dist/esm/features/application-features.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/features/connected-feature.example.d.ts +64 -0
- package/dist/esm/features/connected-feature.example.d.ts.map +1 -0
- package/dist/esm/features/connected-feature.example.js +86 -0
- package/dist/esm/features/connected-feature.example.js.map +1 -0
- package/dist/esm/features/scope-features.shared.schemas.d.ts +53 -0
- package/dist/esm/features/scope-features.shared.schemas.d.ts.map +1 -1
- package/dist/esm/features/scope-features.shared.schemas.js +37 -0
- package/dist/esm/features/scope-features.shared.schemas.js.map +1 -1
- package/dist/esm/features/user-features.shared.resources-config.schemas.d.ts +1 -1
- package/dist/esm/features/user-features.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/features/user-features.shared.resources-config.schemas.js +42 -48
- package/dist/esm/features/user-features.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/files/file-remote-reference-link.shared.schemas.d.ts +73 -0
- package/dist/esm/files/file-remote-reference-link.shared.schemas.d.ts.map +1 -0
- package/dist/esm/files/file-remote-reference-link.shared.schemas.js +62 -0
- package/dist/esm/files/file-remote-reference-link.shared.schemas.js.map +1 -0
- package/dist/esm/files/files.shared.resources-config.schemas.d.ts +3 -3
- package/dist/esm/files/files.shared.resources-config.schemas.js +3 -3
- package/dist/esm/files/files.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/flows-actors/actors.shared.schemas.d.ts +152 -129
- package/dist/esm/flows-actors/actors.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/actors.shared.schemas.js +99 -2
- package/dist/esm/flows-actors/actors.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/agent-traceability.shared.schemas.d.ts +6 -0
- package/dist/esm/flows-actors/agent-traceability.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/agents.shared.schemas.d.ts +3 -3
- package/dist/esm/flows-actors/agents.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/agents.shared.schemas.js +11 -5
- package/dist/esm/flows-actors/agents.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/deliberation.shared.schemas.d.ts +13 -0
- package/dist/esm/flows-actors/deliberation.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/deliberation.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/execution-plan-readiness.shared.utils.d.ts +45 -0
- package/dist/esm/flows-actors/execution-plan-readiness.shared.utils.d.ts.map +1 -0
- package/dist/esm/flows-actors/execution-plan-readiness.shared.utils.js +51 -0
- package/dist/esm/flows-actors/execution-plan-readiness.shared.utils.js.map +1 -0
- package/dist/esm/flows-actors/flows-actors-execution.shared.schemas.d.ts +31 -0
- package/dist/esm/flows-actors/flows-actors-execution.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors-execution.shared.schemas.js +61 -3
- package/dist/esm/flows-actors/flows-actors-execution.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows-actors-task.shared.schemas.d.ts +2 -2
- package/dist/esm/flows-actors/flows-actors.commons.shared.schemas.d.ts +16 -8
- package/dist/esm/flows-actors/flows-actors.commons.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.commons.shared.schemas.js +23 -11
- package/dist/esm/flows-actors/flows-actors.commons.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows-actors.configuration.shared.schemas.d.ts +0 -189
- package/dist/esm/flows-actors/flows-actors.configuration.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.configuration.shared.schemas.js +14 -50
- package/dist/esm/flows-actors/flows-actors.configuration.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows-actors.frontend.shared.schemas.d.ts +0 -3
- package/dist/esm/flows-actors/flows-actors.frontend.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.frontend.shared.schemas.js +0 -1
- package/dist/esm/flows-actors/flows-actors.frontend.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows-actors.system.shared.schemas.d.ts +1 -67
- package/dist/esm/flows-actors/flows-actors.system.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/flows-actors.system.shared.schemas.js +1 -2
- package/dist/esm/flows-actors/flows-actors.system.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/flows.shared.schemas.d.ts +0 -1
- package/dist/esm/flows-actors/flows.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/human-decision.shared.schemas.d.ts +121 -0
- package/dist/esm/flows-actors/human-decision.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/human-decision.shared.schemas.js +252 -0
- package/dist/esm/flows-actors/human-decision.shared.schemas.js.map +1 -0
- package/dist/esm/flows-actors/mcp-servers.shared.schemas.d.ts +2 -0
- package/dist/esm/flows-actors/mcp-servers.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/mcp-servers.shared.schemas.js +13 -0
- package/dist/esm/flows-actors/mcp-servers.shared.schemas.js.map +1 -1
- package/dist/esm/flows-actors/provider-call-records.shared.resources-config.schemas.d.ts +24 -0
- package/dist/esm/flows-actors/provider-call-records.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/provider-call-records.shared.resources-config.schemas.js +80 -0
- package/dist/esm/flows-actors/provider-call-records.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/flows-actors/provider-call-records.shared.schemas.d.ts +123 -0
- package/dist/esm/flows-actors/provider-call-records.shared.schemas.d.ts.map +1 -0
- package/dist/esm/flows-actors/provider-call-records.shared.schemas.js +181 -0
- package/dist/esm/flows-actors/provider-call-records.shared.schemas.js.map +1 -0
- package/dist/esm/flows-actors/tasks.actors.shared.schemas.d.ts +58 -81
- package/dist/esm/flows-actors/tasks.actors.shared.schemas.d.ts.map +1 -1
- package/dist/esm/flows-actors/tasks.actors.shared.schemas.js +75 -38
- package/dist/esm/flows-actors/tasks.actors.shared.schemas.js.map +1 -1
- package/dist/esm/frontend-definitions/settings-destination-ref.definitions.d.ts +217 -0
- package/dist/esm/frontend-definitions/settings-destination-ref.definitions.d.ts.map +1 -0
- package/dist/esm/frontend-definitions/settings-destination-ref.definitions.js +230 -0
- package/dist/esm/frontend-definitions/settings-destination-ref.definitions.js.map +1 -0
- package/dist/esm/guidance/guidance-flow.shared.schemas.d.ts +106 -24
- package/dist/esm/guidance/guidance-flow.shared.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/guidance-flow.shared.schemas.js +152 -14
- package/dist/esm/guidance/guidance-flow.shared.schemas.js.map +1 -1
- package/dist/esm/guidance/lifecycle-state.shared.schemas.d.ts +0 -6
- package/dist/esm/guidance/lifecycle-state.shared.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/lifecycle-state.shared.schemas.js +0 -19
- package/dist/esm/guidance/lifecycle-state.shared.schemas.js.map +1 -1
- package/dist/esm/guidance/milestone-builders.shared.d.ts +4 -2
- package/dist/esm/guidance/milestone-builders.shared.d.ts.map +1 -1
- package/dist/esm/guidance/milestone-builders.shared.js +4 -2
- package/dist/esm/guidance/milestone-builders.shared.js.map +1 -1
- package/dist/esm/guidance/milestone-definition.shared.schemas.d.ts +66 -4
- package/dist/esm/guidance/milestone-definition.shared.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/milestone-definition.shared.schemas.js +50 -0
- package/dist/esm/guidance/milestone-definition.shared.schemas.js.map +1 -1
- package/dist/esm/guidance/progression-presentation.shared.schemas.d.ts +71 -0
- package/dist/esm/guidance/progression-presentation.shared.schemas.d.ts.map +1 -0
- package/dist/esm/guidance/progression-presentation.shared.schemas.js +72 -0
- package/dist/esm/guidance/progression-presentation.shared.schemas.js.map +1 -0
- package/dist/esm/guidance/progression-state.shared.resources-config.schemas.d.ts +2 -0
- package/dist/esm/guidance/progression-state.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/progression-state.shared.schemas.d.ts +4 -0
- package/dist/esm/guidance/progression-state.shared.schemas.d.ts.map +1 -1
- package/dist/esm/guidance/progression-state.shared.schemas.js +5 -0
- package/dist/esm/guidance/progression-state.shared.schemas.js.map +1 -1
- package/dist/esm/http-api-binding/http-api-binding-id.shared.utils.d.ts.map +1 -1
- package/dist/esm/http-api-binding/http-api-binding-id.shared.utils.js +2 -1
- package/dist/esm/http-api-binding/http-api-binding-id.shared.utils.js.map +1 -1
- package/dist/esm/http-api-binding/http-api-binding.shared.schemas.d.ts +181 -412
- package/dist/esm/http-api-binding/http-api-binding.shared.schemas.d.ts.map +1 -1
- package/dist/esm/http-api-binding/http-api-binding.shared.schemas.js +249 -199
- package/dist/esm/http-api-binding/http-api-binding.shared.schemas.js.map +1 -1
- package/dist/esm/http-api-binding/http-api-transport-dialect.shared.d.ts +107 -0
- package/dist/esm/http-api-binding/http-api-transport-dialect.shared.d.ts.map +1 -0
- package/dist/esm/http-api-binding/http-api-transport-dialect.shared.js +108 -0
- package/dist/esm/http-api-binding/http-api-transport-dialect.shared.js.map +1 -0
- package/dist/esm/http-api-binding/read-through-engine-anchors.shared.d.ts +38 -0
- package/dist/esm/http-api-binding/read-through-engine-anchors.shared.d.ts.map +1 -0
- package/dist/esm/http-api-binding/read-through-engine-anchors.shared.js +42 -0
- package/dist/esm/http-api-binding/read-through-engine-anchors.shared.js.map +1 -0
- package/dist/esm/index.d.ts +47 -4
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +77 -16
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/meta-workflows/actions.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/actions.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows/catalog.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/catalog.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows/coding-tasks.meta-workflows.shared.schemas.d.ts +130 -0
- package/dist/esm/meta-workflows/coding-tasks.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/coding-tasks.meta-workflows.shared.schemas.js +104 -0
- package/dist/esm/meta-workflows/coding-tasks.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows/context-selection.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/context-selection.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/decisions.meta-workflows.shared.schemas.d.ts +64 -0
- package/dist/esm/meta-workflows/decisions.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/decisions.meta-workflows.shared.schemas.js +47 -0
- package/dist/esm/meta-workflows/decisions.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.d.ts +544 -0
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.js +638 -0
- package/dist/esm/meta-workflows/orchestration.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/portable-primitives.meta-workflows.shared.schemas.d.ts +15 -8
- package/dist/esm/meta-workflows/portable-primitives.meta-workflows.shared.schemas.d.ts.map +1 -0
- package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/portable-primitives.meta-workflows.shared.schemas.js +15 -8
- package/dist/esm/meta-workflows/portable-primitives.meta-workflows.shared.schemas.js.map +1 -0
- package/dist/esm/meta-workflows.exports.d.ts +21 -25
- package/dist/esm/meta-workflows.exports.d.ts.map +1 -1
- package/dist/esm/meta-workflows.exports.js +21 -25
- package/dist/esm/meta-workflows.exports.js.map +1 -1
- package/dist/esm/notifications/email/email-submission.shared.enums.d.ts +16 -0
- package/dist/esm/notifications/email/email-submission.shared.enums.d.ts.map +1 -0
- package/dist/esm/notifications/email/email-submission.shared.enums.js +17 -0
- package/dist/esm/notifications/email/email-submission.shared.enums.js.map +1 -0
- package/dist/esm/notifications/email/email-template-registry.shared.schemas.d.ts +36 -0
- package/dist/esm/notifications/email/email-template-registry.shared.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/email/email-template-registry.shared.schemas.js +50 -3
- package/dist/esm/notifications/email/email-template-registry.shared.schemas.js.map +1 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.resources-config.schemas.js +4 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.schemas.d.ts +2 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.schemas.js +3 -2
- package/dist/esm/notifications/m2m/m2m-webhook-delivery-log.shared.schemas.js.map +1 -1
- package/dist/esm/notifications/m2m/webhook-config.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/m2m/webhook-config.shared.resources-config.schemas.js +44 -3
- package/dist/esm/notifications/m2m/webhook-config.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/notifications/notification-badges.shared.resources-config.schemas.d.ts +1 -1
- package/dist/esm/notifications/notification-badges.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/notification-badges.shared.resources-config.schemas.js +12 -33
- package/dist/esm/notifications/notification-badges.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/notifications/notifications.shared.schemas.d.ts +68 -6
- package/dist/esm/notifications/notifications.shared.schemas.d.ts.map +1 -1
- package/dist/esm/notifications/notifications.shared.schemas.js +68 -6
- package/dist/esm/notifications/notifications.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/application-owner-organization.shared.schemas.d.ts +145 -0
- package/dist/esm/organizations/application-owner-organization.shared.schemas.d.ts.map +1 -0
- package/dist/esm/organizations/application-owner-organization.shared.schemas.js +146 -0
- package/dist/esm/organizations/application-owner-organization.shared.schemas.js.map +1 -0
- package/dist/esm/organizations/organization-features.shared.resources-config.schemas.d.ts +2 -0
- package/dist/esm/organizations/organization-features.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-features.shared.resources-config.schemas.js +39 -3
- package/dist/esm/organizations/organization-features.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-members.shared.resources-config.schemas.d.ts +1 -1
- package/dist/esm/organizations/organization-members.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-members.shared.resources-config.schemas.js +18 -14
- package/dist/esm/organizations/organization-members.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-members.shared.schemas.d.ts +1 -1
- package/dist/esm/organizations/organization-members.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-members.shared.schemas.js +9 -1
- package/dist/esm/organizations/organization-members.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-preferences.shared.schemas.d.ts +2 -1
- package/dist/esm/organizations/organization-preferences.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-preferences.shared.schemas.js +3 -0
- package/dist/esm/organizations/organization-preferences.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-profile.shared.schemas.d.ts +3 -1
- package/dist/esm/organizations/organization-profile.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-profile.shared.schemas.js +4 -2
- package/dist/esm/organizations/organization-profile.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-unit-narrowing.shared.d.ts +29 -2
- package/dist/esm/organizations/organization-unit-narrowing.shared.d.ts.map +1 -1
- package/dist/esm/organizations/organization-unit-narrowing.shared.js +27 -0
- package/dist/esm/organizations/organization-unit-narrowing.shared.js.map +1 -1
- package/dist/esm/organizations/organization-units.shared.resources-config.schemas.d.ts +2 -0
- package/dist/esm/organizations/organization-units.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-units.shared.resources-config.schemas.js +3 -0
- package/dist/esm/organizations/organization-units.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/organizations/organization-units.shared.schemas.d.ts +17 -5
- package/dist/esm/organizations/organization-units.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organization-units.shared.schemas.js +65 -5
- package/dist/esm/organizations/organization-units.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/organizations.shared.resources-config.schemas.d.ts +51 -7
- package/dist/esm/organizations/organizations.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organizations.shared.resources-config.schemas.js +151 -7
- package/dist/esm/organizations/organizations.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/organizations/organizations.shared.schemas.d.ts +18 -83
- package/dist/esm/organizations/organizations.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/organizations.shared.schemas.js +37 -19
- package/dist/esm/organizations/organizations.shared.schemas.js.map +1 -1
- package/dist/esm/organizations/tenant-teardown-config.shared.schemas.d.ts +13 -0
- package/dist/esm/organizations/tenant-teardown-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/organizations/tenant-teardown-config.shared.schemas.js +13 -0
- package/dist/esm/organizations/tenant-teardown-config.shared.schemas.js.map +1 -1
- package/dist/esm/provider-registration-runtime.exports.d.ts +1 -0
- package/dist/esm/provider-registration-runtime.exports.d.ts.map +1 -1
- package/dist/esm/provider-registration-runtime.exports.js +1 -0
- package/dist/esm/provider-registration-runtime.exports.js.map +1 -1
- package/dist/esm/public-runtime/index.d.ts +53 -2
- package/dist/esm/public-runtime/index.d.ts.map +1 -1
- package/dist/esm/public-runtime/index.js +45 -2
- package/dist/esm/public-runtime/index.js.map +1 -1
- package/dist/esm/queue/jobs.shared.resources-config.schemas.d.ts +7 -8
- package/dist/esm/queue/jobs.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/queue/jobs.shared.resources-config.schemas.js +30 -6
- package/dist/esm/queue/jobs.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/queue/jobs.shared.schemas.d.ts +388 -2
- package/dist/esm/queue/jobs.shared.schemas.d.ts.map +1 -1
- package/dist/esm/queue/jobs.shared.schemas.js +315 -11
- package/dist/esm/queue/jobs.shared.schemas.js.map +1 -1
- package/dist/esm/queue/jobs.shared.utils.d.ts +6 -4
- package/dist/esm/queue/jobs.shared.utils.d.ts.map +1 -1
- package/dist/esm/queue/jobs.shared.utils.js +5 -4
- package/dist/esm/queue/jobs.shared.utils.js.map +1 -1
- package/dist/esm/queue/queues.shared.schemas.d.ts +20 -8
- package/dist/esm/queue/queues.shared.schemas.d.ts.map +1 -1
- package/dist/esm/queue/queues.shared.schemas.js +23 -18
- package/dist/esm/queue/queues.shared.schemas.js.map +1 -1
- package/dist/esm/queue/queues.shared.utils.d.ts +4 -2
- package/dist/esm/queue/queues.shared.utils.d.ts.map +1 -1
- package/dist/esm/queue/queues.shared.utils.js +4 -2
- package/dist/esm/queue/queues.shared.utils.js.map +1 -1
- package/dist/esm/rag/rag-retrieval-health.shared.d.ts +27 -0
- package/dist/esm/rag/rag-retrieval-health.shared.d.ts.map +1 -0
- package/dist/esm/rag/rag-retrieval-health.shared.js +29 -0
- package/dist/esm/rag/rag-retrieval-health.shared.js.map +1 -0
- package/dist/esm/requests/header-keys.shared.d.ts +6 -0
- package/dist/esm/requests/header-keys.shared.d.ts.map +1 -1
- package/dist/esm/requests/header-keys.shared.js +7 -0
- package/dist/esm/requests/header-keys.shared.js.map +1 -1
- package/dist/esm/requests/idempotency-key.shared.d.ts +76 -0
- package/dist/esm/requests/idempotency-key.shared.d.ts.map +1 -0
- package/dist/esm/requests/idempotency-key.shared.js +112 -0
- package/dist/esm/requests/idempotency-key.shared.js.map +1 -0
- package/dist/esm/requests/manual-controllers-routes-documentation.d.ts.map +1 -1
- package/dist/esm/requests/manual-controllers-routes-documentation.js +275 -20
- package/dist/esm/requests/manual-controllers-routes-documentation.js.map +1 -1
- package/dist/esm/requests/manual-controllers-routes-urls.d.ts +134 -0
- package/dist/esm/requests/manual-controllers-routes-urls.d.ts.map +1 -1
- package/dist/esm/requests/manual-controllers-routes-urls.js +153 -0
- package/dist/esm/requests/manual-controllers-routes-urls.js.map +1 -1
- package/dist/esm/requests/websocket.shared.schemas.d.ts +198 -20
- package/dist/esm/requests/websocket.shared.schemas.d.ts.map +1 -1
- package/dist/esm/requests/websocket.shared.schemas.js +236 -5
- package/dist/esm/requests/websocket.shared.schemas.js.map +1 -1
- package/dist/esm/resources/child-operations.shared.schemas.d.ts +56 -5
- package/dist/esm/resources/child-operations.shared.schemas.d.ts.map +1 -1
- package/dist/esm/resources/child-operations.shared.schemas.js +97 -5
- package/dist/esm/resources/child-operations.shared.schemas.js.map +1 -1
- package/dist/esm/resources/context-policy.shared.schemas.d.ts +20 -0
- package/dist/esm/resources/context-policy.shared.schemas.d.ts.map +1 -1
- package/dist/esm/resources/context-policy.shared.schemas.js +3 -0
- package/dist/esm/resources/context-policy.shared.schemas.js.map +1 -1
- package/dist/esm/resources/resources-config.shared.factory.d.ts.map +1 -1
- package/dist/esm/resources/resources-config.shared.factory.js +596 -34
- package/dist/esm/resources/resources-config.shared.factory.js.map +1 -1
- package/dist/esm/resources/resources-config.shared.schemas.d.ts +665 -40
- package/dist/esm/resources/resources-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/resources/resources-config.shared.schemas.js +315 -22
- package/dist/esm/resources/resources-config.shared.schemas.js.map +1 -1
- package/dist/esm/resources/resources-registry.shared.core.definitions.d.ts.map +1 -1
- package/dist/esm/resources/resources-registry.shared.core.definitions.js +431 -69
- package/dist/esm/resources/resources-registry.shared.core.definitions.js.map +1 -1
- package/dist/esm/resources/resources.shared.core.definitions.d.ts +36 -0
- package/dist/esm/resources/resources.shared.core.definitions.d.ts.map +1 -1
- package/dist/esm/resources/resources.shared.core.definitions.js +46 -0
- package/dist/esm/resources/resources.shared.core.definitions.js.map +1 -1
- package/dist/esm/resources/resources.shared.schemas.d.ts +256 -10
- package/dist/esm/resources/resources.shared.schemas.d.ts.map +1 -1
- package/dist/esm/resources/resources.shared.schemas.js +209 -9
- package/dist/esm/resources/resources.shared.schemas.js.map +1 -1
- package/dist/esm/resources/resources.shared.utils.d.ts +34 -8
- package/dist/esm/resources/resources.shared.utils.d.ts.map +1 -1
- package/dist/esm/resources/resources.shared.utils.js +69 -12
- package/dist/esm/resources/resources.shared.utils.js.map +1 -1
- package/dist/esm/resources/utils/composition-cascade-deletability.validation.d.ts +44 -12
- package/dist/esm/resources/utils/composition-cascade-deletability.validation.d.ts.map +1 -1
- package/dist/esm/resources/utils/composition-cascade-deletability.validation.js +46 -23
- package/dist/esm/resources/utils/composition-cascade-deletability.validation.js.map +1 -1
- package/dist/esm/resources/utils/dependent-lifecycle-classification.validation.d.ts +61 -0
- package/dist/esm/resources/utils/dependent-lifecycle-classification.validation.d.ts.map +1 -0
- package/dist/esm/resources/utils/dependent-lifecycle-classification.validation.js +79 -0
- package/dist/esm/resources/utils/dependent-lifecycle-classification.validation.js.map +1 -0
- package/dist/esm/resources/utils/initiator-stamped-field-satisfiability.validation.d.ts +60 -0
- package/dist/esm/resources/utils/initiator-stamped-field-satisfiability.validation.d.ts.map +1 -0
- package/dist/esm/resources/utils/initiator-stamped-field-satisfiability.validation.js +80 -0
- package/dist/esm/resources/utils/initiator-stamped-field-satisfiability.validation.js.map +1 -0
- package/dist/esm/resources/utils/populated-file-fields.shared.utils.d.ts +21 -0
- package/dist/esm/resources/utils/populated-file-fields.shared.utils.d.ts.map +1 -0
- package/dist/esm/resources/utils/populated-file-fields.shared.utils.js +159 -0
- package/dist/esm/resources/utils/populated-file-fields.shared.utils.js.map +1 -0
- package/dist/esm/resources/utils/resources-config-naming.utils.d.ts +15 -0
- package/dist/esm/resources/utils/resources-config-naming.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-config-naming.utils.js +56 -11
- package/dist/esm/resources/utils/resources-config-naming.utils.js.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.d.ts +51 -1
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.js +210 -51
- package/dist/esm/resources/utils/resources-config-operations.dtos-builder.utils.js.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.urls-builder.utils.d.ts +34 -0
- package/dist/esm/resources/utils/resources-config-operations.urls-builder.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/resources-config-operations.urls-builder.utils.js +45 -1
- package/dist/esm/resources/utils/resources-config-operations.urls-builder.utils.js.map +1 -1
- package/dist/esm/resources/utils/shared-persistence-collection.utils.d.ts +29 -0
- package/dist/esm/resources/utils/shared-persistence-collection.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/shared-persistence-collection.utils.js +30 -0
- package/dist/esm/resources/utils/shared-persistence-collection.utils.js.map +1 -1
- package/dist/esm/resources/utils/templatable-file-fields.shared.utils.d.ts.map +1 -1
- package/dist/esm/resources/utils/templatable-file-fields.shared.utils.js +49 -11
- package/dist/esm/resources/utils/templatable-file-fields.shared.utils.js.map +1 -1
- package/dist/esm/security/api-keys/api-keys-application.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-keys-application.shared.resources-config.schemas.js +4 -1
- package/dist/esm/security/api-keys/api-keys-application.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/api-keys/api-keys-organization.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/api-keys/api-keys-organization.shared.resources-config.schemas.js +4 -1
- package/dist/esm/security/api-keys/api-keys-organization.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.dto.schemas.d.ts +129 -17
- package/dist/esm/security/authentications/authentication.shared.dto.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.dto.schemas.js +160 -6
- package/dist/esm/security/authentications/authentication.shared.dto.schemas.js.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.schemas.d.ts +324 -9
- package/dist/esm/security/authentications/authentication.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.schemas.js +411 -8
- package/dist/esm/security/authentications/authentication.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.utils.d.ts +87 -4
- package/dist/esm/security/authentications/authentication.shared.utils.d.ts.map +1 -1
- package/dist/esm/security/authentications/authentication.shared.utils.js +95 -6
- package/dist/esm/security/authentications/authentication.shared.utils.js.map +1 -1
- package/dist/esm/security/authentications/consumable-token.shared.schemas.d.ts +23 -1
- package/dist/esm/security/authentications/consumable-token.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/consumable-token.shared.schemas.js +23 -1
- package/dist/esm/security/authentications/consumable-token.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/cross-frontend-handoff.shared.dto.schemas.d.ts +7 -1
- package/dist/esm/security/authentications/cross-frontend-handoff.shared.dto.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/cross-frontend-handoff.shared.dto.schemas.js +7 -1
- package/dist/esm/security/authentications/cross-frontend-handoff.shared.dto.schemas.js.map +1 -1
- package/dist/esm/security/authentications/password-blocklist.shared.utils.d.ts +74 -0
- package/dist/esm/security/authentications/password-blocklist.shared.utils.d.ts.map +1 -0
- package/dist/esm/security/authentications/password-blocklist.shared.utils.js +122 -0
- package/dist/esm/security/authentications/password-blocklist.shared.utils.js.map +1 -0
- package/dist/esm/security/authentications/registration.shared.dto.schemas.d.ts +88 -2
- package/dist/esm/security/authentications/registration.shared.dto.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/registration.shared.dto.schemas.js +149 -2
- package/dist/esm/security/authentications/registration.shared.dto.schemas.js.map +1 -1
- package/dist/esm/security/authentications/scim/scim-organization-unit-mapping.shared.d.ts +57 -11
- package/dist/esm/security/authentications/scim/scim-organization-unit-mapping.shared.d.ts.map +1 -1
- package/dist/esm/security/authentications/scim/scim-organization-unit-mapping.shared.js +44 -11
- package/dist/esm/security/authentications/scim/scim-organization-unit-mapping.shared.js.map +1 -1
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.resources-config.schemas.js +20 -7
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.schemas.d.ts +16 -2
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.schemas.js +32 -2
- package/dist/esm/security/authentications/scim/scim-provisioning-config.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/scim/scim-tokens.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/scim/scim-tokens.shared.resources-config.schemas.js +7 -1
- package/dist/esm/security/authentications/scim/scim-tokens.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/siem/siem-delivery-dlq.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/siem/siem-delivery-dlq.shared.resources-config.schemas.js +4 -1
- package/dist/esm/security/authentications/siem/siem-delivery-dlq.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.resources-config.schemas.d.ts +27 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.resources-config.schemas.js +109 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.schemas.d.ts +66 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.schemas.d.ts.map +1 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.schemas.js +107 -0
- package/dist/esm/security/authentications/siem/siem-delivery-outbox.shared.schemas.js.map +1 -0
- package/dist/esm/security/authentications/siem/siem-export-config.shared.resources-config.schemas.d.ts +19 -0
- package/dist/esm/security/authentications/siem/siem-export-config.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/siem/siem-export-config.shared.resources-config.schemas.js +50 -13
- package/dist/esm/security/authentications/siem/siem-export-config.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/siem/siem-export-config.shared.schemas.d.ts +18 -6
- package/dist/esm/security/authentications/siem/siem-export-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/siem/siem-export-config.shared.schemas.js +133 -4
- package/dist/esm/security/authentications/siem/siem-export-config.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/sso/sso-config.shared.resources-config.schemas.d.ts +29 -3
- package/dist/esm/security/authentications/sso/sso-config.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/sso/sso-config.shared.resources-config.schemas.js +81 -22
- package/dist/esm/security/authentications/sso/sso-config.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/sso/sso-config.shared.schemas.d.ts +0 -40
- package/dist/esm/security/authentications/sso/sso-config.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/sso/sso-config.shared.schemas.js +100 -26
- package/dist/esm/security/authentications/sso/sso-config.shared.schemas.js.map +1 -1
- package/dist/esm/security/authentications/sso/sso-connection.shared.resources-config.schemas.d.ts +9 -1
- package/dist/esm/security/authentications/sso/sso-connection.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/sso/sso-connection.shared.resources-config.schemas.js +9 -1
- package/dist/esm/security/authentications/sso/sso-connection.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/authentications/sso/sso-connection.shared.schemas.d.ts +8 -2
- package/dist/esm/security/authentications/sso/sso-connection.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authentications/sso/sso-connection.shared.schemas.js +91 -4
- package/dist/esm/security/authentications/sso/sso-connection.shared.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/administrative-continuity.shared.schemas.d.ts +50 -6
- package/dist/esm/security/authorizations/administrative-continuity.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authorizations/administrative-continuity.shared.schemas.js +50 -6
- package/dist/esm/security/authorizations/administrative-continuity.shared.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/application-access-grants.shared.resources-config.schemas.d.ts +39 -0
- package/dist/esm/security/authorizations/application-access-grants.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/security/authorizations/application-access-grants.shared.resources-config.schemas.js +265 -0
- package/dist/esm/security/authorizations/application-access-grants.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/security/authorizations/application-access-grants.shared.schemas.d.ts +187 -0
- package/dist/esm/security/authorizations/application-access-grants.shared.schemas.d.ts.map +1 -0
- package/dist/esm/security/authorizations/application-access-grants.shared.schemas.js +271 -0
- package/dist/esm/security/authorizations/application-access-grants.shared.schemas.js.map +1 -0
- package/dist/esm/security/authorizations/platform-access-grants.shared.schemas.d.ts +23 -0
- package/dist/esm/security/authorizations/platform-access-grants.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authorizations/platform-access-grants.shared.schemas.js +24 -0
- package/dist/esm/security/authorizations/platform-access-grants.shared.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.defaults.d.ts.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.defaults.js +6 -0
- package/dist/esm/security/authorizations/roles.shared.defaults.js.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.schemas.d.ts +14 -0
- package/dist/esm/security/authorizations/roles.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.schemas.js +19 -0
- package/dist/esm/security/authorizations/roles.shared.schemas.js.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.utils.d.ts.map +1 -1
- package/dist/esm/security/authorizations/roles.shared.utils.js +2 -0
- package/dist/esm/security/authorizations/roles.shared.utils.js.map +1 -1
- package/dist/esm/security/connected-accounts/provider-credentials-organization.shared.resources-config.schemas.d.ts +4 -1
- package/dist/esm/security/connected-accounts/provider-credentials-organization.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/connected-accounts/provider-credentials-user.shared.resources-config.schemas.d.ts +5 -2
- package/dist/esm/security/connected-accounts/provider-credentials-user.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/connected-accounts/provider-credentials-user.shared.resources-config.schemas.js +13 -42
- package/dist/esm/security/connected-accounts/provider-credentials-user.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/connected-accounts/provider-credentials.shared.schemas.d.ts +257 -13
- package/dist/esm/security/connected-accounts/provider-credentials.shared.schemas.d.ts.map +1 -1
- package/dist/esm/security/connected-accounts/provider-credentials.shared.schemas.js +281 -49
- package/dist/esm/security/connected-accounts/provider-credentials.shared.schemas.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients-application.shared.resources-config.schemas.d.ts +6 -3
- package/dist/esm/security/oauth-clients/oauth-clients-application.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients-application.shared.resources-config.schemas.js +74 -4
- package/dist/esm/security/oauth-clients/oauth-clients-application.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients-organization.shared.resources-config.schemas.d.ts +5 -2
- package/dist/esm/security/oauth-clients/oauth-clients-organization.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/security/oauth-clients/oauth-clients-organization.shared.resources-config.schemas.js +105 -3
- package/dist/esm/security/oauth-clients/oauth-clients-organization.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/security/outbound-target-control.shared.schemas.d.ts +67 -0
- package/dist/esm/security/outbound-target-control.shared.schemas.d.ts.map +1 -0
- package/dist/esm/security/outbound-target-control.shared.schemas.js +69 -0
- package/dist/esm/security/outbound-target-control.shared.schemas.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-credential-kind.shared.d.ts +159 -0
- package/dist/esm/systems-of-record/system-of-record-credential-kind.shared.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-credential-kind.shared.js +164 -0
- package/dist/esm/systems-of-record/system-of-record-credential-kind.shared.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-declaration.shared.schemas.d.ts +209 -0
- package/dist/esm/systems-of-record/system-of-record-declaration.shared.schemas.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-declaration.shared.schemas.js +150 -0
- package/dist/esm/systems-of-record/system-of-record-declaration.shared.schemas.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-env.shared.d.ts +79 -0
- package/dist/esm/systems-of-record/system-of-record-env.shared.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-env.shared.js +116 -0
- package/dist/esm/systems-of-record/system-of-record-env.shared.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-error-codes.shared.d.ts +145 -0
- package/dist/esm/systems-of-record/system-of-record-error-codes.shared.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-error-codes.shared.js +146 -0
- package/dist/esm/systems-of-record/system-of-record-error-codes.shared.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-facet.shared.schemas.d.ts +478 -0
- package/dist/esm/systems-of-record/system-of-record-facet.shared.schemas.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-facet.shared.schemas.js +619 -0
- package/dist/esm/systems-of-record/system-of-record-facet.shared.schemas.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.resources-config.schemas.d.ts +31 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.resources-config.schemas.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.resources-config.schemas.js +232 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.resources-config.schemas.js.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.schemas.d.ts +127 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.schemas.d.ts.map +1 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.schemas.js +204 -0
- package/dist/esm/systems-of-record/system-of-record-partition-assignments.shared.schemas.js.map +1 -0
- package/dist/esm/testing/resource-config-builders.d.ts.map +1 -1
- package/dist/esm/testing/resource-config-builders.js +10 -4
- package/dist/esm/testing/resource-config-builders.js.map +1 -1
- package/dist/esm/users/anonymous-user-marketing-metadata.shared.schemas.d.ts +2 -1
- package/dist/esm/users/anonymous-user-marketing-metadata.shared.schemas.d.ts.map +1 -1
- package/dist/esm/users/anonymous-user-marketing-metadata.shared.schemas.js +2 -1
- package/dist/esm/users/anonymous-user-marketing-metadata.shared.schemas.js.map +1 -1
- package/dist/esm/users/anonymous-users.shared.resources-config.schemas.d.ts +139 -24
- package/dist/esm/users/anonymous-users.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/anonymous-users.shared.resources-config.schemas.js +255 -0
- package/dist/esm/users/anonymous-users.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/anonymous-users.shared.schema.d.ts +5 -3
- package/dist/esm/users/anonymous-users.shared.schema.d.ts.map +1 -1
- package/dist/esm/users/anonymous-users.shared.schema.js +18 -1
- package/dist/esm/users/anonymous-users.shared.schema.js.map +1 -1
- package/dist/esm/users/inbound-contacts.shared.resources-config.schemas.d.ts +2 -1
- package/dist/esm/users/inbound-contacts.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/inbound-contacts.shared.resources-config.schemas.js +23 -0
- package/dist/esm/users/inbound-contacts.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/inbound-contacts.shared.schemas.d.ts +2 -1
- package/dist/esm/users/inbound-contacts.shared.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-consent-decision.shared.utils.d.ts +127 -0
- package/dist/esm/users/user-consent-decision.shared.utils.d.ts.map +1 -0
- package/dist/esm/users/user-consent-decision.shared.utils.js +189 -0
- package/dist/esm/users/user-consent-decision.shared.utils.js.map +1 -0
- package/dist/esm/users/user-identity-links.shared.resources-config.schemas.d.ts +1 -0
- package/dist/esm/users/user-identity-links.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-identity-links.shared.schemas.d.ts +1 -0
- package/dist/esm/users/user-identity-links.shared.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-identity-links.shared.schemas.js +30 -0
- package/dist/esm/users/user-identity-links.shared.schemas.js.map +1 -1
- package/dist/esm/users/user-preferences-reset.shared.utils.d.ts +6 -6
- package/dist/esm/users/user-preferences-reset.shared.utils.js +6 -6
- package/dist/esm/users/user-preferences-reset.shared.utils.js.map +1 -1
- package/dist/esm/users/user-preferences.shared.resources-config.schemas.d.ts +74 -29
- package/dist/esm/users/user-preferences.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-preferences.shared.resources-config.schemas.js +99 -0
- package/dist/esm/users/user-preferences.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/user-profiles.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-profiles.shared.resources-config.schemas.js +25 -9
- package/dist/esm/users/user-profiles.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/user-self-preferences.shared.resources-config.schemas.d.ts +4 -4
- package/dist/esm/users/user-self-preferences.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-self-preferences.shared.resources-config.schemas.js +12 -1
- package/dist/esm/users/user-self-preferences.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/user-self.shared.resources-config.schemas.d.ts +1 -0
- package/dist/esm/users/user-self.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/user-self.shared.resources-config.schemas.js +2 -2
- package/dist/esm/users/user-self.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/users.shared.resources-config.schemas.d.ts +1 -0
- package/dist/esm/users/users.shared.resources-config.schemas.d.ts.map +1 -1
- package/dist/esm/users/users.shared.resources-config.schemas.js +2 -2
- package/dist/esm/users/users.shared.resources-config.schemas.js.map +1 -1
- package/dist/esm/users/users.shared.schemas.d.ts +28 -10
- package/dist/esm/users/users.shared.schemas.d.ts.map +1 -1
- package/dist/esm/users/users.shared.schemas.js +86 -11
- package/dist/esm/users/users.shared.schemas.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +14 -35
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint-agent-personas.shared.enums.d.ts +0 -19
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint-agent-personas.shared.enums.d.ts.map +0 -1
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint-agent-personas.shared.enums.js +0 -35
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint-agent-personas.shared.enums.js.map +0 -1
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint.shared.schemas.d.ts +0 -213
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint.shared.schemas.js +0 -287
- package/dist/esm/flows-actors/apps-blueprint/apps-blueprint.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/apps-blueprint/artifacts.apps-blueprint.shared.schemas.d.ts +0 -236
- package/dist/esm/flows-actors/apps-blueprint/artifacts.apps-blueprint.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/apps-blueprint/artifacts.apps-blueprint.shared.schemas.js +0 -212
- package/dist/esm/flows-actors/apps-blueprint/artifacts.apps-blueprint.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/actions.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/actions.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/budget-authority.meta-workflows.shared.schemas.d.ts +0 -17
- package/dist/esm/flows-actors/meta-workflows/budget-authority.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/budget-authority.meta-workflows.shared.schemas.js +0 -31
- package/dist/esm/flows-actors/meta-workflows/budget-authority.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/catalog.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/catalog.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/context-selection.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/context-selection.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/continuity-identifiers.meta-workflows.shared.schemas.d.ts +0 -28
- package/dist/esm/flows-actors/meta-workflows/continuity-identifiers.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/continuity-identifiers.meta-workflows.shared.schemas.js +0 -28
- package/dist/esm/flows-actors/meta-workflows/continuity-identifiers.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/decisions.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/decisions.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/execution-binding-common.meta-workflows.shared.schemas.d.ts +0 -100
- package/dist/esm/flows-actors/meta-workflows/execution-binding-common.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/execution-binding-common.meta-workflows.shared.schemas.js +0 -232
- package/dist/esm/flows-actors/meta-workflows/execution-binding-common.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/execution-binding-vocabularies.meta-workflows.shared.schemas.d.ts +0 -29
- package/dist/esm/flows-actors/meta-workflows/execution-binding-vocabularies.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/execution-binding-vocabularies.meta-workflows.shared.schemas.js +0 -58
- package/dist/esm/flows-actors/meta-workflows/execution-binding-vocabularies.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/portable-primitives.meta-workflows.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/meta-workflows/portable-primitives.meta-workflows.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/task-continuity-binding.actors.shared.schemas.d.ts +0 -81
- package/dist/esm/flows-actors/task-continuity-binding.actors.shared.schemas.d.ts.map +0 -1
- package/dist/esm/flows-actors/task-continuity-binding.actors.shared.schemas.js +0 -82
- package/dist/esm/flows-actors/task-continuity-binding.actors.shared.schemas.js.map +0 -1
- package/dist/esm/flows-actors/utils/flow-actors.context-builder.apps-context.shared.utils.d.ts +0 -2
- package/dist/esm/flows-actors/utils/flow-actors.context-builder.apps-context.shared.utils.d.ts.map +0 -1
- package/dist/esm/flows-actors/utils/flow-actors.context-builder.apps-context.shared.utils.js +0 -1
- package/dist/esm/flows-actors/utils/flow-actors.context-builder.apps-context.shared.utils.js.map +0 -1
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/actions.meta-workflows.shared.schemas.d.ts +0 -0
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/actions.meta-workflows.shared.schemas.js +0 -0
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/catalog.meta-workflows.shared.schemas.d.ts +0 -0
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/catalog.meta-workflows.shared.schemas.js +0 -0
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/context-selection.meta-workflows.shared.schemas.d.ts +0 -0
- /package/dist/esm/{flows-actors/meta-workflows → meta-workflows}/context-selection.meta-workflows.shared.schemas.js +0 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { getObjectShape, getZodDefArrayProperty, isDiscriminatedUnion, isOptional, isZodTypeAny, } from '@wildo-ai/zod-decorators';
|
|
2
|
+
/**
|
|
3
|
+
* Registry-level guard: a field the ENGINE stamps from the initiator's USER must not be REQUIRED.
|
|
4
|
+
*
|
|
5
|
+
* ## The shape (#584)
|
|
6
|
+
*
|
|
7
|
+
* `createdByUserId` is stripped from the CREATE DTO by name — a client may never author it — and is
|
|
8
|
+
* stamped by the repository from `executionContext.initiatorIds.userId`, guarded by `if (userId)` in
|
|
9
|
+
* both adapters (`addUserTracking`, and the PostgreSQL adapter's own copy). `updatedByUserId` /
|
|
10
|
+
* `lastUpdatedByUserId` are stamped the same way on UPDATE.
|
|
11
|
+
*
|
|
12
|
+
* **A machine principal has no `userId`.** An org or application service acting over MCP, A2A,
|
|
13
|
+
* client credentials, a worker or a batch supplies none, so a REQUIRED one of these fields is
|
|
14
|
+
* satisfied by nobody: not the client (stripped), not the repository (the guard skips). Nothing said
|
|
15
|
+
* so at registration or at exposure, and the write failed — or committed and then failed to describe
|
|
16
|
+
* itself — the first time a machine caller reached the resource. That is how `todos` and `todoLists`
|
|
17
|
+
* were found (#577), each only after being exposed.
|
|
18
|
+
*
|
|
19
|
+
* ## A refusal at boot, and why it was a report first
|
|
20
|
+
*
|
|
21
|
+
* The backend refuses to start when this returns anything — the engine's own measurement is that a
|
|
22
|
+
* declaration gets made if and only if the framework refuses to start without it.
|
|
23
|
+
*
|
|
24
|
+
* It shipped as a startup REPORT on the belief that flipping the existing declarations to optional
|
|
25
|
+
* changes PostgreSQL column nullability and so owes a migration in every surface. It does not: the
|
|
26
|
+
* schema planner's contract (version 3) records `sqlType`, `hasIndex`, `isPrimaryKey`, `unique` and
|
|
27
|
+
* `defaultClause` per column and no nullability, so a required-vs-optional change is enforced by the
|
|
28
|
+
* Zod layer alone and leaves every lockfile in sync. Measured on all three PostgreSQL surfaces
|
|
29
|
+
* before the promotion, with the existing declarations flipped in the same change.
|
|
30
|
+
*
|
|
31
|
+
* ## Scope
|
|
32
|
+
*
|
|
33
|
+
* - Only the user-stamped identifiers. The primary-scope foreign keys (`organizationId`, …) are also
|
|
34
|
+
* context-populated, but from the SCOPE, which a machine principal does carry — they are required on
|
|
35
|
+
* purpose.
|
|
36
|
+
* - System resources are skipped: the framework owns their write paths and supplies or refuses the
|
|
37
|
+
* attribution explicitly (the SCIM token mint refuses a principal with no user).
|
|
38
|
+
* - Discriminated-union (polymorphic) schemas are checked on every variant that declares the field.
|
|
39
|
+
*/
|
|
40
|
+
export const INITIATOR_USER_STAMPED_FIELD_IDENTIFIERS = ['createdByUserId', 'updatedByUserId', 'lastUpdatedByUserId'];
|
|
41
|
+
/** Every object shape a main schema can present: itself, or each discriminated-union variant. */
|
|
42
|
+
function objectShapesOf(mainSchema) {
|
|
43
|
+
const direct = getObjectShape(mainSchema);
|
|
44
|
+
if (direct)
|
|
45
|
+
return [direct];
|
|
46
|
+
if (!isDiscriminatedUnion(mainSchema))
|
|
47
|
+
return [];
|
|
48
|
+
return (getZodDefArrayProperty(mainSchema, 'options') ?? [])
|
|
49
|
+
.filter(isZodTypeAny)
|
|
50
|
+
.map((option) => getObjectShape(option))
|
|
51
|
+
.filter((shape) => !!shape);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Report every non-system resource that declares an initiator-user-stamped field as REQUIRED.
|
|
55
|
+
* `isOptional` treats `.optional()`, `.default()` and `.nullish()` as optional; a bare `.nullable()`
|
|
56
|
+
* stays required, which is correct — `null` is not what the stamp's absence produces.
|
|
57
|
+
*/
|
|
58
|
+
export function validateInitiatorStampedFieldSatisfiability(resourceConfigurations) {
|
|
59
|
+
const violations = [];
|
|
60
|
+
for (const configuration of Object.values(resourceConfigurations)) {
|
|
61
|
+
if (!configuration?.mainSchema || configuration.isSystemResource)
|
|
62
|
+
continue;
|
|
63
|
+
const shapes = objectShapesOf(configuration.mainSchema);
|
|
64
|
+
for (const field of INITIATOR_USER_STAMPED_FIELD_IDENTIFIERS) {
|
|
65
|
+
const requiredSomewhere = shapes.some((shape) => shape[field] && !isOptional(shape[field]));
|
|
66
|
+
if (!requiredSomewhere)
|
|
67
|
+
continue;
|
|
68
|
+
violations.push({
|
|
69
|
+
resourceType: configuration.resourceIdentifier,
|
|
70
|
+
field,
|
|
71
|
+
message: `[${String(configuration.resourceIdentifier)}] declares '${field}' as REQUIRED, but the engine stamps it only when`
|
|
72
|
+
+ ' the initiator has a userId. A machine principal (MCP, A2A, client credentials, a worker, a batch) has none,'
|
|
73
|
+
+ ' and a client may never send it, so a machine write to this resource cannot be satisfied.'
|
|
74
|
+
+ ` Declare it \`.optional()\` — and generate the migration its nullability change owes.`,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return violations;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=initiator-stamped-field-satisfiability.validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initiator-stamped-field-satisfiability.validation.js","sourceRoot":"","sources":["../../../../../src/resources/utils/initiator-stamped-field-satisfiability.validation.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,UAAU,EACV,YAAY,GACb,MAAM,0BAA0B,CAAC;AAGlC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,MAAM,wCAAwC,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,CAAU,CAAC;AAiB/H,iGAAiG;AACjG,SAAS,cAAc,CAAC,UAAwB;IAC9C,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,MAAM;QAAE,OAAO,CAAC,MAAsC,CAAC,CAAC;IAC5D,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IACjD,OAAO,CAAC,sBAAsB,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;SACzD,MAAM,CAAC,YAAY,CAAC;SACpB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;SACvC,MAAM,CAAC,CAAC,KAAK,EAAyC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2CAA2C,CACzD,sBAAoF;IAEpF,MAAM,UAAU,GAAqC,EAAE,CAAC;IACxD,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,aAAa,EAAE,UAAU,IAAI,aAAa,CAAC,gBAAgB;YAAE,SAAS;QAC3E,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACxD,KAAK,MAAM,KAAK,IAAI,wCAAwC,EAAE,CAAC;YAC7D,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5F,IAAI,CAAC,iBAAiB;gBAAE,SAAS;YACjC,UAAU,CAAC,IAAI,CAAC;gBACd,YAAY,EAAE,aAAa,CAAC,kBAAkB;gBAC9C,KAAK;gBACL,OAAO,EACL,IAAI,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,eAAe,KAAK,mDAAmD;sBACjH,8GAA8G;sBAC9G,2FAA2F;sBAC3F,uFAAuF;aAC5F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC","sourcesContent":["import { z } from 'zod';\nimport {\n getObjectShape,\n getZodDefArrayProperty,\n isDiscriminatedUnion,\n isOptional,\n isZodTypeAny,\n} from '@wildo-ai/zod-decorators';\nimport type { ResourceType } from '../resources.shared.core.definitions';\n\n/**\n * Registry-level guard: a field the ENGINE stamps from the initiator's USER must not be REQUIRED.\n *\n * ## The shape (#584)\n *\n * `createdByUserId` is stripped from the CREATE DTO by name — a client may never author it — and is\n * stamped by the repository from `executionContext.initiatorIds.userId`, guarded by `if (userId)` in\n * both adapters (`addUserTracking`, and the PostgreSQL adapter's own copy). `updatedByUserId` /\n * `lastUpdatedByUserId` are stamped the same way on UPDATE.\n *\n * **A machine principal has no `userId`.** An org or application service acting over MCP, A2A,\n * client credentials, a worker or a batch supplies none, so a REQUIRED one of these fields is\n * satisfied by nobody: not the client (stripped), not the repository (the guard skips). Nothing said\n * so at registration or at exposure, and the write failed — or committed and then failed to describe\n * itself — the first time a machine caller reached the resource. That is how `todos` and `todoLists`\n * were found (#577), each only after being exposed.\n *\n * ## A refusal at boot, and why it was a report first\n *\n * The backend refuses to start when this returns anything — the engine's own measurement is that a\n * declaration gets made if and only if the framework refuses to start without it.\n *\n * It shipped as a startup REPORT on the belief that flipping the existing declarations to optional\n * changes PostgreSQL column nullability and so owes a migration in every surface. It does not: the\n * schema planner's contract (version 3) records `sqlType`, `hasIndex`, `isPrimaryKey`, `unique` and\n * `defaultClause` per column and no nullability, so a required-vs-optional change is enforced by the\n * Zod layer alone and leaves every lockfile in sync. Measured on all three PostgreSQL surfaces\n * before the promotion, with the existing declarations flipped in the same change.\n *\n * ## Scope\n *\n * - Only the user-stamped identifiers. The primary-scope foreign keys (`organizationId`, …) are also\n * context-populated, but from the SCOPE, which a machine principal does carry — they are required on\n * purpose.\n * - System resources are skipped: the framework owns their write paths and supplies or refuses the\n * attribution explicitly (the SCIM token mint refuses a principal with no user).\n * - Discriminated-union (polymorphic) schemas are checked on every variant that declares the field.\n */\nexport const INITIATOR_USER_STAMPED_FIELD_IDENTIFIERS = ['createdByUserId', 'updatedByUserId', 'lastUpdatedByUserId'] as const;\n\nexport type InitiatorUserStampedFieldIdentifier = typeof INITIATOR_USER_STAMPED_FIELD_IDENTIFIERS[number];\n\nexport interface InitiatorStampedFieldViolation {\n readonly resourceType: ResourceType;\n readonly field: InitiatorUserStampedFieldIdentifier;\n readonly message: string;\n}\n\n/** Structural subset of a resource configuration this validator needs. */\nexport interface InitiatorStampedFieldResourceInput {\n readonly resourceIdentifier: ResourceType;\n readonly mainSchema: z.ZodTypeAny;\n readonly isSystemResource?: boolean;\n}\n\n/** Every object shape a main schema can present: itself, or each discriminated-union variant. */\nfunction objectShapesOf(mainSchema: z.ZodTypeAny): Record<string, z.ZodTypeAny>[] {\n const direct = getObjectShape(mainSchema);\n if (direct) return [direct as Record<string, z.ZodTypeAny>];\n if (!isDiscriminatedUnion(mainSchema)) return [];\n return (getZodDefArrayProperty(mainSchema, 'options') ?? [])\n .filter(isZodTypeAny)\n .map((option) => getObjectShape(option))\n .filter((shape): shape is Record<string, z.ZodTypeAny> => !!shape);\n}\n\n/**\n * Report every non-system resource that declares an initiator-user-stamped field as REQUIRED.\n * `isOptional` treats `.optional()`, `.default()` and `.nullish()` as optional; a bare `.nullable()`\n * stays required, which is correct — `null` is not what the stamp's absence produces.\n */\nexport function validateInitiatorStampedFieldSatisfiability(\n resourceConfigurations: Readonly<Record<string, InitiatorStampedFieldResourceInput>>,\n): InitiatorStampedFieldViolation[] {\n const violations: InitiatorStampedFieldViolation[] = [];\n for (const configuration of Object.values(resourceConfigurations)) {\n if (!configuration?.mainSchema || configuration.isSystemResource) continue;\n const shapes = objectShapesOf(configuration.mainSchema);\n for (const field of INITIATOR_USER_STAMPED_FIELD_IDENTIFIERS) {\n const requiredSomewhere = shapes.some((shape) => shape[field] && !isOptional(shape[field]));\n if (!requiredSomewhere) continue;\n violations.push({\n resourceType: configuration.resourceIdentifier,\n field,\n message:\n `[${String(configuration.resourceIdentifier)}] declares '${field}' as REQUIRED, but the engine stamps it only when`\n + ' the initiator has a userId. A machine principal (MCP, A2A, client credentials, a worker, a batch) has none,'\n + ' and a client may never send it, so a machine write to this resource cannot be satisfied.'\n + ` Declare it \\`.optional()\\` — and generate the migration its nullability change owes.`,\n });\n }\n }\n return violations;\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** The key a populated single-file field carries its metadata under, beside `fileId`. */
|
|
3
|
+
export declare const POPULATED_SINGLE_FILE_KEY: "file";
|
|
4
|
+
/** The key a populated multiple-file field carries its metadata list under, beside `fileIds`. */
|
|
5
|
+
export declare const POPULATED_MULTIPLE_FILES_KEY: "files";
|
|
6
|
+
/**
|
|
7
|
+
* `FileMetadata` (`@wildo-ai/zod-decorators`) as a Zod schema, at the NETWORK boundary: `uploadedAt`
|
|
8
|
+
* coerces an ISO string, and the object is loose so a metadata key added later is carried rather
|
|
9
|
+
* than stripped — this is server-produced data, never a request.
|
|
10
|
+
*/
|
|
11
|
+
export declare const PopulatedFileMetadataSchema: z.ZodTypeAny;
|
|
12
|
+
/**
|
|
13
|
+
* Rebuild `schema` so every `z_file()` field accepts its populated companion beside the stored
|
|
14
|
+
* reference. Identity-preserving where nothing beneath changed (a wrapper returns the ORIGINAL
|
|
15
|
+
* instance, so an enclosing object is not rebuilt and keeps its metadata — the #989 lesson recorded
|
|
16
|
+
* on `stripTemplatableFileFieldsRecursively`). Applied to READ-side DTOs only, after date coercion.
|
|
17
|
+
*/
|
|
18
|
+
export declare function widenFileFieldsForPopulatedReads(schema: z.ZodTypeAny, activeSchemas?: WeakSet<object>): z.ZodTypeAny;
|
|
19
|
+
export declare function widenFileFieldsForPopulatedReads(schema: undefined, activeSchemas?: WeakSet<object>): undefined;
|
|
20
|
+
export declare function widenFileFieldsForPopulatedReads(schema: z.ZodTypeAny | undefined, activeSchemas?: WeakSet<object>): z.ZodTypeAny | undefined;
|
|
21
|
+
//# sourceMappingURL=populated-file-fields.shared.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"populated-file-fields.shared.utils.d.ts","sourceRoot":"","sources":["../../../../../src/resources/utils/populated-file-fields.shared.utils.ts"],"names":[],"mappings":"AAgDA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,yFAAyF;AACzF,eAAO,MAAM,yBAAyB,EAAG,MAAe,CAAC;AACzD,iGAAiG;AACjG,eAAO,MAAM,4BAA4B,EAAG,OAAgB,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,CAAC,CAAC,UAkB1C,CAAC;AAqBH;;;;;GAKG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;AACtH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;AAChH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shape a file field takes on a POPULATED read, and the DTO that describes it (issue #1059).
|
|
3
|
+
*
|
|
4
|
+
* A file field is STORED as a reference — `{ fileId, updatedAt }` for one file, `{ fileIds, updatedAt }`
|
|
5
|
+
* for several. A SUMMARY or CONTEXT read runs file population, which used to REPLACE that reference with
|
|
6
|
+
* the file's metadata (`toMetadataResponse`: readiness, filename, size, url, …). The operation's DTO still
|
|
7
|
+
* described the reference, so `transformOutput` refused every context read of a resource whose file
|
|
8
|
+
* existed: `expected date, received Invalid Date` at `<field>.updatedAt`, a 500, and a degraded body
|
|
9
|
+
* instead of the record. Measured 2026-09-14 on Wonder Todos.
|
|
10
|
+
*
|
|
11
|
+
* Population now keeps the reference and adds the metadata BESIDE it — `file` for one, `files` for
|
|
12
|
+
* several — and the SUMMARY / CONTEXT DTOs declare that companion. Three candidates were weighed:
|
|
13
|
+
*
|
|
14
|
+
* - **Declare the replacement.** The frontend reads a file field as its stored reference (`'fileId' in
|
|
15
|
+
* value` / `'fileIds' in value`, then fetches metadata by id itself), so a metadata array in place of
|
|
16
|
+
* `{ fileIds }` fails its multiple-file guard outright. Declaring the replacement would have made the
|
|
17
|
+
* DTO agree with a shape one consumer cannot read.
|
|
18
|
+
* - **Populate after `transformOutput`.** Validation would then never see the populated value, and the
|
|
19
|
+
* response DTO — the OpenAPI contract — would describe less than the wire carries.
|
|
20
|
+
* - **Keep the reference (chosen).** Every reader of the reference keeps working, the companion is
|
|
21
|
+
* OPTIONAL so a read with population disabled or failed (`populateFileFieldsForSingle` keeps the
|
|
22
|
+
* original value on any error) still validates, and a consumer that wants the metadata finds it at a
|
|
23
|
+
* named key.
|
|
24
|
+
*
|
|
25
|
+
* The companion's schema carries the file field's decorator metadata forward, so the widened field is
|
|
26
|
+
* still detected as a FILE field (`isFileSchema`, `getSchemaType`) — the same property
|
|
27
|
+
* `resources-config-operations.dtos-builder.file-metadata-coercion.test.ts` pins for date coercion.
|
|
28
|
+
*/
|
|
29
|
+
import { FileDisplayNature, FileReadiness, FileUploaderEntityType, getFileMetadata, getZodDef, getZodDefArrayProperty, getZodDefProperty, getZodDefSchemaProperty, getZodDefStringProperty, getZodObjectShape, getZodType, isZodArray, isZodDefault, isZodNullable, isZodObject, isZodOptional, SCHEMA_METADATA, withArrayElement, } from '@wildo-ai/zod-decorators';
|
|
30
|
+
import { z } from 'zod';
|
|
31
|
+
/** The key a populated single-file field carries its metadata under, beside `fileId`. */
|
|
32
|
+
export const POPULATED_SINGLE_FILE_KEY = 'file';
|
|
33
|
+
/** The key a populated multiple-file field carries its metadata list under, beside `fileIds`. */
|
|
34
|
+
export const POPULATED_MULTIPLE_FILES_KEY = 'files';
|
|
35
|
+
/**
|
|
36
|
+
* `FileMetadata` (`@wildo-ai/zod-decorators`) as a Zod schema, at the NETWORK boundary: `uploadedAt`
|
|
37
|
+
* coerces an ISO string, and the object is loose so a metadata key added later is carried rather
|
|
38
|
+
* than stripped — this is server-produced data, never a request.
|
|
39
|
+
*/
|
|
40
|
+
export const PopulatedFileMetadataSchema = z.looseObject({
|
|
41
|
+
readiness: z.enum(FileReadiness),
|
|
42
|
+
fileId: z.string().min(1),
|
|
43
|
+
filename: z.string(),
|
|
44
|
+
size: z.number(),
|
|
45
|
+
mimeType: z.string(),
|
|
46
|
+
extension: z.string().optional(),
|
|
47
|
+
checksum: z.string().optional(),
|
|
48
|
+
url: z.string().optional(),
|
|
49
|
+
thumbnailUrl: z.string().optional(),
|
|
50
|
+
nature: z.enum(FileDisplayNature).optional(),
|
|
51
|
+
width: z.number().optional(),
|
|
52
|
+
height: z.number().optional(),
|
|
53
|
+
duration: z.number().optional(),
|
|
54
|
+
pageCount: z.number().optional(),
|
|
55
|
+
uploadedAt: z.coerce.date(),
|
|
56
|
+
uploadedBy: z.string().optional(),
|
|
57
|
+
uploadedByEntityType: z.enum(FileUploaderEntityType).optional(),
|
|
58
|
+
});
|
|
59
|
+
function carrySchemaMetadata(source, rebuilt) {
|
|
60
|
+
const metadata = source[SCHEMA_METADATA];
|
|
61
|
+
if (metadata !== undefined) {
|
|
62
|
+
rebuilt[SCHEMA_METADATA] = metadata;
|
|
63
|
+
}
|
|
64
|
+
return rebuilt;
|
|
65
|
+
}
|
|
66
|
+
/** A `z_file()` leaf (the reference object, metadata attached) widened with its optional populated companion. */
|
|
67
|
+
function widenFileLeaf(leaf) {
|
|
68
|
+
const fileMetadata = getFileMetadata(leaf);
|
|
69
|
+
if (!fileMetadata || !isZodObject(leaf))
|
|
70
|
+
return leaf;
|
|
71
|
+
const shape = getZodObjectShape(leaf);
|
|
72
|
+
const companionKey = fileMetadata.multiple ? POPULATED_MULTIPLE_FILES_KEY : POPULATED_SINGLE_FILE_KEY;
|
|
73
|
+
if (companionKey in shape)
|
|
74
|
+
return leaf; // already widened (a DTO derived from a widened DTO)
|
|
75
|
+
const companion = fileMetadata.multiple ? z.array(PopulatedFileMetadataSchema).optional() : PopulatedFileMetadataSchema.optional();
|
|
76
|
+
return carrySchemaMetadata(leaf, leaf.extend({ [companionKey]: companion }));
|
|
77
|
+
}
|
|
78
|
+
export function widenFileFieldsForPopulatedReads(schema, activeSchemas = new WeakSet()) {
|
|
79
|
+
// An ABSENT schema passes through (#1138). `activeSchemas.add(undefined)` throws
|
|
80
|
+
// `TypeError: Invalid value used in weak set` — a message naming neither a DTO nor an operation,
|
|
81
|
+
// raised while a registry is being initialized, so it reaches a human as a backend that will not
|
|
82
|
+
// boot. `summaryDto` and `contextDto` are declared OPTIONAL on an operation
|
|
83
|
+
// (`resources-config.shared.schemas.ts:2098`), so absent is a state the contract permits.
|
|
84
|
+
//
|
|
85
|
+
// Measured rather than assumed about where it arrives from: `buildAllOperationDtos` DERIVES both
|
|
86
|
+
// (:545, :572), so its own four call sites never pass an absent one. The reported failure was the
|
|
87
|
+
// dev companion's projector rebuilding DTOs against the runtime registry — an EXTERNAL caller of
|
|
88
|
+
// this exported function, which is exactly why the guard belongs here and not at those call
|
|
89
|
+
// sites (`invariant-call-site-enumeration.md`: prefer making the invariant unbypassable).
|
|
90
|
+
//
|
|
91
|
+
// The overloads keep a definite schema in returning a definite schema, so no caller is handed a
|
|
92
|
+
// widened `| undefined` it then has to narrow.
|
|
93
|
+
if (!schema)
|
|
94
|
+
return schema;
|
|
95
|
+
if (activeSchemas.has(schema))
|
|
96
|
+
return schema;
|
|
97
|
+
activeSchemas.add(schema);
|
|
98
|
+
try {
|
|
99
|
+
if (getFileMetadata(schema) && isZodObject(schema))
|
|
100
|
+
return widenFileLeaf(schema);
|
|
101
|
+
if (isZodOptional(schema) || isZodNullable(schema) || isZodDefault(schema)) {
|
|
102
|
+
const inner = getZodDefSchemaProperty(schema, 'innerType');
|
|
103
|
+
if (!inner)
|
|
104
|
+
return schema;
|
|
105
|
+
const widenedInner = widenFileFieldsForPopulatedReads(inner, activeSchemas);
|
|
106
|
+
if (widenedInner === inner)
|
|
107
|
+
return schema;
|
|
108
|
+
const rewrapped = isZodOptional(schema)
|
|
109
|
+
? widenedInner.optional()
|
|
110
|
+
: isZodNullable(schema)
|
|
111
|
+
? widenedInner.nullable()
|
|
112
|
+
: widenedInner.default(() => getZodDefProperty(schema, 'defaultValue'));
|
|
113
|
+
return carrySchemaMetadata(schema, rewrapped);
|
|
114
|
+
}
|
|
115
|
+
const schemaType = getZodType(schema);
|
|
116
|
+
if (schemaType === 'lazy') {
|
|
117
|
+
const getter = getZodDef(schema)?.getter;
|
|
118
|
+
return typeof getter === 'function' ? z.lazy(() => widenFileFieldsForPopulatedReads(getter(), activeSchemas)) : schema;
|
|
119
|
+
}
|
|
120
|
+
if (schemaType === 'union') {
|
|
121
|
+
const discriminator = getZodDefStringProperty(schema, 'discriminator');
|
|
122
|
+
const options = getZodDefArrayProperty(schema, 'options');
|
|
123
|
+
if (!options?.length)
|
|
124
|
+
return schema;
|
|
125
|
+
const widened = options.map((option) => widenFileFieldsForPopulatedReads(option, activeSchemas));
|
|
126
|
+
if (widened.every((option, index) => option === options[index]))
|
|
127
|
+
return schema;
|
|
128
|
+
const rebuilt = discriminator
|
|
129
|
+
? z.discriminatedUnion(discriminator, widened)
|
|
130
|
+
: z.union(widened);
|
|
131
|
+
return carrySchemaMetadata(schema, rebuilt);
|
|
132
|
+
}
|
|
133
|
+
if (isZodArray(schema)) {
|
|
134
|
+
const element = getZodDefProperty(schema, 'element');
|
|
135
|
+
if (!element)
|
|
136
|
+
return schema;
|
|
137
|
+
const widenedElement = widenFileFieldsForPopulatedReads(element, activeSchemas);
|
|
138
|
+
return widenedElement === element ? schema : withArrayElement(schema, widenedElement);
|
|
139
|
+
}
|
|
140
|
+
if (!isZodObject(schema))
|
|
141
|
+
return schema;
|
|
142
|
+
const shape = getZodObjectShape(schema);
|
|
143
|
+
const widenedShape = {};
|
|
144
|
+
let changed = false;
|
|
145
|
+
for (const [fieldName, fieldSchema] of Object.entries(shape)) {
|
|
146
|
+
const widened = widenFileFieldsForPopulatedReads(fieldSchema, activeSchemas);
|
|
147
|
+
if (widened !== fieldSchema)
|
|
148
|
+
changed = true;
|
|
149
|
+
widenedShape[fieldName] = widened;
|
|
150
|
+
}
|
|
151
|
+
if (!changed)
|
|
152
|
+
return schema;
|
|
153
|
+
return carrySchemaMetadata(schema, schema.extend(widenedShape));
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
activeSchemas.delete(schema);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=populated-file-fields.shared.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"populated-file-fields.shared.utils.js","sourceRoot":"","sources":["../../../../../src/resources/utils/populated-file-fields.shared.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The shape a file field takes on a POPULATED read, and the DTO that describes it (issue #1059).\n *\n * A file field is STORED as a reference — `{ fileId, updatedAt }` for one file, `{ fileIds, updatedAt }`\n * for several. A SUMMARY or CONTEXT read runs file population, which used to REPLACE that reference with\n * the file's metadata (`toMetadataResponse`: readiness, filename, size, url, …). The operation's DTO still\n * described the reference, so `transformOutput` refused every context read of a resource whose file\n * existed: `expected date, received Invalid Date` at `<field>.updatedAt`, a 500, and a degraded body\n * instead of the record. Measured 2026-09-14 on Wonder Todos.\n *\n * Population now keeps the reference and adds the metadata BESIDE it — `file` for one, `files` for\n * several — and the SUMMARY / CONTEXT DTOs declare that companion. Three candidates were weighed:\n *\n * - **Declare the replacement.** The frontend reads a file field as its stored reference (`'fileId' in\n * value` / `'fileIds' in value`, then fetches metadata by id itself), so a metadata array in place of\n * `{ fileIds }` fails its multiple-file guard outright. Declaring the replacement would have made the\n * DTO agree with a shape one consumer cannot read.\n * - **Populate after `transformOutput`.** Validation would then never see the populated value, and the\n * response DTO — the OpenAPI contract — would describe less than the wire carries.\n * - **Keep the reference (chosen).** Every reader of the reference keeps working, the companion is\n * OPTIONAL so a read with population disabled or failed (`populateFileFieldsForSingle` keeps the\n * original value on any error) still validates, and a consumer that wants the metadata finds it at a\n * named key.\n *\n * The companion's schema carries the file field's decorator metadata forward, so the widened field is\n * still detected as a FILE field (`isFileSchema`, `getSchemaType`) — the same property\n * `resources-config-operations.dtos-builder.file-metadata-coercion.test.ts` pins for date coercion.\n */\nimport {\n FileDisplayNature,\n FileReadiness,\n FileUploaderEntityType,\n getFileMetadata,\n getZodDef,\n getZodDefArrayProperty,\n getZodDefProperty,\n getZodDefSchemaProperty,\n getZodDefStringProperty,\n getZodObjectShape,\n getZodType,\n isZodArray,\n isZodDefault,\n isZodNullable,\n isZodObject,\n isZodOptional,\n SCHEMA_METADATA,\n withArrayElement,\n} from '@wildo-ai/zod-decorators';\nimport { z } from 'zod';\n\n/** The key a populated single-file field carries its metadata under, beside `fileId`. */\nexport const POPULATED_SINGLE_FILE_KEY = 'file' as const;\n/** The key a populated multiple-file field carries its metadata list under, beside `fileIds`. */\nexport const POPULATED_MULTIPLE_FILES_KEY = 'files' as const;\n\n/**\n * `FileMetadata` (`@wildo-ai/zod-decorators`) as a Zod schema, at the NETWORK boundary: `uploadedAt`\n * coerces an ISO string, and the object is loose so a metadata key added later is carried rather\n * than stripped — this is server-produced data, never a request.\n */\nexport const PopulatedFileMetadataSchema: z.ZodTypeAny = z.looseObject({\n readiness: z.enum(FileReadiness),\n fileId: z.string().min(1),\n filename: z.string(),\n size: z.number(),\n mimeType: z.string(),\n extension: z.string().optional(),\n checksum: z.string().optional(),\n url: z.string().optional(),\n thumbnailUrl: z.string().optional(),\n nature: z.enum(FileDisplayNature).optional(),\n width: z.number().optional(),\n height: z.number().optional(),\n duration: z.number().optional(),\n pageCount: z.number().optional(),\n uploadedAt: z.coerce.date(),\n uploadedBy: z.string().optional(),\n uploadedByEntityType: z.enum(FileUploaderEntityType).optional(),\n});\n\nfunction carrySchemaMetadata<TSchema extends z.ZodTypeAny>(source: z.ZodTypeAny, rebuilt: TSchema): TSchema {\n const metadata = (source as any)[SCHEMA_METADATA];\n if (metadata !== undefined) {\n (rebuilt as any)[SCHEMA_METADATA] = metadata;\n }\n return rebuilt;\n}\n\n/** A `z_file()` leaf (the reference object, metadata attached) widened with its optional populated companion. */\nfunction widenFileLeaf(leaf: z.ZodTypeAny): z.ZodTypeAny {\n const fileMetadata = getFileMetadata(leaf);\n if (!fileMetadata || !isZodObject(leaf)) return leaf;\n const shape = getZodObjectShape(leaf);\n const companionKey = fileMetadata.multiple ? POPULATED_MULTIPLE_FILES_KEY : POPULATED_SINGLE_FILE_KEY;\n if (companionKey in shape) return leaf; // already widened (a DTO derived from a widened DTO)\n const companion = fileMetadata.multiple ? z.array(PopulatedFileMetadataSchema).optional() : PopulatedFileMetadataSchema.optional();\n return carrySchemaMetadata(leaf, leaf.extend({ [companionKey]: companion }));\n}\n\n/**\n * Rebuild `schema` so every `z_file()` field accepts its populated companion beside the stored\n * reference. Identity-preserving where nothing beneath changed (a wrapper returns the ORIGINAL\n * instance, so an enclosing object is not rebuilt and keeps its metadata — the #989 lesson recorded\n * on `stripTemplatableFileFieldsRecursively`). Applied to READ-side DTOs only, after date coercion.\n */\nexport function widenFileFieldsForPopulatedReads(schema: z.ZodTypeAny, activeSchemas?: WeakSet<object>): z.ZodTypeAny;\nexport function widenFileFieldsForPopulatedReads(schema: undefined, activeSchemas?: WeakSet<object>): undefined;\nexport function widenFileFieldsForPopulatedReads(schema: z.ZodTypeAny | undefined, activeSchemas?: WeakSet<object>): z.ZodTypeAny | undefined;\nexport function widenFileFieldsForPopulatedReads(schema: z.ZodTypeAny | undefined, activeSchemas: WeakSet<object> = new WeakSet<object>()): z.ZodTypeAny | undefined {\n // An ABSENT schema passes through (#1138). `activeSchemas.add(undefined)` throws\n // `TypeError: Invalid value used in weak set` — a message naming neither a DTO nor an operation,\n // raised while a registry is being initialized, so it reaches a human as a backend that will not\n // boot. `summaryDto` and `contextDto` are declared OPTIONAL on an operation\n // (`resources-config.shared.schemas.ts:2098`), so absent is a state the contract permits.\n //\n // Measured rather than assumed about where it arrives from: `buildAllOperationDtos` DERIVES both\n // (:545, :572), so its own four call sites never pass an absent one. The reported failure was the\n // dev companion's projector rebuilding DTOs against the runtime registry — an EXTERNAL caller of\n // this exported function, which is exactly why the guard belongs here and not at those call\n // sites (`invariant-call-site-enumeration.md`: prefer making the invariant unbypassable).\n //\n // The overloads keep a definite schema in returning a definite schema, so no caller is handed a\n // widened `| undefined` it then has to narrow.\n if (!schema) return schema;\n if (activeSchemas.has(schema)) return schema;\n activeSchemas.add(schema);\n try {\n if (getFileMetadata(schema) && isZodObject(schema)) return widenFileLeaf(schema);\n\n if (isZodOptional(schema) || isZodNullable(schema) || isZodDefault(schema)) {\n const inner = getZodDefSchemaProperty(schema, 'innerType');\n if (!inner) return schema;\n const widenedInner = widenFileFieldsForPopulatedReads(inner, activeSchemas);\n if (widenedInner === inner) return schema;\n const rewrapped = isZodOptional(schema)\n ? widenedInner.optional()\n : isZodNullable(schema)\n ? widenedInner.nullable()\n : widenedInner.default(() => getZodDefProperty(schema, 'defaultValue') as unknown);\n return carrySchemaMetadata(schema, rewrapped);\n }\n\n const schemaType = getZodType(schema);\n if (schemaType === 'lazy') {\n const getter = getZodDef(schema)?.getter;\n return typeof getter === 'function' ? z.lazy(() => widenFileFieldsForPopulatedReads(getter() as z.ZodTypeAny, activeSchemas)) : schema;\n }\n\n if (schemaType === 'union') {\n const discriminator = getZodDefStringProperty(schema, 'discriminator');\n const options = getZodDefArrayProperty(schema, 'options') as z.ZodTypeAny[] | undefined;\n if (!options?.length) return schema;\n const widened = options.map((option) => widenFileFieldsForPopulatedReads(option, activeSchemas));\n if (widened.every((option, index) => option === options[index])) return schema;\n const rebuilt: z.ZodTypeAny = discriminator\n ? z.discriminatedUnion(discriminator, widened as [z.ZodObject<any>, z.ZodObject<any>, ...z.ZodObject<any>[]])\n : z.union(widened as [z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]);\n return carrySchemaMetadata(schema, rebuilt);\n }\n\n if (isZodArray(schema)) {\n const element = getZodDefProperty(schema, 'element') as z.ZodTypeAny | undefined;\n if (!element) return schema;\n const widenedElement = widenFileFieldsForPopulatedReads(element, activeSchemas);\n return widenedElement === element ? schema : withArrayElement(schema, widenedElement);\n }\n\n if (!isZodObject(schema)) return schema;\n\n const shape = getZodObjectShape(schema);\n const widenedShape: Record<string, z.ZodTypeAny> = {};\n let changed = false;\n for (const [fieldName, fieldSchema] of Object.entries(shape)) {\n const widened = widenFileFieldsForPopulatedReads(fieldSchema as z.ZodTypeAny, activeSchemas);\n if (widened !== fieldSchema) changed = true;\n widenedShape[fieldName] = widened;\n }\n if (!changed) return schema;\n return carrySchemaMetadata(schema, schema.extend(widenedShape));\n } finally {\n activeSchemas.delete(schema);\n }\n}\n"]}
|
|
@@ -9,6 +9,21 @@ export declare class ResourcesConfigNamingUtils {
|
|
|
9
9
|
* This is a reliable implementation covering most common cases
|
|
10
10
|
*/
|
|
11
11
|
static singularize(word: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* The singular nouns whose plural changes `f` / `fe` to `ves`. Deliberately SMALL and closed:
|
|
14
|
+
* everything else ending in `f` or `fe` takes a plain `s`, which is the common case in the
|
|
15
|
+
* identifiers this framework derives (`…Ref`, `…Proof`). Shared by `pluralize` and `singularize`
|
|
16
|
+
* so the two directions cannot disagree about which words are exceptions.
|
|
17
|
+
*/
|
|
18
|
+
private static readonly F_TO_VES_WORDS;
|
|
19
|
+
private static readonly FE_TO_VES_WORDS;
|
|
20
|
+
/**
|
|
21
|
+
* The last English word of a lower-cased identifier. Word boundaries are lost by lower-casing, so
|
|
22
|
+
* this matches a trailing exception word against the whole-string suffix instead: `bookshelf`
|
|
23
|
+
* yields `shelf`, `organizationinvoiceref` yields itself (no exception word is its suffix), and a
|
|
24
|
+
* `snake_case` or `kebab-case` tail is split on its separator.
|
|
25
|
+
*/
|
|
26
|
+
private static lastWordOf;
|
|
12
27
|
/**
|
|
13
28
|
* Preserve the case pattern of the original word in the result
|
|
14
29
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources-config-naming.utils.d.ts","sourceRoot":"","sources":["../../../../../src/resources/utils/resources-config-naming.utils.ts"],"names":[],"mappings":"AAAA,qBAAa,0BAA0B;IAMnC;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"resources-config-naming.utils.d.ts","sourceRoot":"","sources":["../../../../../src/resources/utils/resources-config-naming.utils.ts"],"names":[],"mappings":"AAAA,qBAAa,0BAA0B;IAMnC;;;OAGG;IACH,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAgEtC;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAwExC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAEnC;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA2D;IAElG;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAUzB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAiB3B;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,uBAAuB,EAAE,MAAM,GAAG,MAAM;IAqB9D;;;;;;OAMG;IACH,MAAM,CAAC,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAW9D;;;;;OAKG;IACH,MAAM,CAAC,sBAAsB,CAAC,uBAAuB,EAAE,MAAM,GAAG,MAAM;IAKtE;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB,CAAC,uBAAuB,EAAE,MAAM,GAAG,MAAM;IAiBvE;;;;;OAKG;IACH,MAAM,CAAC,yBAAyB,CAAC,uBAAuB,EAAE,MAAM,GAAG,MAAM;IAiBzE;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAAC,uBAAuB,EAAE,MAAM,GAAG,OAAO;IAIxE;;OAEG;IACH,MAAM,CAAC,yBAAyB,CAAC,uBAAuB,EAAE,MAAM,GAAG,OAAO;IAQ1E;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQvC;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMvC;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAKxC;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQvC;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI1C;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAI5C;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQ5C;;;OAGG;IACH,MAAM,CAAC,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAa3D;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAiBhD;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG;QAClD,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACzB;IAYD;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,eAAe,CAAC,uBAAuB,EAAE,MAAM,GAAG,MAAM;CAalE"}
|
|
@@ -35,19 +35,24 @@ export class ResourcesConfigNamingUtils {
|
|
|
35
35
|
if (irregularPlurals[lowerWord]) {
|
|
36
36
|
return this.preserveCase(word, irregularPlurals[lowerWord]);
|
|
37
37
|
}
|
|
38
|
-
// Words ending in 's', 'ss', 'sh', 'ch', 'x', 'z' add 'es'
|
|
39
|
-
|
|
38
|
+
// Words ending in 's', 'ss', 'sh', 'ch', 'x', 'z' add 'es'. `sh`, not `[sh]`: a bare 'h'
|
|
39
|
+
// takes a plain 's' (`path` → `paths`, `month` → `months`).
|
|
40
|
+
if (/[sxz]$/.test(lowerWord) || /sh$/.test(lowerWord) || /ch$/.test(lowerWord)) {
|
|
40
41
|
return word + 'es';
|
|
41
42
|
}
|
|
42
43
|
// Words ending in consonant + 'y' change 'y' to 'ies'
|
|
43
44
|
if (/[bcdfghjklmnpqrstvwxz]y$/.test(lowerWord)) {
|
|
44
45
|
return word.slice(0, -1) + 'ies';
|
|
45
46
|
}
|
|
46
|
-
//
|
|
47
|
-
|
|
47
|
+
// `f → ves` is the English EXCEPTION, not the rule: `ref`, `proof`, `chef`, `roof`, `belief`
|
|
48
|
+
// and `safe` take a plain 's'. A blanket `/f$/` put `organizationInvoiceReves` and
|
|
49
|
+
// `workbenchMarketProoves` on the wire (#580). Only the closed list below changes form, and it
|
|
50
|
+
// is matched on the LAST camelCase word so a compound (`bookShelf`) behaves like its head noun.
|
|
51
|
+
const lastWord = ResourcesConfigNamingUtils.lastWordOf(lowerWord);
|
|
52
|
+
if (ResourcesConfigNamingUtils.F_TO_VES_WORDS.has(lastWord)) {
|
|
48
53
|
return word.slice(0, -1) + 'ves';
|
|
49
54
|
}
|
|
50
|
-
if (
|
|
55
|
+
if (ResourcesConfigNamingUtils.FE_TO_VES_WORDS.has(lastWord)) {
|
|
51
56
|
return word.slice(0, -2) + 'ves';
|
|
52
57
|
}
|
|
53
58
|
// Words ending in consonant + 'o' add 'es'
|
|
@@ -86,17 +91,30 @@ export class ResourcesConfigNamingUtils {
|
|
|
86
91
|
if (/ies$/.test(lowerWord)) {
|
|
87
92
|
return word.slice(0, -3) + 'y';
|
|
88
93
|
}
|
|
89
|
-
//
|
|
94
|
+
// 'ves' → 'f' / 'fe' ONLY for the closed exception list `pluralize` uses; every other 'ves'
|
|
95
|
+
// word just drops its 's' (`workbenchMarketAlternatives` → `…Alternative`, not `…Alternatif`).
|
|
90
96
|
if (/ves$/.test(lowerWord)) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
if (fWords.includes(lowerWord)) {
|
|
97
|
+
const lastWord = ResourcesConfigNamingUtils.lastWordOf(lowerWord).slice(0, -3);
|
|
98
|
+
if (ResourcesConfigNamingUtils.FE_TO_VES_WORDS.has(lastWord + 'fe')) {
|
|
94
99
|
return word.slice(0, -3) + 'fe';
|
|
95
100
|
}
|
|
96
|
-
|
|
101
|
+
if (ResourcesConfigNamingUtils.F_TO_VES_WORDS.has(lastWord + 'f')) {
|
|
102
|
+
return word.slice(0, -3) + 'f';
|
|
103
|
+
}
|
|
104
|
+
return word.slice(0, -1);
|
|
105
|
+
}
|
|
106
|
+
// '-ses' is ambiguous in English, and the naive "remove 'es'" turned `workbenchRoadmapPhases`
|
|
107
|
+
// into `…Phas`. A stem that itself ends in 's' (`classes`, `addresses`) or in 'us' (`buses`,
|
|
108
|
+
// `statuses`) drops 'es'; a vowel or n/l/r before 'se' (`phases`, `cases`, `databases`,
|
|
109
|
+
// `responses`, `licenses`, `courses`) marks a singular that ENDS in 'e', so only 's' goes.
|
|
110
|
+
if (/(sses|uses)$/.test(lowerWord)) {
|
|
111
|
+
return word.slice(0, -2);
|
|
112
|
+
}
|
|
113
|
+
if (/[aeionlr]ses$/.test(lowerWord)) {
|
|
114
|
+
return word.slice(0, -1);
|
|
97
115
|
}
|
|
98
116
|
// Words ending in 'ses', 'xes', 'zes', 'shes', 'ches' remove 'es'
|
|
99
|
-
if (/[sxz]es$/.test(lowerWord) || /
|
|
117
|
+
if (/[sxz]es$/.test(lowerWord) || /shes$/.test(lowerWord) || /ches$/.test(lowerWord)) {
|
|
100
118
|
return word.slice(0, -2);
|
|
101
119
|
}
|
|
102
120
|
// Words ending in 'oes' remove 'es'
|
|
@@ -110,6 +128,33 @@ export class ResourcesConfigNamingUtils {
|
|
|
110
128
|
// If doesn't match any pattern, return as is (might already be singular)
|
|
111
129
|
return word;
|
|
112
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* The singular nouns whose plural changes `f` / `fe` to `ves`. Deliberately SMALL and closed:
|
|
133
|
+
* everything else ending in `f` or `fe` takes a plain `s`, which is the common case in the
|
|
134
|
+
* identifiers this framework derives (`…Ref`, `…Proof`). Shared by `pluralize` and `singularize`
|
|
135
|
+
* so the two directions cannot disagree about which words are exceptions.
|
|
136
|
+
*/
|
|
137
|
+
static F_TO_VES_WORDS = new Set([
|
|
138
|
+
'calf', 'elf', 'half', 'leaf', 'loaf', 'self', 'sheaf', 'shelf', 'thief', 'wolf',
|
|
139
|
+
]);
|
|
140
|
+
static FE_TO_VES_WORDS = new Set(['knife', 'life', 'wife']);
|
|
141
|
+
/**
|
|
142
|
+
* The last English word of a lower-cased identifier. Word boundaries are lost by lower-casing, so
|
|
143
|
+
* this matches a trailing exception word against the whole-string suffix instead: `bookshelf`
|
|
144
|
+
* yields `shelf`, `organizationinvoiceref` yields itself (no exception word is its suffix), and a
|
|
145
|
+
* `snake_case` or `kebab-case` tail is split on its separator.
|
|
146
|
+
*/
|
|
147
|
+
static lastWordOf(lowerWord) {
|
|
148
|
+
const tail = lowerWord.split(/[_\-\s]/).pop() ?? lowerWord;
|
|
149
|
+
for (const candidate of [...ResourcesConfigNamingUtils.F_TO_VES_WORDS, ...ResourcesConfigNamingUtils.FE_TO_VES_WORDS]) {
|
|
150
|
+
if (tail.endsWith(candidate))
|
|
151
|
+
return candidate;
|
|
152
|
+
const plural = candidate.endsWith('fe') ? candidate.slice(0, -2) + 'ves' : candidate.slice(0, -1) + 'ves';
|
|
153
|
+
if (tail.endsWith(plural))
|
|
154
|
+
return plural;
|
|
155
|
+
}
|
|
156
|
+
return tail;
|
|
157
|
+
}
|
|
113
158
|
/**
|
|
114
159
|
* Preserve the case pattern of the original word in the result
|
|
115
160
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources-config-naming.utils.js","sourceRoot":"","sources":["../../../../../src/resources/utils/resources-config-naming.utils.ts"],"names":[],"mappings":"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","sourcesContent":["export class ResourcesConfigNamingUtils {\n \n // ================================\n // PLURALIZATION AND SINGULARIZATION\n // ================================\n \n /**\n * Pluralize an English word using common English rules\n * This is a reliable implementation covering most common cases\n */\n static pluralize(word: string): string {\n if (!word || word.length === 0) return word;\n \n const lowerWord = word.toLowerCase();\n \n // Irregular plurals\n const irregularPlurals: Record<string, string> = {\n 'person': 'people',\n 'man': 'men',\n 'woman': 'women',\n 'child': 'children',\n 'tooth': 'teeth',\n 'foot': 'feet',\n 'mouse': 'mice',\n 'goose': 'geese',\n // Technical/borrowed words that don't follow consonant+o rule\n 'todo': 'todos',\n 'photo': 'photos',\n 'memo': 'memos',\n 'logo': 'logos',\n 'piano': 'pianos',\n 'video': 'videos',\n 'studio': 'studios',\n // Words ending in z that double the z\n 'quiz': 'quizzes',\n 'fez': 'fezzes',\n };\n \n if (irregularPlurals[lowerWord]) {\n return this.preserveCase(word, irregularPlurals[lowerWord]);\n }\n \n // Words ending in 's', 'ss', 'sh', 'ch', 'x', 'z' add 'es'\n if (/[sxz]$/.test(lowerWord) || /[sh]$/.test(lowerWord) || /ch$/.test(lowerWord)) {\n return word + 'es';\n }\n \n // Words ending in consonant + 'y' change 'y' to 'ies'\n if (/[bcdfghjklmnpqrstvwxz]y$/.test(lowerWord)) {\n return word.slice(0, -1) + 'ies';\n }\n \n // Words ending in 'f' or 'fe' change to 'ves'\n if (/f$/.test(lowerWord)) {\n return word.slice(0, -1) + 'ves';\n }\n if (/fe$/.test(lowerWord)) {\n return word.slice(0, -2) + 'ves';\n }\n \n // Words ending in consonant + 'o' add 'es'\n if (/[bcdfghjklmnpqrstvwxz]o$/.test(lowerWord)) {\n return word + 'es';\n }\n \n // Default: add 's'\n return word + 's';\n }\n \n /**\n * Singularize an English word using common English rules\n * This is a reliable implementation covering most common cases\n */\n static singularize(word: string): string {\n if (!word || word.length === 0) return word;\n \n const lowerWord = word.toLowerCase();\n \n // Irregular singulars\n const irregularSingulars: Record<string, string> = {\n 'people': 'person',\n 'men': 'man',\n 'women': 'woman',\n 'children': 'child',\n 'teeth': 'tooth',\n 'feet': 'foot',\n 'mice': 'mouse',\n 'geese': 'goose',\n // Words with doubled z\n 'quizzes': 'quiz',\n 'fezzes': 'fez',\n };\n \n if (irregularSingulars[lowerWord]) {\n return this.preserveCase(word, irregularSingulars[lowerWord]);\n }\n \n // Words ending in 'ies' change to 'y'\n if (/ies$/.test(lowerWord)) {\n return word.slice(0, -3) + 'y';\n }\n \n // Words ending in 'ves' change to 'f' or 'fe'\n if (/ves$/.test(lowerWord)) {\n // Common words that end in 'fe' when singular\n const fWords = ['wives', 'knives', 'lives'];\n if (fWords.includes(lowerWord)) {\n return word.slice(0, -3) + 'fe';\n }\n return word.slice(0, -3) + 'f';\n }\n \n // Words ending in 'ses', 'xes', 'zes', 'shes', 'ches' remove 'es'\n if (/[sxz]es$/.test(lowerWord) || /[sh]es$/.test(lowerWord) || /ches$/.test(lowerWord)) {\n return word.slice(0, -2);\n }\n \n // Words ending in 'oes' remove 'es'\n if (/oes$/.test(lowerWord)) {\n return word.slice(0, -2);\n }\n \n // Words ending in 's' but not 'ss' remove 's'\n if (/[^s]s$/.test(lowerWord)) {\n return word.slice(0, -1);\n }\n \n // If doesn't match any pattern, return as is (might already be singular)\n return word;\n }\n \n /**\n * Preserve the case pattern of the original word in the result\n */\n private static preserveCase(original: string, result: string): string {\n if (original === original.toUpperCase()) {\n return result.toUpperCase();\n }\n if (original === original.toLowerCase()) {\n return result.toLowerCase();\n }\n if (original[0] === original[0].toUpperCase()) {\n return result.charAt(0).toUpperCase() + result.slice(1).toLowerCase();\n }\n return result;\n }\n \n // ================================\n // RESOURCE NAME CONVERSIONS\n // ================================\n \n /**\n * Convert resourceFieldIdentifier to resourceName (plural)\n * Examples:\n * - \"userId\" -> \"users\"\n * - \"organizationIds\" -> \"organizations\" \n * - \"todoListId\" -> \"todoLists\"\n */\n static toResourceName(resourceFieldIdentifier: string): string {\n if (!resourceFieldIdentifier) return '';\n \n let baseName: string;\n \n // Handle plural form (ends with 'Ids')\n if (resourceFieldIdentifier.endsWith('Ids')) {\n baseName = resourceFieldIdentifier.slice(0, -3);\n return this.pluralize(baseName);\n }\n \n // Handle singular form (ends with 'Id')\n if (resourceFieldIdentifier.endsWith('Id')) {\n baseName = resourceFieldIdentifier.slice(0, -2);\n return this.pluralize(baseName);\n }\n \n // If doesn't end with Id/Ids, assume it's already a resource name\n return this.pluralize(resourceFieldIdentifier);\n }\n \n /**\n * Convert resourceName to resourceFieldIdentifier\n * Examples:\n * - \"users\" -> \"userId\"\n * - \"organizations\" -> \"organizationId\"\n * - \"todoLists\" -> \"todoListId\"\n */\n static toResourceFieldIdentifier(resourceName: string): string {\n if (!resourceName) return '';\n \n const singularName = this.singularize(resourceName);\n return singularName + 'Id';\n }\n \n // ================================\n // QUICK WIN FUNCTIONS\n // ================================\n \n /**\n * Convert resourceFieldIdentifier to singular resource name\n * Examples:\n * - \"userId\" -> \"user\"\n * - \"organizationIds\" -> \"organization\"\n */\n static toResourceNameSingular(resourceFieldIdentifier: string): string {\n const resourceName = this.toResourceName(resourceFieldIdentifier);\n return this.singularize(resourceName);\n }\n \n /**\n * Convert resourceFieldIdentifier to plural field identifier\n * Examples:\n * - \"userId\" -> \"userIds\"\n * - \"organizationId\" -> \"organizationIds\"\n */\n static toFieldIdentifierPlural(resourceFieldIdentifier: string): string {\n if (!resourceFieldIdentifier) return '';\n \n // If already plural (ends with 'Ids'), return as is\n if (resourceFieldIdentifier.endsWith('Ids')) {\n return resourceFieldIdentifier;\n }\n \n // If singular (ends with 'Id'), make plural\n if (resourceFieldIdentifier.endsWith('Id')) {\n return resourceFieldIdentifier.slice(0, -2) + 'Ids';\n }\n \n // If doesn't end with Id/Ids, add 'Ids'\n return resourceFieldIdentifier + 'Ids';\n }\n \n /**\n * Convert resourceFieldIdentifier to singular field identifier\n * Examples:\n * - \"userIds\" -> \"userId\"\n * - \"organizationId\" -> \"organizationId\"\n */\n static toFieldIdentifierSingular(resourceFieldIdentifier: string): string {\n if (!resourceFieldIdentifier) return '';\n \n // If plural (ends with 'Ids'), make singular\n if (resourceFieldIdentifier.endsWith('Ids')) {\n return resourceFieldIdentifier.slice(0, -3) + 'Id';\n }\n \n // If already singular (ends with 'Id'), return as is\n if (resourceFieldIdentifier.endsWith('Id')) {\n return resourceFieldIdentifier;\n }\n \n // If doesn't end with Id/Ids, add 'Id'\n return resourceFieldIdentifier + 'Id';\n }\n \n /**\n * Check if a resourceFieldIdentifier is plural\n */\n static isFieldIdentifierPlural(resourceFieldIdentifier: string): boolean {\n return resourceFieldIdentifier.endsWith('Ids');\n }\n \n /**\n * Check if a resourceFieldIdentifier is singular\n */\n static isFieldIdentifierSingular(resourceFieldIdentifier: string): boolean {\n return resourceFieldIdentifier.endsWith('Id') && !resourceFieldIdentifier.endsWith('Ids');\n }\n \n // ================================\n // CASE CONVERSION UTILITIES\n // ================================\n \n /**\n * Convert to snake_case\n * Examples:\n * - \"createdByUser\" -> \"created_by_user\"\n * - \"TodoList\" -> \"todo_list\"\n */\n static toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '_$1')\n .replace(/^_/, '')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n }\n \n /**\n * Convert to camelCase\n * Examples:\n * - \"created-by-user\" -> \"createdByUser\"\n * - \"todo_list\" -> \"todoList\"\n */\n static toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, char) => char ? char.toUpperCase() : '')\n .replace(/^([A-Z])/, (char) => char.toLowerCase());\n }\n \n /**\n * Convert to PascalCase\n * Examples:\n * - \"created-by-user\" -> \"CreatedByUser\"\n * - \"todo_list\" -> \"TodoList\"\n */\n static toPascalCase(str: string): string {\n const camelCase = this.toCamelCase(str);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n }\n \n /**\n * Convert to kebab-case\n * Examples:\n * - \"createdByUser\" -> \"created-by-user\"\n * - \"TodoList\" -> \"todo-list\"\n */\n static toKebabCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '-$1')\n .replace(/^-/, '')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n }\n \n /**\n * Convert to CONSTANT_CASE\n * Examples:\n * - \"createdByUser\" -> \"CREATED_BY_USER\"\n * - \"todo-list\" -> \"TODO_LIST\"\n */\n static toConstantCase(str: string): string {\n return this.toSnakeCase(str).toUpperCase();\n }\n \n /**\n * Convert from kebab-case to camelCase (as specifically requested)\n * Examples:\n * - \"created-by-user\" -> \"createdByUser\"\n * - \"todo-list-item\" -> \"todoListItem\"\n */\n static kebabToCamelCase(str: string): string {\n return this.toCamelCase(str);\n }\n \n /**\n * Convert from snake_case to camelCase\n * Examples:\n * - \"created_by_user\" -> \"createdByUser\"\n * - \"todo_list_item\" -> \"todoListItem\"\n */\n static snakeToCamelCase(str: string): string {\n return this.toCamelCase(str);\n }\n \n // ================================\n // VALIDATION UTILITIES\n // ================================\n \n /**\n * Validate if a string is a valid resourceFieldIdentifier\n * Must end with 'Id' or 'Ids' and be in camelCase\n */\n static isValidResourceFieldIdentifier(str: string): boolean {\n if (!str) return false;\n \n // Must end with Id or Ids\n if (!str.endsWith('Id') && !str.endsWith('Ids')) return false;\n \n // Must be in camelCase (starts with lowercase)\n if (str[0] !== str[0].toLowerCase()) return false;\n \n // Should not contain special characters except camelCase\n return /^[a-z][a-zA-Z0-9]*I(d|ds)$/.test(str);\n }\n \n /**\n * Validate if a string is a valid resourceName\n * Should be in camelCase and plural\n */\n static isValidResourceName(str: string): boolean {\n if (!str) return false;\n \n // Must be in camelCase (starts with lowercase)\n if (str[0] !== str[0].toLowerCase()) return false;\n \n // Should not contain special characters\n if (!/^[a-z][a-zA-Z0-9]*$/.test(str)) return false;\n \n // Should be plural (this is a heuristic check)\n return str !== this.singularize(str);\n }\n \n // ================================\n // UTILITY HELPERS\n // ================================\n \n /**\n * Get both singular and plural forms of a resource name\n */\n static getResourceNameVariants(resourceName: string): {\n singular: string;\n plural: string;\n singularFieldId: string;\n pluralFieldId: string;\n } {\n const singular = this.singularize(resourceName);\n const plural = this.pluralize(resourceName);\n \n return {\n singular,\n plural,\n singularFieldId: singular + 'Id',\n pluralFieldId: singular + 'Ids'\n };\n }\n \n /**\n * Extract the base name from a resourceFieldIdentifier.\n * \n * THIS IS THE CANONICAL FUNCTION for deriving populated sibling field names.\n * Used by:\n * - Backend: resource-population.backend.service.ts (populateForSummary, populateListForSummary)\n * - Backend: services-registry-handler.backend.service.ts (getNestedFieldName for 1:1 relationships)\n * - Backend: resources-config-operations.dtos-builder.utils.ts (nested DTO fields for 1:1)\n * - Frontend: DisplayField.tsx (extractPopulatedSibling)\n * \n * DO NOT create alternative implementations. Use this function.\n * For 1:N nested fields, use toResourceName() instead (pluralized form).\n * \n * Examples:\n * - \"userId\" -> \"user\"\n * - \"organizationIds\" -> \"organization\"\n * - \"assignedToUserId\" -> \"assignedToUser\"\n */\n static extractBaseName(resourceFieldIdentifier: string): string {\n if (!resourceFieldIdentifier) return '';\n \n if (resourceFieldIdentifier.endsWith('Ids')) {\n return resourceFieldIdentifier.slice(0, -3);\n }\n \n if (resourceFieldIdentifier.endsWith('Id')) {\n return resourceFieldIdentifier.slice(0, -2);\n }\n \n return resourceFieldIdentifier;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"resources-config-naming.utils.js","sourceRoot":"","sources":["../../../../../src/resources/utils/resources-config-naming.utils.ts"],"names":[],"mappings":"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","sourcesContent":["export class ResourcesConfigNamingUtils {\n \n // ================================\n // PLURALIZATION AND SINGULARIZATION\n // ================================\n \n /**\n * Pluralize an English word using common English rules\n * This is a reliable implementation covering most common cases\n */\n static pluralize(word: string): string {\n if (!word || word.length === 0) return word;\n \n const lowerWord = word.toLowerCase();\n \n // Irregular plurals\n const irregularPlurals: Record<string, string> = {\n 'person': 'people',\n 'man': 'men',\n 'woman': 'women',\n 'child': 'children',\n 'tooth': 'teeth',\n 'foot': 'feet',\n 'mouse': 'mice',\n 'goose': 'geese',\n // Technical/borrowed words that don't follow consonant+o rule\n 'todo': 'todos',\n 'photo': 'photos',\n 'memo': 'memos',\n 'logo': 'logos',\n 'piano': 'pianos',\n 'video': 'videos',\n 'studio': 'studios',\n // Words ending in z that double the z\n 'quiz': 'quizzes',\n 'fez': 'fezzes',\n };\n \n if (irregularPlurals[lowerWord]) {\n return this.preserveCase(word, irregularPlurals[lowerWord]);\n }\n \n // Words ending in 's', 'ss', 'sh', 'ch', 'x', 'z' add 'es'. `sh`, not `[sh]`: a bare 'h'\n // takes a plain 's' (`path` → `paths`, `month` → `months`).\n if (/[sxz]$/.test(lowerWord) || /sh$/.test(lowerWord) || /ch$/.test(lowerWord)) {\n return word + 'es';\n }\n \n // Words ending in consonant + 'y' change 'y' to 'ies'\n if (/[bcdfghjklmnpqrstvwxz]y$/.test(lowerWord)) {\n return word.slice(0, -1) + 'ies';\n }\n \n // `f → ves` is the English EXCEPTION, not the rule: `ref`, `proof`, `chef`, `roof`, `belief`\n // and `safe` take a plain 's'. A blanket `/f$/` put `organizationInvoiceReves` and\n // `workbenchMarketProoves` on the wire (#580). Only the closed list below changes form, and it\n // is matched on the LAST camelCase word so a compound (`bookShelf`) behaves like its head noun.\n const lastWord = ResourcesConfigNamingUtils.lastWordOf(lowerWord);\n if (ResourcesConfigNamingUtils.F_TO_VES_WORDS.has(lastWord)) {\n return word.slice(0, -1) + 'ves';\n }\n if (ResourcesConfigNamingUtils.FE_TO_VES_WORDS.has(lastWord)) {\n return word.slice(0, -2) + 'ves';\n }\n \n // Words ending in consonant + 'o' add 'es'\n if (/[bcdfghjklmnpqrstvwxz]o$/.test(lowerWord)) {\n return word + 'es';\n }\n \n // Default: add 's'\n return word + 's';\n }\n \n /**\n * Singularize an English word using common English rules\n * This is a reliable implementation covering most common cases\n */\n static singularize(word: string): string {\n if (!word || word.length === 0) return word;\n \n const lowerWord = word.toLowerCase();\n \n // Irregular singulars\n const irregularSingulars: Record<string, string> = {\n 'people': 'person',\n 'men': 'man',\n 'women': 'woman',\n 'children': 'child',\n 'teeth': 'tooth',\n 'feet': 'foot',\n 'mice': 'mouse',\n 'geese': 'goose',\n // Words with doubled z\n 'quizzes': 'quiz',\n 'fezzes': 'fez',\n };\n \n if (irregularSingulars[lowerWord]) {\n return this.preserveCase(word, irregularSingulars[lowerWord]);\n }\n \n // Words ending in 'ies' change to 'y'\n if (/ies$/.test(lowerWord)) {\n return word.slice(0, -3) + 'y';\n }\n \n // 'ves' → 'f' / 'fe' ONLY for the closed exception list `pluralize` uses; every other 'ves'\n // word just drops its 's' (`workbenchMarketAlternatives` → `…Alternative`, not `…Alternatif`).\n if (/ves$/.test(lowerWord)) {\n const lastWord = ResourcesConfigNamingUtils.lastWordOf(lowerWord).slice(0, -3);\n if (ResourcesConfigNamingUtils.FE_TO_VES_WORDS.has(lastWord + 'fe')) {\n return word.slice(0, -3) + 'fe';\n }\n if (ResourcesConfigNamingUtils.F_TO_VES_WORDS.has(lastWord + 'f')) {\n return word.slice(0, -3) + 'f';\n }\n return word.slice(0, -1);\n }\n\n // '-ses' is ambiguous in English, and the naive \"remove 'es'\" turned `workbenchRoadmapPhases`\n // into `…Phas`. A stem that itself ends in 's' (`classes`, `addresses`) or in 'us' (`buses`,\n // `statuses`) drops 'es'; a vowel or n/l/r before 'se' (`phases`, `cases`, `databases`,\n // `responses`, `licenses`, `courses`) marks a singular that ENDS in 'e', so only 's' goes.\n if (/(sses|uses)$/.test(lowerWord)) {\n return word.slice(0, -2);\n }\n if (/[aeionlr]ses$/.test(lowerWord)) {\n return word.slice(0, -1);\n }\n\n // Words ending in 'ses', 'xes', 'zes', 'shes', 'ches' remove 'es'\n if (/[sxz]es$/.test(lowerWord) || /shes$/.test(lowerWord) || /ches$/.test(lowerWord)) {\n return word.slice(0, -2);\n }\n \n // Words ending in 'oes' remove 'es'\n if (/oes$/.test(lowerWord)) {\n return word.slice(0, -2);\n }\n \n // Words ending in 's' but not 'ss' remove 's'\n if (/[^s]s$/.test(lowerWord)) {\n return word.slice(0, -1);\n }\n \n // If doesn't match any pattern, return as is (might already be singular)\n return word;\n }\n \n /**\n * The singular nouns whose plural changes `f` / `fe` to `ves`. Deliberately SMALL and closed:\n * everything else ending in `f` or `fe` takes a plain `s`, which is the common case in the\n * identifiers this framework derives (`…Ref`, `…Proof`). Shared by `pluralize` and `singularize`\n * so the two directions cannot disagree about which words are exceptions.\n */\n private static readonly F_TO_VES_WORDS: ReadonlySet<string> = new Set([\n 'calf', 'elf', 'half', 'leaf', 'loaf', 'self', 'sheaf', 'shelf', 'thief', 'wolf',\n ]);\n private static readonly FE_TO_VES_WORDS: ReadonlySet<string> = new Set(['knife', 'life', 'wife']);\n\n /**\n * The last English word of a lower-cased identifier. Word boundaries are lost by lower-casing, so\n * this matches a trailing exception word against the whole-string suffix instead: `bookshelf`\n * yields `shelf`, `organizationinvoiceref` yields itself (no exception word is its suffix), and a\n * `snake_case` or `kebab-case` tail is split on its separator.\n */\n private static lastWordOf(lowerWord: string): string {\n const tail = lowerWord.split(/[_\\-\\s]/).pop() ?? lowerWord;\n for (const candidate of [...ResourcesConfigNamingUtils.F_TO_VES_WORDS, ...ResourcesConfigNamingUtils.FE_TO_VES_WORDS]) {\n if (tail.endsWith(candidate)) return candidate;\n const plural = candidate.endsWith('fe') ? candidate.slice(0, -2) + 'ves' : candidate.slice(0, -1) + 'ves';\n if (tail.endsWith(plural)) return plural;\n }\n return tail;\n }\n\n /**\n * Preserve the case pattern of the original word in the result\n */\n private static preserveCase(original: string, result: string): string {\n if (original === original.toUpperCase()) {\n return result.toUpperCase();\n }\n if (original === original.toLowerCase()) {\n return result.toLowerCase();\n }\n if (original[0] === original[0].toUpperCase()) {\n return result.charAt(0).toUpperCase() + result.slice(1).toLowerCase();\n }\n return result;\n }\n \n // ================================\n // RESOURCE NAME CONVERSIONS\n // ================================\n \n /**\n * Convert resourceFieldIdentifier to resourceName (plural)\n * Examples:\n * - \"userId\" -> \"users\"\n * - \"organizationIds\" -> \"organizations\" \n * - \"todoListId\" -> \"todoLists\"\n */\n static toResourceName(resourceFieldIdentifier: string): string {\n if (!resourceFieldIdentifier) return '';\n \n let baseName: string;\n \n // Handle plural form (ends with 'Ids')\n if (resourceFieldIdentifier.endsWith('Ids')) {\n baseName = resourceFieldIdentifier.slice(0, -3);\n return this.pluralize(baseName);\n }\n \n // Handle singular form (ends with 'Id')\n if (resourceFieldIdentifier.endsWith('Id')) {\n baseName = resourceFieldIdentifier.slice(0, -2);\n return this.pluralize(baseName);\n }\n \n // If doesn't end with Id/Ids, assume it's already a resource name\n return this.pluralize(resourceFieldIdentifier);\n }\n \n /**\n * Convert resourceName to resourceFieldIdentifier\n * Examples:\n * - \"users\" -> \"userId\"\n * - \"organizations\" -> \"organizationId\"\n * - \"todoLists\" -> \"todoListId\"\n */\n static toResourceFieldIdentifier(resourceName: string): string {\n if (!resourceName) return '';\n \n const singularName = this.singularize(resourceName);\n return singularName + 'Id';\n }\n \n // ================================\n // QUICK WIN FUNCTIONS\n // ================================\n \n /**\n * Convert resourceFieldIdentifier to singular resource name\n * Examples:\n * - \"userId\" -> \"user\"\n * - \"organizationIds\" -> \"organization\"\n */\n static toResourceNameSingular(resourceFieldIdentifier: string): string {\n const resourceName = this.toResourceName(resourceFieldIdentifier);\n return this.singularize(resourceName);\n }\n \n /**\n * Convert resourceFieldIdentifier to plural field identifier\n * Examples:\n * - \"userId\" -> \"userIds\"\n * - \"organizationId\" -> \"organizationIds\"\n */\n static toFieldIdentifierPlural(resourceFieldIdentifier: string): string {\n if (!resourceFieldIdentifier) return '';\n \n // If already plural (ends with 'Ids'), return as is\n if (resourceFieldIdentifier.endsWith('Ids')) {\n return resourceFieldIdentifier;\n }\n \n // If singular (ends with 'Id'), make plural\n if (resourceFieldIdentifier.endsWith('Id')) {\n return resourceFieldIdentifier.slice(0, -2) + 'Ids';\n }\n \n // If doesn't end with Id/Ids, add 'Ids'\n return resourceFieldIdentifier + 'Ids';\n }\n \n /**\n * Convert resourceFieldIdentifier to singular field identifier\n * Examples:\n * - \"userIds\" -> \"userId\"\n * - \"organizationId\" -> \"organizationId\"\n */\n static toFieldIdentifierSingular(resourceFieldIdentifier: string): string {\n if (!resourceFieldIdentifier) return '';\n \n // If plural (ends with 'Ids'), make singular\n if (resourceFieldIdentifier.endsWith('Ids')) {\n return resourceFieldIdentifier.slice(0, -3) + 'Id';\n }\n \n // If already singular (ends with 'Id'), return as is\n if (resourceFieldIdentifier.endsWith('Id')) {\n return resourceFieldIdentifier;\n }\n \n // If doesn't end with Id/Ids, add 'Id'\n return resourceFieldIdentifier + 'Id';\n }\n \n /**\n * Check if a resourceFieldIdentifier is plural\n */\n static isFieldIdentifierPlural(resourceFieldIdentifier: string): boolean {\n return resourceFieldIdentifier.endsWith('Ids');\n }\n \n /**\n * Check if a resourceFieldIdentifier is singular\n */\n static isFieldIdentifierSingular(resourceFieldIdentifier: string): boolean {\n return resourceFieldIdentifier.endsWith('Id') && !resourceFieldIdentifier.endsWith('Ids');\n }\n \n // ================================\n // CASE CONVERSION UTILITIES\n // ================================\n \n /**\n * Convert to snake_case\n * Examples:\n * - \"createdByUser\" -> \"created_by_user\"\n * - \"TodoList\" -> \"todo_list\"\n */\n static toSnakeCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '_$1')\n .replace(/^_/, '')\n .replace(/[-\\s]+/g, '_')\n .toLowerCase();\n }\n \n /**\n * Convert to camelCase\n * Examples:\n * - \"created-by-user\" -> \"createdByUser\"\n * - \"todo_list\" -> \"todoList\"\n */\n static toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, char) => char ? char.toUpperCase() : '')\n .replace(/^([A-Z])/, (char) => char.toLowerCase());\n }\n \n /**\n * Convert to PascalCase\n * Examples:\n * - \"created-by-user\" -> \"CreatedByUser\"\n * - \"todo_list\" -> \"TodoList\"\n */\n static toPascalCase(str: string): string {\n const camelCase = this.toCamelCase(str);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n }\n \n /**\n * Convert to kebab-case\n * Examples:\n * - \"createdByUser\" -> \"created-by-user\"\n * - \"TodoList\" -> \"todo-list\"\n */\n static toKebabCase(str: string): string {\n return str\n .replace(/([A-Z])/g, '-$1')\n .replace(/^-/, '')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n }\n \n /**\n * Convert to CONSTANT_CASE\n * Examples:\n * - \"createdByUser\" -> \"CREATED_BY_USER\"\n * - \"todo-list\" -> \"TODO_LIST\"\n */\n static toConstantCase(str: string): string {\n return this.toSnakeCase(str).toUpperCase();\n }\n \n /**\n * Convert from kebab-case to camelCase (as specifically requested)\n * Examples:\n * - \"created-by-user\" -> \"createdByUser\"\n * - \"todo-list-item\" -> \"todoListItem\"\n */\n static kebabToCamelCase(str: string): string {\n return this.toCamelCase(str);\n }\n \n /**\n * Convert from snake_case to camelCase\n * Examples:\n * - \"created_by_user\" -> \"createdByUser\"\n * - \"todo_list_item\" -> \"todoListItem\"\n */\n static snakeToCamelCase(str: string): string {\n return this.toCamelCase(str);\n }\n \n // ================================\n // VALIDATION UTILITIES\n // ================================\n \n /**\n * Validate if a string is a valid resourceFieldIdentifier\n * Must end with 'Id' or 'Ids' and be in camelCase\n */\n static isValidResourceFieldIdentifier(str: string): boolean {\n if (!str) return false;\n \n // Must end with Id or Ids\n if (!str.endsWith('Id') && !str.endsWith('Ids')) return false;\n \n // Must be in camelCase (starts with lowercase)\n if (str[0] !== str[0].toLowerCase()) return false;\n \n // Should not contain special characters except camelCase\n return /^[a-z][a-zA-Z0-9]*I(d|ds)$/.test(str);\n }\n \n /**\n * Validate if a string is a valid resourceName\n * Should be in camelCase and plural\n */\n static isValidResourceName(str: string): boolean {\n if (!str) return false;\n \n // Must be in camelCase (starts with lowercase)\n if (str[0] !== str[0].toLowerCase()) return false;\n \n // Should not contain special characters\n if (!/^[a-z][a-zA-Z0-9]*$/.test(str)) return false;\n \n // Should be plural (this is a heuristic check)\n return str !== this.singularize(str);\n }\n \n // ================================\n // UTILITY HELPERS\n // ================================\n \n /**\n * Get both singular and plural forms of a resource name\n */\n static getResourceNameVariants(resourceName: string): {\n singular: string;\n plural: string;\n singularFieldId: string;\n pluralFieldId: string;\n } {\n const singular = this.singularize(resourceName);\n const plural = this.pluralize(resourceName);\n \n return {\n singular,\n plural,\n singularFieldId: singular + 'Id',\n pluralFieldId: singular + 'Ids'\n };\n }\n \n /**\n * Extract the base name from a resourceFieldIdentifier.\n * \n * THIS IS THE CANONICAL FUNCTION for deriving populated sibling field names.\n * Used by:\n * - Backend: resource-population.backend.service.ts (populateForSummary, populateListForSummary)\n * - Backend: services-registry-handler.backend.service.ts (getNestedFieldName for 1:1 relationships)\n * - Backend: resources-config-operations.dtos-builder.utils.ts (nested DTO fields for 1:1)\n * - Frontend: DisplayField.tsx (extractPopulatedSibling)\n * \n * DO NOT create alternative implementations. Use this function.\n * For 1:N nested fields, use toResourceName() instead (pluralized form).\n * \n * Examples:\n * - \"userId\" -> \"user\"\n * - \"organizationIds\" -> \"organization\"\n * - \"assignedToUserId\" -> \"assignedToUser\"\n */\n static extractBaseName(resourceFieldIdentifier: string): string {\n if (!resourceFieldIdentifier) return '';\n \n if (resourceFieldIdentifier.endsWith('Ids')) {\n return resourceFieldIdentifier.slice(0, -3);\n }\n \n if (resourceFieldIdentifier.endsWith('Id')) {\n return resourceFieldIdentifier.slice(0, -2);\n }\n \n return resourceFieldIdentifier;\n }\n}"]}
|