Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,8 @@ export const MyCollection: CollectionConfig = {

### Initialize Assist for Payload

The main `payloadAssist` function initializes the library and validates your payload config against defined rules. You can customize the `ruleSet` and `transformAndValidate` function through options.
The main `payloadAssist` function initializes the library, validates your payload config against defined rules, and returns the built config. You can customize the `ruleSet` and `transformAndValidate` function through options.
payloadAssist is implemenented as a wrapper function and not as a payload plugin, to ensure it validates the raw config that is set by the user, instead of the config that was previously processed by other plugins and enriched by payload.

- **ruleSet**: An object map of named rules; merge defaults with your own, if required. Deactivate a default rule by setting the rule to `false`.
- **rules**: `(config: payloadConfig) => boolean | void`; throw to fail with an actionable message and return true if the rule is satisfied.
Expand All @@ -92,19 +93,15 @@ The main `payloadAssist` function initializes the library and validates your pay
import { buildConfig } from "payload";
import payloadAssist, { defaultConfig } from "@byte5digital/payload-assist";

export default buildConfig({
export default payloadAssist({
// your Payload config
plugins: [
payloadAssist(
{
ruleSet: {
...defaultConfig.ruleSet,
// add/override rules here
secretIsSet: (config) => config.secret?.length > 0 ? true : throw 'A secret needs to be set',
},
}
),
]
}, {
ruleSet: {
...defaultConfig.ruleSet,

// add/override rules here
secretIsSet: (config) => config.secret?.length > 0 ? true : throw 'A secret needs to be set',
},
});
```

Expand Down Expand Up @@ -154,7 +151,10 @@ Use `withResponse` to guarantee your endpoints return DTOs (and nothing else). I

```ts
import payload from "payload";
import { withResponse, transformAndValidate } from "@byte5digital/payload-assist";
import {
withResponse,
transformAndValidate,
} from "@byte5digital/payload-assist";
import { MyDataDto } from "path/to/dtos";

export const MyCollection: CollectionConfig = {
Expand Down
49 changes: 25 additions & 24 deletions src/utils/payload-assist.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { PayloadAssistConfig, PayloadAssistOptions } from "../types/config";
import payloadAssistDefaultConfig from "../default.config";
import { Config as PayloadConfig, Plugin } from "payload";
import { buildConfig, Config as PayloadConfig } from "payload";

export { payloadAssistDefaultConfig as defaultConfig };

Expand All @@ -12,32 +12,33 @@ export let payloadAssistConfig: PayloadAssistConfig | undefined = undefined;
* @param options - The options to cusotmize payloadAssist.
* @returns Built and sanitized Payload Config
*/
export const payloadAssist =
(options?: PayloadAssistOptions): Plugin =>
(payloadConfig: PayloadConfig) => {
if (payloadAssistConfig) throw `PayloadAssist is already initialized`;
export const payloadAssist = (
payloadConfig: PayloadConfig,
options?: PayloadAssistOptions
) => {
if (payloadAssistConfig) throw `PayloadAssist is already initialized`;

payloadAssistConfig = {
...payloadAssistDefaultConfig,
...(options ?? {}),
};
payloadAssistConfig = {
...payloadAssistDefaultConfig,
...(options ?? {}),
};

Object.entries(payloadAssistConfig.ruleSet).reduce(
(payloadConfig, [ruleName, rule]) => {
try {
if (rule === false) return payloadConfig; // rule is deactivated, so we skip it
if (!rule(payloadConfig))
throw `The payload config does not satisfy "${ruleName}".`;
} catch (error) {
throw `[PayloadAssist Error]: ${ruleName}: ${error}`;
}
return payloadConfig;
},
payloadConfig
);
Object.entries(payloadAssistConfig.ruleSet).reduce(
(payloadConfig, [ruleName, rule]) => {
try {
if (rule === false) return payloadConfig; // rule is deactivated, so we skip it
if (!rule(payloadConfig))
throw `The payload config does not satisfy "${ruleName}".`;
} catch (error) {
throw `[PayloadAssist Error]: ${ruleName}: ${error}`;
}
return payloadConfig;
},
payloadConfig
);

return payloadConfig;
};
return buildConfig(payloadConfig);
};

/**
* Resets internal module state for tests or reinitialization.
Expand Down