@notion-headless-cms/validate 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +26 -0
- package/dist/index.mjs +157 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +53 -0
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/index.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* `createClient({...})` に渡すオプションを zod で検証する。
|
|
4
|
+
* 検証成功時は入力をそのまま返す。
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* import { createClient } from "@notion-headless-cms/core";
|
|
8
|
+
* import { validateCreateClientOptions } from "@notion-headless-cms/validate";
|
|
9
|
+
*
|
|
10
|
+
* const opts = validateCreateClientOptions({ sources: { notion: notionSource(...) } });
|
|
11
|
+
* const cms = createClient(opts);
|
|
12
|
+
*/
|
|
13
|
+
declare function validateCreateClientOptions<T>(opts: T): T;
|
|
14
|
+
/**
|
|
15
|
+
* `notionSource({...})` に渡すオプションを zod で検証する。
|
|
16
|
+
* 検証成功時は入力をそのまま返す。
|
|
17
|
+
*/
|
|
18
|
+
declare function validateNotionSourceConfig<T>(opts: T): T;
|
|
19
|
+
/**
|
|
20
|
+
* `nhc.config.ts` の defineConfig() 戻り値を zod で検証する。
|
|
21
|
+
* 検証成功時は入力をそのまま返す。CLI 内部からも利用される。
|
|
22
|
+
*/
|
|
23
|
+
declare function validateCMSConfig<T>(config: T): T;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { validateCMSConfig, validateCreateClientOptions, validateNotionSourceConfig };
|
|
26
|
+
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { CMSError } from "@notion-headless-cms/core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
//#region src/index.ts
|
|
4
|
+
/**
|
|
5
|
+
* `@notion-headless-cms/validate`
|
|
6
|
+
*
|
|
7
|
+
* `createClient` / `notionSource` / CLI 設定の実行時検証を zod で行う opt-in パッケージ。
|
|
8
|
+
* core はゼロ依存ルールに従い zod を直接読み込まないため、検証が欲しい呼び出し側がこの
|
|
9
|
+
* パッケージを明示的にインストールして利用する。
|
|
10
|
+
*
|
|
11
|
+
* 提供する API:
|
|
12
|
+
*
|
|
13
|
+
* - `validateCreateClientOptions(opts)` — `createClient({...})` の引数を検証
|
|
14
|
+
* - `validateNotionSourceConfig(opts)` — `notionSource({...})` の引数を検証
|
|
15
|
+
* - `validateCMSConfig(config)` — `nhc.config.ts` の defineConfig() 戻り値を検証
|
|
16
|
+
*
|
|
17
|
+
* いずれも検証失敗時は `CMSError(code: "core/schema_invalid")` を throw する。
|
|
18
|
+
*/
|
|
19
|
+
const loggerSchema = z.object({
|
|
20
|
+
debug: z.function().optional(),
|
|
21
|
+
info: z.function().optional(),
|
|
22
|
+
warn: z.function().optional(),
|
|
23
|
+
error: z.function().optional()
|
|
24
|
+
}).passthrough();
|
|
25
|
+
const cacheAdapterSchema = z.object({
|
|
26
|
+
name: z.string().min(1, "CacheAdapter.name は空にできません"),
|
|
27
|
+
handles: z.array(z.enum(["document", "image"])).min(1, "CacheAdapter.handles は少なくとも 1 要素必要です"),
|
|
28
|
+
doc: z.unknown().optional(),
|
|
29
|
+
img: z.unknown().optional()
|
|
30
|
+
}).passthrough();
|
|
31
|
+
const collectionDefSchema = z.object({
|
|
32
|
+
source: z.unknown().refine((v) => v != null, { message: "collection.source は必須です" }),
|
|
33
|
+
slugField: z.string().min(1, "collection.slugField は必須です"),
|
|
34
|
+
statusField: z.string().optional(),
|
|
35
|
+
publishedStatuses: z.array(z.string()).optional(),
|
|
36
|
+
accessibleStatuses: z.array(z.string()).optional(),
|
|
37
|
+
hooks: z.unknown().optional()
|
|
38
|
+
}).passthrough();
|
|
39
|
+
const cmsAdapterSchema = z.object({ collections: z.record(z.string(), collectionDefSchema).refine((v) => Object.keys(v).length > 0, { message: "CMSAdapter.collections は少なくとも 1 件必要です" }) }).passthrough();
|
|
40
|
+
const createClientOptionsSchema = z.object({
|
|
41
|
+
sources: z.record(z.string(), cmsAdapterSchema).optional(),
|
|
42
|
+
cache: z.array(cacheAdapterSchema).optional(),
|
|
43
|
+
swr: z.object({ ttlMs: z.number().int().nonnegative().optional() }).optional(),
|
|
44
|
+
renderer: z.function().optional(),
|
|
45
|
+
imageProxyBase: z.string().optional(),
|
|
46
|
+
waitUntil: z.function().optional(),
|
|
47
|
+
hooks: z.unknown().optional(),
|
|
48
|
+
plugins: z.array(z.unknown()).optional(),
|
|
49
|
+
logger: loggerSchema.optional(),
|
|
50
|
+
logLevel: z.enum([
|
|
51
|
+
"debug",
|
|
52
|
+
"info",
|
|
53
|
+
"warn",
|
|
54
|
+
"error"
|
|
55
|
+
]).optional(),
|
|
56
|
+
rateLimiter: z.object({
|
|
57
|
+
maxConcurrent: z.number().int().positive().optional(),
|
|
58
|
+
retryOn: z.array(z.number().int()).optional(),
|
|
59
|
+
maxRetries: z.number().int().nonnegative().optional(),
|
|
60
|
+
baseDelayMs: z.number().nonnegative().optional()
|
|
61
|
+
}).optional(),
|
|
62
|
+
content: z.object({
|
|
63
|
+
remarkPlugins: z.array(z.unknown()).optional(),
|
|
64
|
+
rehypePlugins: z.array(z.unknown()).optional()
|
|
65
|
+
}).optional()
|
|
66
|
+
}).passthrough().superRefine((opts, ctx) => {
|
|
67
|
+
if (opts.sources) {
|
|
68
|
+
let total = 0;
|
|
69
|
+
for (const adapter of Object.values(opts.sources)) if (adapter) total += Object.keys(adapter.collections).length;
|
|
70
|
+
if (total === 0) ctx.addIssue({
|
|
71
|
+
code: "custom",
|
|
72
|
+
message: "createClient.sources にコレクションを含むアダプタを少なくとも 1 つ指定してください",
|
|
73
|
+
path: ["sources"]
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
const notionPublishOptionsSchema = z.object({
|
|
78
|
+
publishedStatuses: z.array(z.string()).optional(),
|
|
79
|
+
accessibleStatuses: z.array(z.string()).optional()
|
|
80
|
+
});
|
|
81
|
+
const schemaEntrySchema = z.object({
|
|
82
|
+
dataSourceId: z.string().min(1, "schema.dataSourceId は必須です"),
|
|
83
|
+
slugField: z.string().min(1, "schema.slugField は必須です"),
|
|
84
|
+
statusField: z.string().optional(),
|
|
85
|
+
properties: z.record(z.string(), z.unknown())
|
|
86
|
+
}).passthrough();
|
|
87
|
+
const notionSourceConfigSchema = z.object({
|
|
88
|
+
schema: z.record(z.string(), schemaEntrySchema).refine((v) => Object.keys(v).length > 0, { message: "notionSource.schema は少なくとも 1 件必要です" }),
|
|
89
|
+
token: z.string().min(1, "notionSource.token は必須です"),
|
|
90
|
+
fetch: z.unknown().optional(),
|
|
91
|
+
publishOptions: z.record(z.string(), notionPublishOptionsSchema).optional()
|
|
92
|
+
}).passthrough();
|
|
93
|
+
const collectionGenConfigSchema = z.object({
|
|
94
|
+
databaseId: z.string().optional(),
|
|
95
|
+
dbName: z.string().optional(),
|
|
96
|
+
slugField: z.string().optional(),
|
|
97
|
+
statusField: z.string().optional(),
|
|
98
|
+
publishedStatuses: z.array(z.string()).optional(),
|
|
99
|
+
accessibleStatuses: z.array(z.string()).optional(),
|
|
100
|
+
fieldMappings: z.record(z.string(), z.string()).optional()
|
|
101
|
+
}).passthrough().refine((v) => v.databaseId != null || v.dbName != null, { message: "collections[*] には databaseId または dbName のどちらかが必要です" });
|
|
102
|
+
const cmsConfigSchema = z.object({
|
|
103
|
+
output: z.string().min(1, "config.output は必須です"),
|
|
104
|
+
notionToken: z.string().optional(),
|
|
105
|
+
collections: z.record(z.string(), collectionGenConfigSchema).refine((v) => Object.keys(v).length > 0, { message: "config.collections は少なくとも 1 件必要です" })
|
|
106
|
+
}).passthrough();
|
|
107
|
+
function formatIssues(issues) {
|
|
108
|
+
return issues.map((issue) => {
|
|
109
|
+
return ` - ${issue.path.length > 0 ? issue.path.join(".") : "(root)"}: ${issue.message}`;
|
|
110
|
+
}).join("\n");
|
|
111
|
+
}
|
|
112
|
+
function throwSchemaInvalid(operation, label, issues) {
|
|
113
|
+
throw new CMSError({
|
|
114
|
+
code: "core/schema_invalid",
|
|
115
|
+
message: `${label} の検証に失敗しました:\n${formatIssues(issues)}`,
|
|
116
|
+
context: { operation },
|
|
117
|
+
nextSteps: ["上記のフィールド名を手がかりに設定値の型と必須性を見直す", "TypeScript の型エラーが出ていないか確認する (実行時の値が型から外れている可能性)"]
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* `createClient({...})` に渡すオプションを zod で検証する。
|
|
122
|
+
* 検証成功時は入力をそのまま返す。
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* import { createClient } from "@notion-headless-cms/core";
|
|
126
|
+
* import { validateCreateClientOptions } from "@notion-headless-cms/validate";
|
|
127
|
+
*
|
|
128
|
+
* const opts = validateCreateClientOptions({ sources: { notion: notionSource(...) } });
|
|
129
|
+
* const cms = createClient(opts);
|
|
130
|
+
*/
|
|
131
|
+
function validateCreateClientOptions(opts) {
|
|
132
|
+
const result = createClientOptionsSchema.safeParse(opts);
|
|
133
|
+
if (!result.success) throwSchemaInvalid("validateCreateClientOptions", "createClient オプション", result.error.issues);
|
|
134
|
+
return opts;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* `notionSource({...})` に渡すオプションを zod で検証する。
|
|
138
|
+
* 検証成功時は入力をそのまま返す。
|
|
139
|
+
*/
|
|
140
|
+
function validateNotionSourceConfig(opts) {
|
|
141
|
+
const result = notionSourceConfigSchema.safeParse(opts);
|
|
142
|
+
if (!result.success) throwSchemaInvalid("validateNotionSourceConfig", "notionSource オプション", result.error.issues);
|
|
143
|
+
return opts;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* `nhc.config.ts` の defineConfig() 戻り値を zod で検証する。
|
|
147
|
+
* 検証成功時は入力をそのまま返す。CLI 内部からも利用される。
|
|
148
|
+
*/
|
|
149
|
+
function validateCMSConfig(config) {
|
|
150
|
+
const result = cmsConfigSchema.safeParse(config);
|
|
151
|
+
if (!result.success) throwSchemaInvalid("validateCMSConfig", "nhc.config.ts の defineConfig() 戻り値", result.error.issues);
|
|
152
|
+
return config;
|
|
153
|
+
}
|
|
154
|
+
//#endregion
|
|
155
|
+
export { validateCMSConfig, validateCreateClientOptions, validateNotionSourceConfig };
|
|
156
|
+
|
|
157
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["/**\n * `@notion-headless-cms/validate`\n *\n * `createClient` / `notionSource` / CLI 設定の実行時検証を zod で行う opt-in パッケージ。\n * core はゼロ依存ルールに従い zod を直接読み込まないため、検証が欲しい呼び出し側がこの\n * パッケージを明示的にインストールして利用する。\n *\n * 提供する API:\n *\n * - `validateCreateClientOptions(opts)` — `createClient({...})` の引数を検証\n * - `validateNotionSourceConfig(opts)` — `notionSource({...})` の引数を検証\n * - `validateCMSConfig(config)` — `nhc.config.ts` の defineConfig() 戻り値を検証\n *\n * いずれも検証失敗時は `CMSError(code: \"core/schema_invalid\")` を throw する。\n */\nimport { CMSError } from \"@notion-headless-cms/core\";\nimport { z } from \"zod\";\n\n// --- 共通スキーマ -----------------------------------------------------------\n\nconst loggerSchema = z\n .object({\n debug: z.function().optional(),\n info: z.function().optional(),\n warn: z.function().optional(),\n error: z.function().optional(),\n })\n .passthrough();\n\nconst cacheAdapterSchema = z\n .object({\n name: z.string().min(1, \"CacheAdapter.name は空にできません\"),\n handles: z\n .array(z.enum([\"document\", \"image\"]))\n .min(1, \"CacheAdapter.handles は少なくとも 1 要素必要です\"),\n doc: z.unknown().optional(),\n img: z.unknown().optional(),\n })\n .passthrough();\n\nconst collectionDefSchema = z\n .object({\n source: z.unknown().refine((v) => v != null, {\n message: \"collection.source は必須です\",\n }),\n slugField: z.string().min(1, \"collection.slugField は必須です\"),\n statusField: z.string().optional(),\n publishedStatuses: z.array(z.string()).optional(),\n accessibleStatuses: z.array(z.string()).optional(),\n hooks: z.unknown().optional(),\n })\n .passthrough();\n\nconst cmsAdapterSchema = z\n .object({\n collections: z\n .record(z.string(), collectionDefSchema)\n .refine((v) => Object.keys(v).length > 0, {\n message: \"CMSAdapter.collections は少なくとも 1 件必要です\",\n }),\n })\n .passthrough();\n\nconst createClientOptionsSchema = z\n .object({\n sources: z.record(z.string(), cmsAdapterSchema).optional(),\n cache: z.array(cacheAdapterSchema).optional(),\n swr: z\n .object({\n ttlMs: z.number().int().nonnegative().optional(),\n })\n .optional(),\n renderer: z.function().optional(),\n imageProxyBase: z.string().optional(),\n waitUntil: z.function().optional(),\n hooks: z.unknown().optional(),\n plugins: z.array(z.unknown()).optional(),\n logger: loggerSchema.optional(),\n logLevel: z.enum([\"debug\", \"info\", \"warn\", \"error\"]).optional(),\n rateLimiter: z\n .object({\n maxConcurrent: z.number().int().positive().optional(),\n retryOn: z.array(z.number().int()).optional(),\n maxRetries: z.number().int().nonnegative().optional(),\n baseDelayMs: z.number().nonnegative().optional(),\n })\n .optional(),\n content: z\n .object({\n remarkPlugins: z.array(z.unknown()).optional(),\n rehypePlugins: z.array(z.unknown()).optional(),\n })\n .optional(),\n })\n .passthrough()\n .superRefine((opts, ctx) => {\n // sources は最低 1 つのアダプタを持つこと\n if (opts.sources) {\n let total = 0;\n for (const adapter of Object.values(opts.sources)) {\n if (adapter)\n total += Object.keys(\n (adapter as { collections: Record<string, unknown> }).collections,\n ).length;\n }\n if (total === 0) {\n ctx.addIssue({\n code: \"custom\",\n message:\n \"createClient.sources にコレクションを含むアダプタを少なくとも 1 つ指定してください\",\n path: [\"sources\"],\n });\n }\n }\n });\n\nconst notionPublishOptionsSchema = z.object({\n publishedStatuses: z.array(z.string()).optional(),\n accessibleStatuses: z.array(z.string()).optional(),\n});\n\nconst schemaEntrySchema = z\n .object({\n dataSourceId: z.string().min(1, \"schema.dataSourceId は必須です\"),\n slugField: z.string().min(1, \"schema.slugField は必須です\"),\n statusField: z.string().optional(),\n properties: z.record(z.string(), z.unknown()),\n })\n .passthrough();\n\nconst notionSourceConfigSchema = z\n .object({\n schema: z\n .record(z.string(), schemaEntrySchema)\n .refine((v) => Object.keys(v).length > 0, {\n message: \"notionSource.schema は少なくとも 1 件必要です\",\n }),\n token: z.string().min(1, \"notionSource.token は必須です\"),\n fetch: z.unknown().optional(),\n publishOptions: z.record(z.string(), notionPublishOptionsSchema).optional(),\n })\n .passthrough();\n\nconst collectionGenConfigSchema = z\n .object({\n databaseId: z.string().optional(),\n dbName: z.string().optional(),\n slugField: z.string().optional(),\n statusField: z.string().optional(),\n publishedStatuses: z.array(z.string()).optional(),\n accessibleStatuses: z.array(z.string()).optional(),\n fieldMappings: z.record(z.string(), z.string()).optional(),\n })\n .passthrough()\n .refine((v) => v.databaseId != null || v.dbName != null, {\n message:\n \"collections[*] には databaseId または dbName のどちらかが必要です\",\n });\n\nconst cmsConfigSchema = z\n .object({\n output: z.string().min(1, \"config.output は必須です\"),\n notionToken: z.string().optional(),\n collections: z\n .record(z.string(), collectionGenConfigSchema)\n .refine((v) => Object.keys(v).length > 0, {\n message: \"config.collections は少なくとも 1 件必要です\",\n }),\n })\n .passthrough();\n\n// --- ヘルパー --------------------------------------------------------------\n\nfunction formatIssues(issues: readonly z.core.$ZodIssue[]): string {\n return issues\n .map((issue) => {\n const path = issue.path.length > 0 ? issue.path.join(\".\") : \"(root)\";\n return ` - ${path}: ${issue.message}`;\n })\n .join(\"\\n\");\n}\n\nfunction throwSchemaInvalid(\n operation: string,\n label: string,\n issues: readonly z.core.$ZodIssue[],\n): never {\n throw new CMSError({\n code: \"core/schema_invalid\",\n message: `${label} の検証に失敗しました:\\n${formatIssues(issues)}`,\n context: { operation },\n nextSteps: [\n \"上記のフィールド名を手がかりに設定値の型と必須性を見直す\",\n \"TypeScript の型エラーが出ていないか確認する (実行時の値が型から外れている可能性)\",\n ],\n });\n}\n\n// --- 公開 API --------------------------------------------------------------\n\n/**\n * `createClient({...})` に渡すオプションを zod で検証する。\n * 検証成功時は入力をそのまま返す。\n *\n * @example\n * import { createClient } from \"@notion-headless-cms/core\";\n * import { validateCreateClientOptions } from \"@notion-headless-cms/validate\";\n *\n * const opts = validateCreateClientOptions({ sources: { notion: notionSource(...) } });\n * const cms = createClient(opts);\n */\nexport function validateCreateClientOptions<T>(opts: T): T {\n const result = createClientOptionsSchema.safeParse(opts);\n if (!result.success) {\n throwSchemaInvalid(\n \"validateCreateClientOptions\",\n \"createClient オプション\",\n result.error.issues,\n );\n }\n return opts;\n}\n\n/**\n * `notionSource({...})` に渡すオプションを zod で検証する。\n * 検証成功時は入力をそのまま返す。\n */\nexport function validateNotionSourceConfig<T>(opts: T): T {\n const result = notionSourceConfigSchema.safeParse(opts);\n if (!result.success) {\n throwSchemaInvalid(\n \"validateNotionSourceConfig\",\n \"notionSource オプション\",\n result.error.issues,\n );\n }\n return opts;\n}\n\n/**\n * `nhc.config.ts` の defineConfig() 戻り値を zod で検証する。\n * 検証成功時は入力をそのまま返す。CLI 内部からも利用される。\n */\nexport function validateCMSConfig<T>(config: T): T {\n const result = cmsConfigSchema.safeParse(config);\n if (!result.success) {\n throwSchemaInvalid(\n \"validateCMSConfig\",\n \"nhc.config.ts の defineConfig() 戻り値\",\n result.error.issues,\n );\n }\n return config;\n}\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@notion-headless-cms/validate",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Optional zod-based validation for @notion-headless-cms — createClient / notionSource / CLI config を実行時検証",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"notion",
|
|
7
|
+
"headless-cms",
|
|
8
|
+
"validation",
|
|
9
|
+
"zod",
|
|
10
|
+
"typescript"
|
|
11
|
+
],
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"homepage": "https://github.com/kjfsm/notion-headless-cms#readme",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/kjfsm/notion-headless-cms/issues"
|
|
16
|
+
},
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/kjfsm/notion-headless-cms.git",
|
|
20
|
+
"directory": "packages/validate"
|
|
21
|
+
},
|
|
22
|
+
"type": "module",
|
|
23
|
+
"sideEffects": false,
|
|
24
|
+
"exports": {
|
|
25
|
+
".": {
|
|
26
|
+
"types": "./dist/index.d.mts",
|
|
27
|
+
"import": "./dist/index.mjs"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist"
|
|
32
|
+
],
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=24"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsdown src/index.ts --format esm --dts --sourcemap --out-dir dist",
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"test": "vitest run",
|
|
40
|
+
"test:coverage": "vitest run --coverage --coverage.reporter=lcov --coverage.reporter=text",
|
|
41
|
+
"publint": "publint --strict",
|
|
42
|
+
"attw": "attw --pack . --profile esm-only"
|
|
43
|
+
},
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public",
|
|
46
|
+
"provenance": true
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@notion-headless-cms/core": "workspace:*",
|
|
50
|
+
"zod": "catalog:"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {}
|
|
53
|
+
}
|