![Create React App Officially Deprecated Amid React 19 Compatibility Issues](https://cdn.sanity.io/images/cgdhsj6q/production/04fa08cf844d798abc0e1a6391c129363cc7e2ab-1024x1024.webp?w=400&fit=max&auto=format)
Security News
Create React App Officially Deprecated Amid React 19 Compatibility Issues
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.
@acoustic-content-sdk/component-api
Advanced tools
Module to attach inline-edit functionality to an WCH based Angular application.
Home > @acoustic-content-sdk/component-api
Framework independent collection of APIs and constants
Interface | Description |
---|---|
AbstractComponentResolver | |
AbstractComponentsRegistry | |
AbstractComponentTypeRefResolver | Service that resolves a component type ref given a layout. |
AbstractLayoutComponentDirective | Type of the Layout metadata. |
DeliveryContentResolver | Service interface that allows to resolve a rendering context given its ID. |
DeliveryLayoutMappingResolver | Service interface that allows to resolve a type |
DeliveryLayoutResolver | Service interface that allows to resolve a type |
DeliveryPageResolver | Service interface that allows to resolve a rendering context given its ID. |
DeliverySearchResolver | Service that performs a search query against delivery search for artifacts of a particular classification. |
DeliverySiteResolver | |
DeliveryTypeResolver | Service interface that allows to resolve a type |
HandlebarsResolver | Service interface to map a template to a (markup) string |
LayoutMappingDirective | Type of the LayoutMapping metadata. |
LayoutMappingResolver | |
LayoutResolver | Callback that finds the layout assigned to the object in the current rendering context. |
PreRenderingResolver | Service interface that returns the pre-rendered content by id |
ProtectedContent | |
ReconciledDeliverySearchInput | Input to the reconciled search operation |
ReconciledDeliverySearchResolver | Service that performs a search query against delivery search for artifacts of a particular classification. |
RenderingContextResolver | Constructs a rendering context |
SeedResolver | Service interface that allows to resolve a seed |
WchPageService | Service interface that allows to resolve a rendering context given the page. |
Variable | Description |
---|---|
ACOUSTIC_RC_INTERCEPTOR_TOKEN | |
VERSION | Version and build number of the package |
Type Alias | Description |
---|---|
HandlebarsProcessor | the processor converts the context into a string |
RenderingContextInput | |
WindowType |
Home > @acoustic-content-sdk/component-api > AbstractComponentResolver
Signature:
export interface AbstractComponentResolver<T>
Method | Description |
---|---|
resolveComponent(aRenderingContext, aLayoutMode) |
Home > @acoustic-content-sdk/component-api > AbstractComponentsRegistry
Signature:
export interface AbstractComponentsRegistry<TYPE> extends AbstractComponentTypeRefResolver<TYPE>
Property | Type | Description |
---|---|---|
getTypeByLayout | (aLayout: Layout, aLayoutMode?: string) => Observable<TYPE> | Returns the type object based on the layout configuration |
getTypeBySelector | (aSelector: string, aLayoutMode?: string) => Observable<TYPE> | Returns the type object based on the layout selector |
registerType | (aController: string | string[], aType: TYPE, aLayoutModes?: string | string[]) => void | define the methods |
Home > @acoustic-content-sdk/component-api > AbstractComponentTypeRefResolver
Service that resolves a component type ref given a layout.
Signature:
export interface AbstractComponentTypeRefResolver<T>
Property | Type | Description |
---|---|---|
getTypeByLayout | (aLayout: Layout, aLayoutMode?: string) => Observable<T> | Returns the type object based on the layout configuration |
Home > @acoustic-content-sdk/component-api > AbstractLayoutComponentDirective
Type of the Layout metadata.
Signature:
export interface AbstractLayoutComponentDirective
Property | Type | Description |
---|---|---|
layoutMode | string | string[] | An optional layout mode used with a default layout mapping. |
mappingId | string | string[] | ID of the content item, content type or the content type name used for a default layout mapping. If the ID is not given, this layout will not be mapped by default. |
selector | string | string[] | Defines the mapping between the layout controller to the layout implementation. If this property is missing, the selector of the component will be used instead. |
Home > @acoustic-content-sdk/component-api > DeliveryContentResolver
Service interface that allows to resolve a rendering context given its ID.
Signature:
export interface DeliveryContentResolver
Method | Description |
---|---|
getDeliveryContentItem(aID) | Resolves a rendering context given the ID of the item |
Home > @acoustic-content-sdk/component-api > DeliveryLayoutMappingResolver
Service interface that allows to resolve a type
Signature:
export interface DeliveryLayoutMappingResolver
Method | Description |
---|---|
getDeliveryLayoutMapping(aTypeId) | Resolves a layout mapping given the ID of the type of the mapping |
Home > @acoustic-content-sdk/component-api > DeliveryLayoutResolver
Service interface that allows to resolve a type
Signature:
export interface DeliveryLayoutResolver
Method | Description |
---|---|
getDeliveryLayout(aLayoutId) | Resolves a layout record |
Home > @acoustic-content-sdk/component-api > DeliveryPageResolver
Service interface that allows to resolve a rendering context given its ID.
Signature:
export interface DeliveryPageResolver
Method | Description |
---|---|
getDeliveryPage(aPath) | Resolves a rendering context given the ID of the item |
Home > @acoustic-content-sdk/component-api > DeliverySearchResolver
Service that performs a search query against delivery search for artifacts of a particular classification.
Signature:
export interface DeliverySearchResolver
Method | Description |
---|---|
getDeliverySearchResults(aQuery, aClassification) | Execute the search. The implementation will add the classification to the fq part of the query, automatically, so there is no need to contain it in the query. |
Home > @acoustic-content-sdk/component-api > DeliverySiteResolver
Signature:
export interface DeliverySiteResolver
Method | Description |
---|---|
getSiteDeliveryContentItem() | Resolves the current site |
Home > @acoustic-content-sdk/component-api > DeliveryTypeResolver
Service interface that allows to resolve a type
Signature:
export interface DeliveryTypeResolver
Method | Description |
---|---|
getDeliveryType(aID) | Resolves a rendering context given the ID of the item |
Home > @acoustic-content-sdk/component-api > HandlebarsResolver
Service interface to map a template to a (markup) string
Signature:
export interface HandlebarsResolver
Method | Description |
---|---|
getHandlebarsProcessor(aId) | Resolves the template ID to a processor |
Home > @acoustic-content-sdk/component-api > LayoutMappingDirective
Type of the LayoutMapping metadata.
Signature:
export interface LayoutMappingDirective
Property | Type | Description |
---|---|---|
id | string | string[] | Type IDs or content IDs to map this to |
kind | CONTENT_ITEM_KIND | CONTENT_ITEM_KIND[] | Type IDs to map this to |
layoutMode | string | string[] | An optional layout mode used with this layout mapping. |
selector | string | string[] | Defines the mapping between the layout controller to the layout implementation. If this property is missing, the selector of the component will be used instead. |
Home > @acoustic-content-sdk/component-api > LayoutMappingResolver
Signature:
export interface LayoutMappingResolver
Property | Type | Description |
---|---|---|
getSelector | (aLayoutMode: string, aRenderingContext: RenderingContextV2) => string | undefined | Returns the layout selector based on the rendering context |
Home > @acoustic-content-sdk/component-api > LayoutResolver
Callback that finds the layout assigned to the object in the current rendering context.
Signature:
export interface LayoutResolver
Property | Type | Description |
---|---|---|
resolveLayout | (aLayoutMode: string, aRenderingContext: RenderingContextV2) => Observable<Layout> | Returns the layout layout object based on the rendering context and the mode |
Home > @acoustic-content-sdk/component-api > PreRenderingResolver
Service interface that returns the pre-rendered content by id
Signature:
export interface PreRenderingResolver
Method | Description |
---|---|
getPreRenderedMarkup(aSelector, aLayoutMode) | Generate a pre-rendering of the referenced content item |
Home > @acoustic-content-sdk/component-api > ProtectedContent
Signature:
export interface ProtectedContent
Property | Type | Description |
---|---|---|
protected$ | Observable<boolean> | Flag to tell whether or not to serve protected content |
Home > @acoustic-content-sdk/component-api > ReconciledDeliverySearchInput
Input to the reconciled search operation
Signature:
export interface ReconciledDeliverySearchInput<T>
Property | Type | Description |
---|---|---|
predicate | UnaryFunction<T, boolean> | Matcher function that tests if a particular value matches the search query |
query | QueryInput | The search query object used to execute a query equivalent to the matcher |
Home > @acoustic-content-sdk/component-api > ReconciledDeliverySearchResolver
Service that performs a search query against delivery search for artifacts of a particular classification.
Signature:
export interface ReconciledDeliverySearchResolver
Method | Description |
---|---|
getDeliverySearchResults(aQuery, aClassification) | Execute the search for layout mappings. The implementation will add the classification to the fq part of the query, automatically, so there is no need to contain it in the query. |
getDeliverySearchResults(aQuery, aClassification) | Execute the search for layouts. The implementation will add the classification to the fq part of the query, automatically, so there is no need to contain it in the query. |
getDeliverySearchResults(aQuery, aClassification) | Execute the search for assets. The implementation will add the classification to the fq part of the query, automatically, so there is no need to contain it in the query. |
getDeliverySearchResults(aQuery, aClassification) | Execute the search for content items. The implementation will add the classification to the fq part of the query, automatically, so there is no need to contain it in the query. |
getDeliverySearchResults(aQuery, aClassification) | Execute the search for content items. The implementation will add the classification to the fq part of the query, automatically, so there is no need to contain it in the query. |
getDeliverySearchResults(aQuery, aClassification) | Execute the search. The implementation will add the classification to the fq part of the query, automatically, so there is no need to contain it in the query. |
Home > @acoustic-content-sdk/component-api > RenderingContextResolver
Constructs a rendering context
Signature:
export interface RenderingContextResolver
Property | Type | Description |
---|---|---|
resolveRenderingContext | (aItem: RenderingContextInput, aProvider: RenderingContextProviderV2) => Observable<RenderingContextV2> | Returns the layout selector based on the rendering context |
Home > @acoustic-content-sdk/component-api > SeedResolver
Service interface that allows to resolve a seed
Signature:
export interface SeedResolver
Method | Description |
---|---|
getSeed(aID, aClassification) | Resolves a rendering context given the ID of the item |
Home > @acoustic-content-sdk/component-api > WchPageService
Service interface that allows to resolve a rendering context given the page.
Signature:
export interface WchPageService
Method | Description |
---|---|
getRenderingContextByPath(aPath) | Resolves the rendering context given the path |
Home > @acoustic-content-sdk/component-api > ACOUSTIC_RC_INTERCEPTOR_TOKEN
Signature:
ACOUSTIC_RC_INTERCEPTOR_TOKEN = "8453750A-4519-4184-840B-D490E909D23E"
Home > @acoustic-content-sdk/component-api > VERSION
Version and build number of the package
Signature:
VERSION: {
version: {
major: string;
minor: string;
patch: string;
branch: string;
};
build: Date;
}
Home > @acoustic-content-sdk/component-api > HandlebarsProcessor
the processor converts the context into a string
Signature:
export declare type HandlebarsProcessor = (aContext: RenderingContextV2) => string;
Home > @acoustic-content-sdk/component-api > RenderingContextInput
Signature:
export declare type RenderingContextInput = string | DeliveryContentItem | DeliveryGroupElement | DeliveryReferenceElement;
Home > @acoustic-content-sdk/component-api > WindowType
Signature:
export declare type WindowType = Window | Object;
Home > @acoustic-content-sdk/component-api > AbstractComponentTypeRefResolver > getTypeByLayout
Returns the type object based on the layout configuration
Signature:
getTypeByLayout: (aLayout: Layout, aLayoutMode?: string) => Observable<T>;
Home > @acoustic-content-sdk/component-api > AbstractComponentResolver > resolveComponent
Signature:
resolveComponent(aRenderingContext: RenderingContextV2, aLayoutMode?: string): Observable<T>;
Parameter | Type | Description |
---|---|---|
aRenderingContext | RenderingContextV2 | |
aLayoutMode | string |
Returns:
Observable<T>
Home > @acoustic-content-sdk/component-api > AbstractLayoutComponentDirective > layoutMode
An optional layout mode used with a default layout mapping.
Signature:
layoutMode?: string | string[];
Home > @acoustic-content-sdk/component-api > AbstractLayoutComponentDirective > mappingId
ID of the content item, content type or the content type name used for a default layout mapping. If the ID is not given, this layout will not be mapped by default.
Signature:
mappingId?: string | string[];
Home > @acoustic-content-sdk/component-api > AbstractLayoutComponentDirective > selector
Defines the mapping between the layout controller to the layout implementation. If this property is missing, the selector of the component will be used instead.
Signature:
selector?: string | string[];
Home > @acoustic-content-sdk/component-api > DeliveryContentResolver > getDeliveryContentItem
Resolves a rendering context given the ID of the item
Signature:
getDeliveryContentItem(aID: string): Observable<DeliveryContentItem>;
Parameter | Type | Description |
---|---|---|
aID | string | the ID of the item |
Returns:
Observable<DeliveryContentItem>
an observable of the context
Home > @acoustic-content-sdk/component-api > AbstractComponentsRegistry > getTypeByLayout
Returns the type object based on the layout configuration
Signature:
getTypeByLayout: (aLayout: Layout, aLayoutMode?: string) => Observable<TYPE>;
Home > @acoustic-content-sdk/component-api > AbstractComponentsRegistry > getTypeBySelector
Returns the type object based on the layout selector
Signature:
getTypeBySelector: (aSelector: string, aLayoutMode?: string) => Observable<TYPE>;
Home > @acoustic-content-sdk/component-api > AbstractComponentsRegistry > registerType
define the methods
Signature:
registerType: (aController: string | string[], aType: TYPE, aLayoutModes?: string | string[]) => void;
Home > @acoustic-content-sdk/component-api > DeliveryLayoutResolver > getDeliveryLayout
Resolves a layout record
Signature:
getDeliveryLayout(aLayoutId: string): Observable<DeliveryLayout>;
Parameter | Type | Description |
---|---|---|
aLayoutId | string | the ID of the layout |
Returns:
Observable<DeliveryLayout>
an observable of the layout
Home > @acoustic-content-sdk/component-api > DeliveryPageResolver > getDeliveryPage
Resolves a rendering context given the ID of the item
Signature:
getDeliveryPage(aPath: string): Observable<DeliveryContentItem>;
Parameter | Type | Description |
---|---|---|
aPath | string | the path to the page |
Returns:
Observable<DeliveryContentItem>
an observable of the context
Home > @acoustic-content-sdk/component-api > DeliveryLayoutMappingResolver > getDeliveryLayoutMapping
Resolves a layout mapping given the ID of the type of the mapping
Signature:
getDeliveryLayoutMapping(aTypeId: string): Observable<DeliveryLayoutMapping>;
Parameter | Type | Description |
---|---|---|
aTypeId | string | the ID of the content type the layout is mapped to |
Returns:
Observable<DeliveryLayoutMapping>
an observable of the context
Home > @acoustic-content-sdk/component-api > DeliverySearchResolver > getDeliverySearchResults
Execute the search. The implementation will add the classification to the fq
part of the query, automatically, so there is no need to contain it in the query.
Signature:
getDeliverySearchResults<T>(aQuery: QueryInput, aClassification: string): Observable<SearchResults<T>>;
Parameter | Type | Description |
---|---|---|
aQuery | QueryInput | the query input |
aClassification | string | the classification |
Returns:
Observable<SearchResults<T>>
the search result
Home > @acoustic-content-sdk/component-api > DeliverySiteResolver > getSiteDeliveryContentItem
Resolves the current site
Signature:
getSiteDeliveryContentItem(): Observable<SiteDeliveryContentItem>;
Returns:
Observable<SiteDeliveryContentItem>
the site record
Home > @acoustic-content-sdk/component-api > DeliveryTypeResolver > getDeliveryType
Resolves a rendering context given the ID of the item
Signature:
getDeliveryType(aID: string): Observable<DeliveryType>;
Parameter | Type | Description |
---|---|---|
aID | string | the ID of the item |
Returns:
Observable<DeliveryType>
an observable of the context
Home > @acoustic-content-sdk/component-api > LayoutMappingDirective > id
Type IDs or content IDs to map this to
Signature:
id?: string | string[];
Home > @acoustic-content-sdk/component-api > LayoutMappingDirective > kind
Type IDs to map this to
Signature:
kind?: CONTENT_ITEM_KIND | CONTENT_ITEM_KIND[];
Home > @acoustic-content-sdk/component-api > LayoutMappingDirective > layoutMode
An optional layout mode used with this layout mapping.
Signature:
layoutMode?: string | string[];
Home > @acoustic-content-sdk/component-api > LayoutMappingDirective > selector
Defines the mapping between the layout controller to the layout implementation. If this property is missing, the selector of the component will be used instead.
Signature:
selector?: string | string[];
Home > @acoustic-content-sdk/component-api > HandlebarsResolver > getHandlebarsProcessor
Resolves the template ID to a processor
Signature:
getHandlebarsProcessor(aId: string): Observable<HandlebarsProcessor>;
Parameter | Type | Description |
---|---|---|
aId | string | the ID of the template |
Returns:
Observable<HandlebarsProcessor>
an observable of the processor
Home > @acoustic-content-sdk/component-api > LayoutMappingResolver > getSelector
Returns the layout selector based on the rendering context
Signature:
getSelector: (aLayoutMode: string, aRenderingContext: RenderingContextV2) => string | undefined;
Home > @acoustic-content-sdk/component-api > LayoutResolver > resolveLayout
Returns the layout layout object based on the rendering context and the mode
Signature:
resolveLayout: (aLayoutMode: string, aRenderingContext: RenderingContextV2) => Observable<Layout>;
Home > @acoustic-content-sdk/component-api > PreRenderingResolver > getPreRenderedMarkup
Generate a pre-rendering of the referenced content item
Signature:
getPreRenderedMarkup(aSelector: string, aLayoutMode?: string): Observable<string>;
Parameter | Type | Description |
---|---|---|
aSelector | string | the markup selector. This is either the ID of a content item or ID#accessor to address a markup fragment |
aLayoutMode | string | optionally the layout mode |
Returns:
Observable<string>
an observable of the result
Home > @acoustic-content-sdk/component-api > ReconciledDeliverySearchInput > predicate
Matcher function that tests if a particular value matches the search query
Signature:
predicate: UnaryFunction<T, boolean>;
Home > @acoustic-content-sdk/component-api > ReconciledDeliverySearchInput > query
The search query object used to execute a query equivalent to the matcher
Signature:
query: QueryInput;
Home > @acoustic-content-sdk/component-api > ProtectedContent > protected$
Flag to tell whether or not to serve protected content
Signature:
protected$: Observable<boolean>;
Home > @acoustic-content-sdk/component-api > RenderingContextResolver > resolveRenderingContext
Returns the layout selector based on the rendering context
Signature:
resolveRenderingContext: (aItem: RenderingContextInput, aProvider: RenderingContextProviderV2) => Observable<RenderingContextV2>;
Home > @acoustic-content-sdk/component-api > ReconciledDeliverySearchResolver > getDeliverySearchResults
Execute the search for layout mappings. The implementation will add the classification to the fq
part of the query, automatically, so there is no need to contain it in the query.
Signature:
getDeliverySearchResults<RESULT>(aQuery: ReconciledDeliverySearchInput<AuthoringLayoutMapping>, aClassification: typeof CLASSIFICATION_LAYOUT_MAPPING): Observable<SearchResults<RESULT>>;
Parameter | Type | Description |
---|---|---|
aQuery | ReconciledDeliverySearchInput<AuthoringLayoutMapping> | the query input |
aClassification | typeof CLASSIFICATION_LAYOUT_MAPPING | the classification |
Returns:
Observable<SearchResults<RESULT>>
the search result
Home > @acoustic-content-sdk/component-api > ReconciledDeliverySearchResolver > getDeliverySearchResults
Execute the search for layouts. The implementation will add the classification to the fq
part of the query, automatically, so there is no need to contain it in the query.
Signature:
getDeliverySearchResults<RESULT>(aQuery: ReconciledDeliverySearchInput<AuthoringLayout>, aClassification: typeof CLASSIFICATION_LAYOUT): Observable<SearchResults<RESULT>>;
Parameter | Type | Description |
---|---|---|
aQuery | ReconciledDeliverySearchInput<AuthoringLayout> | the query input |
aClassification | typeof CLASSIFICATION_LAYOUT | the classification |
Returns:
Observable<SearchResults<RESULT>>
the search result
Home > @acoustic-content-sdk/component-api > ReconciledDeliverySearchResolver > getDeliverySearchResults
Execute the search for assets. The implementation will add the classification to the fq
part of the query, automatically, so there is no need to contain it in the query.
Signature:
getDeliverySearchResults<RESULT>(aQuery: ReconciledDeliverySearchInput<AuthoringAsset>, aClassification: typeof CLASSIFICATION_ASSET): Observable<SearchResults<RESULT>>;
Parameter | Type | Description |
---|---|---|
aQuery | ReconciledDeliverySearchInput<AuthoringAsset> | the query input |
aClassification | typeof CLASSIFICATION_ASSET | the classification |
Returns:
Observable<SearchResults<RESULT>>
the search result
Home > @acoustic-content-sdk/component-api > ReconciledDeliverySearchResolver > getDeliverySearchResults
Execute the search for content items. The implementation will add the classification to the fq
part of the query, automatically, so there is no need to contain it in the query.
Signature:
getDeliverySearchResults<RESULT>(aQuery: ReconciledDeliverySearchInput<AuthoringContentItem>, aClassification: typeof CLASSIFICATION_CONTENT): Observable<SearchResults<RESULT>>;
Parameter | Type | Description |
---|---|---|
aQuery | ReconciledDeliverySearchInput<AuthoringContentItem> | the query input |
aClassification | typeof CLASSIFICATION_CONTENT | the classification |
Returns:
Observable<SearchResults<RESULT>>
the search result
Home > @acoustic-content-sdk/component-api > ReconciledDeliverySearchResolver > getDeliverySearchResults
Execute the search for content items. The implementation will add the classification to the fq
part of the query, automatically, so there is no need to contain it in the query.
Signature:
getDeliverySearchResults<RESULT>(aQuery: ReconciledDeliverySearchInput<AuthoringType>, aClassification: typeof CLASSIFICATION_CONTENT_TYPE): Observable<SearchResults<RESULT>>;
Parameter | Type | Description |
---|---|---|
aQuery | ReconciledDeliverySearchInput<AuthoringType> | the query input |
aClassification | typeof CLASSIFICATION_CONTENT_TYPE | the classification |
Returns:
Observable<SearchResults<RESULT>>
the search result
Home > @acoustic-content-sdk/component-api > ReconciledDeliverySearchResolver > getDeliverySearchResults
Execute the search. The implementation will add the classification to the fq
part of the query, automatically, so there is no need to contain it in the query.
Signature:
getDeliverySearchResults<ITEM, RESULT>(aQuery: ReconciledDeliverySearchInput<ITEM>, aClassification: string): Observable<SearchResults<RESULT>>;
Parameter | Type | Description |
---|---|---|
aQuery | ReconciledDeliverySearchInput<ITEM> | the query input |
aClassification | string | the classification |
Returns:
Observable<SearchResults<RESULT>>
the search result
Home > @acoustic-content-sdk/component-api > SeedResolver > getSeed
Resolves a rendering context given the ID of the item
Signature:
getSeed(aID: string, aClassification: string): Observable<string>;
Parameter | Type | Description |
---|---|---|
aID | string | the ID of the item |
aClassification | string | classification of the item |
Returns:
Observable<string>
an observable of the context
Home > @acoustic-content-sdk/component-api > WchPageService > getRenderingContextByPath
Resolves the rendering context given the path
Signature:
getRenderingContextByPath(aPath: string): Observable<RenderingContextV2 | null | undefined>;
Parameter | Type | Description |
---|---|---|
aPath | string | the path as a string |
Returns:
Observable<RenderingContextV2 | null | undefined>
the observable of the rendering context or undefined if it could not be found
FAQs
Module to attach inline-edit functionality to an WCH based Angular application.
We found that @acoustic-content-sdk/component-api demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 8 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Create React App is officially deprecated due to React 19 issues and lack of maintenance—developers should switch to Vite or other modern alternatives.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.