@orizm/cli 3.2.0 → 3.3.0-beta.0

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.
Files changed (69) hide show
  1. package/dist/{agent-Bd30EhQC.mjs → agent-Kf8iuW2I.mjs} +2 -2
  2. package/dist/{agent-Bd30EhQC.mjs.map → agent-Kf8iuW2I.mjs.map} +1 -1
  3. package/dist/{agent-vC2-9rjt.cjs → agent-UZZtdOZS.cjs} +2 -2
  4. package/dist/{agent-vC2-9rjt.cjs.map → agent-UZZtdOZS.cjs.map} +1 -1
  5. package/dist/cli/main.cjs +4 -4
  6. package/dist/cli/main.mjs +4 -4
  7. package/dist/{cms-DLOypcw8.mjs → cms-8XZhxwsM.mjs} +5 -2
  8. package/dist/{cms-DLOypcw8.mjs.map → cms-8XZhxwsM.mjs.map} +1 -1
  9. package/dist/{cms-CId7jg5l.cjs → cms-C4zEtppZ.cjs} +5 -2
  10. package/dist/{cms-CId7jg5l.cjs.map → cms-C4zEtppZ.cjs.map} +1 -1
  11. package/dist/{codegen-kbbIwPbb.cjs → codegen-Cypg4O3L.cjs} +3 -3
  12. package/dist/{codegen-kbbIwPbb.cjs.map → codegen-Cypg4O3L.cjs.map} +1 -1
  13. package/dist/{codegen-BKE_IYoM.mjs → codegen-Dnjv7zfm.mjs} +3 -3
  14. package/dist/{codegen-BKE_IYoM.mjs.map → codegen-Dnjv7zfm.mjs.map} +1 -1
  15. package/dist/config/index.cjs +4 -2
  16. package/dist/config/index.cjs.map +1 -1
  17. package/dist/config/index.d.mts +8 -1
  18. package/dist/config/index.d.mts.map +1 -1
  19. package/dist/config/index.mjs +4 -2
  20. package/dist/config/index.mjs.map +1 -1
  21. package/dist/{config-loader-D8x32gEU.cjs → config-loader-CZfANHBf.cjs} +2 -2
  22. package/dist/config-loader-CZfANHBf.cjs.map +1 -0
  23. package/dist/{config-loader-BEgS869e.mjs → config-loader-CtbZOGjc.mjs} +3 -3
  24. package/dist/config-loader-CtbZOGjc.mjs.map +1 -0
  25. package/dist/{consumer-OG6IEJun.cjs → consumer-BSgriLn0.cjs} +2 -2
  26. package/dist/{consumer-OG6IEJun.cjs.map → consumer-BSgriLn0.cjs.map} +1 -1
  27. package/dist/{consumer-CqyZdG9v.mjs → consumer-s8LnLw4e.mjs} +2 -2
  28. package/dist/{consumer-CqyZdG9v.mjs.map → consumer-s8LnLw4e.mjs.map} +1 -1
  29. package/dist/docs/features/cli/commands/schema.md +3 -2
  30. package/dist/docs/features/cms-sdk/install.md +1 -1
  31. package/dist/docs/features/console/audit-logs.md +3 -0
  32. package/dist/docs/features/consumer-sdk/install.md +1 -1
  33. package/dist/docs/features/dictionary.md +265 -0
  34. package/dist/docs/features/full-text-search.md +50 -0
  35. package/dist/docs/index.md +2 -1
  36. package/dist/docs/manifest.json +3 -3
  37. package/dist/{erd-BNv5Th6z.mjs → erd-BihhEfZ_.mjs} +2 -2
  38. package/dist/{erd-BNv5Th6z.mjs.map → erd-BihhEfZ_.mjs.map} +1 -1
  39. package/dist/{erd-ByuVMQ5n.cjs → erd-DmnB1v2c.cjs} +2 -2
  40. package/dist/{erd-ByuVMQ5n.cjs.map → erd-DmnB1v2c.cjs.map} +1 -1
  41. package/dist/{init-CPfpVlUN.mjs → init-BpKpTQ0z.mjs} +66 -13
  42. package/dist/init-BpKpTQ0z.mjs.map +1 -0
  43. package/dist/{init-NaL2N3Go.cjs → init-BrZCChEG.cjs} +66 -13
  44. package/dist/init-BrZCChEG.cjs.map +1 -0
  45. package/dist/{push-9fPpd4U8.cjs → push-BggkrD0g.cjs} +28 -10
  46. package/dist/push-BggkrD0g.cjs.map +1 -0
  47. package/dist/{push-54rmb0T0.mjs → push-xWnD9oov.mjs} +28 -10
  48. package/dist/push-xWnD9oov.mjs.map +1 -0
  49. package/dist/{run-codegen-mclysZuT.cjs → run-codegen-B-90rvjk.cjs} +2 -2
  50. package/dist/run-codegen-B-90rvjk.cjs.map +1 -0
  51. package/dist/{run-codegen-DjnV60bE.mjs → run-codegen-CrO08jJT.mjs} +2 -2
  52. package/dist/run-codegen-CrO08jJT.mjs.map +1 -0
  53. package/dist/{schema-CNSTXsVa.cjs → schema-CUVTXrHk.cjs} +4 -4
  54. package/dist/{schema-CNSTXsVa.cjs.map → schema-CUVTXrHk.cjs.map} +1 -1
  55. package/dist/{schema-BL6SlLtH.mjs → schema-DlUWHV_t.mjs} +4 -4
  56. package/dist/{schema-BL6SlLtH.mjs.map → schema-DlUWHV_t.mjs.map} +1 -1
  57. package/dist/{validate-BpxZ8LTl.cjs → validate-BH8jqdqq.cjs} +2 -2
  58. package/dist/{validate-BpxZ8LTl.cjs.map → validate-BH8jqdqq.cjs.map} +1 -1
  59. package/dist/{validate-Ca0CRo16.mjs → validate-COS4bfr0.mjs} +2 -2
  60. package/dist/{validate-Ca0CRo16.mjs.map → validate-COS4bfr0.mjs.map} +1 -1
  61. package/package.json +8 -8
  62. package/dist/config-loader-BEgS869e.mjs.map +0 -1
  63. package/dist/config-loader-D8x32gEU.cjs.map +0 -1
  64. package/dist/init-CPfpVlUN.mjs.map +0 -1
  65. package/dist/init-NaL2N3Go.cjs.map +0 -1
  66. package/dist/push-54rmb0T0.mjs.map +0 -1
  67. package/dist/push-9fPpd4U8.cjs.map +0 -1
  68. package/dist/run-codegen-DjnV60bE.mjs.map +0 -1
  69. package/dist/run-codegen-mclysZuT.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"consumer-CqyZdG9v.mjs","names":[],"sources":["../src/cli/codegen/consumer.ts","../src/cli/commands/codegen/consumer.ts"],"sourcesContent":["import { CommonOrizmConfig } from \"../types.js\";\nimport { formatTsWithPrettier } from \"./format.js\";\nimport {\n AUTOGEN_HEADER,\n UTILITIES,\n RenderColumn,\n RenderIndex,\n toCodeTypeName,\n renderColumnField,\n renderTypeBlock,\n renderRefsFieldLines,\n renderUniqueFieldLines,\n renderModuleRowTypeBlock,\n renderModuleDescriptorBlock,\n renderSection,\n renderWebhookTypesSection,\n} from \"./render.js\";\n\ntype RenderTable = {\n name: string;\n columns: RenderColumn[];\n enableForm?: boolean;\n enableDrafts?: boolean;\n indexes?: RenderIndex[];\n};\n\nexport function renderConsumerModule(\n config: CommonOrizmConfig,\n): Promise<string> {\n const tables: RenderTable[] = config.tables;\n const modules = config.tableModules;\n\n const imports = [\n AUTOGEN_HEADER,\n \"\",\n 'import type { FormValidationRules, StorageItemType } from \"@orizm/consumer-sdk/common\";',\n 'import { type ConsumerClientOptions, OrizmConsumerClientBase } from \"@orizm/consumer-sdk\";',\n ].join(\"\\n\");\n\n const types = [\n renderSection(\"Tables\", tables.map(renderTableRowType)),\n modules.map(renderModuleRowTypeBlock).join(\"\\n\\n\"),\n renderSection(\"Descriptor types\", [\n ...tables.map(renderTableDescriptor),\n ...modules.map(renderModuleDescriptorBlock),\n ]),\n renderWebhookTypesSection(tables),\n ]\n .filter(Boolean)\n .join(\"\\n\\n\\n\");\n\n const source = [imports, UTILITIES, types, renderConsumerClient(config)].join(\n \"\\n\\n\\n\",\n );\n\n return formatTsWithPrettier(source);\n}\n\nfunction renderTableRowType(table: RenderTable): string {\n return renderTypeBlock(toCodeTypeName(table.name), [\n \"id: string;\",\n \"createdAt: string;\",\n \"updatedAt: string;\",\n \"group: string | null;\",\n \"publishedAt: string | null;\",\n \"_draft: boolean | null;\",\n \"_published: boolean | null;\",\n ...table.columns.map((col) => renderColumnField(col)),\n ...(table.enableForm ? [\"formSchema: FormValidationRules;\"] : []),\n ]);\n}\n\nfunction renderTableDescriptor(table: RenderTable): string {\n const name = toCodeTypeName(table.name);\n return renderTypeBlock(`${name}__Descriptor`, [\n `row: ${name};`,\n ...renderRefsFieldLines(table.columns),\n ...renderUniqueFieldLines(table),\n ...(table.enableDrafts ? [\"enableDrafts: true;\"] : []),\n ]);\n}\n\nfunction renderConsumerClient(config: CommonOrizmConfig): string {\n const tableEntries = config.tables\n .map(\n (t) =>\n `${t.name}: this.getTableClient<${toCodeTypeName(t.name)}__Descriptor>(\"${t.name}\"),`,\n )\n .join(\"\\n\");\n\n return `export class OrizmClient extends OrizmConsumerClientBase {\n constructor(options: ConsumerClientOptions) {\n super(options);\n }\n\n readonly tables = {\n ${tableEntries}\n };\n}`;\n}\n","import type { ArgsDef } from \"citty\";\nimport { defineCommand } from \"../define-command.js\";\nimport { contextArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { renderConsumerModule } from \"../../codegen/consumer.js\";\nimport { runCodegen } from \"./run-codegen.js\";\n\nconst consumerArgs = {\n ...contextArgs,\n \"config-file\": configFileArg,\n output: {\n type: \"string\",\n alias: \"o\",\n description: \"Output file (.ts) or directory\",\n default: \"./src/orizm\",\n },\n pull: {\n type: \"boolean\",\n description:\n \"Generate from the server's applied definition instead of the local config\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"consumer\",\n description: \"Generate Consumer SDK types from a schema definition\",\n },\n args: consumerArgs,\n run: ({ args }) =>\n runCodegen({\n args,\n pull: args.pull === true,\n configFile: args[\"config-file\"] ?? DEFAULT_CONFIG_FILE,\n output: args.output,\n label: \"Consumer\",\n render: renderConsumerModule,\n }),\n});\n"],"mappings":";;;;;AA0BA,SAAgB,qBACd,QACiB;CACjB,MAAM,SAAwB,OAAO;CACrC,MAAM,UAAU,OAAO;CAyBvB,OAAO,qBAJQ;EAnBC;GACd;GACA;GACA;GACA;EACF,CAAC,CAAC,KAAK,IAce;EAAG;EAZX;GACZ,cAAc,UAAU,OAAO,IAAI,kBAAkB,CAAC;GACtD,QAAQ,IAAI,wBAAwB,CAAC,CAAC,KAAK,MAAM;GACjD,cAAc,oBAAoB,CAChC,GAAG,OAAO,IAAI,qBAAqB,GACnC,GAAG,QAAQ,IAAI,2BAA2B,CAC5C,CAAC;GACD,0BAA0B,MAAM;EAClC,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,QAEgC;EAAG,qBAAqB,MAAM;CAAC,CAAC,CAAC,KACvE,QAG+B,CAAC;AACpC;AAEA,SAAS,mBAAmB,OAA4B;CACtD,OAAO,gBAAgB,eAAe,MAAM,IAAI,GAAG;EACjD;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG,MAAM,QAAQ,KAAK,QAAQ,kBAAkB,GAAG,CAAC;EACpD,GAAI,MAAM,aAAa,CAAC,kCAAkC,IAAI,CAAC;CACjE,CAAC;AACH;AAEA,SAAS,sBAAsB,OAA4B;CACzD,MAAM,OAAO,eAAe,MAAM,IAAI;CACtC,OAAO,gBAAgB,GAAG,KAAK,eAAe;EAC5C,QAAQ,KAAK;EACb,GAAG,qBAAqB,MAAM,OAAO;EACrC,GAAG,uBAAuB,KAAK;EAC/B,GAAI,MAAM,eAAe,CAAC,qBAAqB,IAAI,CAAC;CACtD,CAAC;AACH;AAEA,SAAS,qBAAqB,QAAmC;CAQ/D,OAAO;;;;;;MAPc,OAAO,OACzB,KACE,MACC,GAAG,EAAE,KAAK,wBAAwB,eAAe,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,IACrF,CAAC,CACA,KAAK,IAQO,EAAE;;;AAGnB;;;;AC7FA,MAAM,eAAe;CACnB,GAAG;CACH,eAAe;CACf,QAAQ;EACN,MAAM;EACN,OAAO;EACP,aAAa;EACb,SAAS;CACX;CACA,MAAM;EACJ,MAAM;EACN,aACE;EACF,SAAS;CACX;AACF;AAEA,uBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACN,WAAW;EACT;EACA,MAAM,KAAK,SAAS;EACpB,YAAY,KAAK;EACjB,QAAQ,KAAK;EACb,OAAO;EACP,QAAQ;CACV,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"consumer-s8LnLw4e.mjs","names":[],"sources":["../src/cli/codegen/consumer.ts","../src/cli/commands/codegen/consumer.ts"],"sourcesContent":["import { CommonOrizmConfig } from \"../types.js\";\nimport { formatTsWithPrettier } from \"./format.js\";\nimport {\n AUTOGEN_HEADER,\n UTILITIES,\n RenderColumn,\n RenderIndex,\n toCodeTypeName,\n renderColumnField,\n renderTypeBlock,\n renderRefsFieldLines,\n renderUniqueFieldLines,\n renderModuleRowTypeBlock,\n renderModuleDescriptorBlock,\n renderSection,\n renderWebhookTypesSection,\n} from \"./render.js\";\n\ntype RenderTable = {\n name: string;\n columns: RenderColumn[];\n enableForm?: boolean;\n enableDrafts?: boolean;\n indexes?: RenderIndex[];\n};\n\nexport function renderConsumerModule(\n config: CommonOrizmConfig,\n): Promise<string> {\n const tables: RenderTable[] = config.tables;\n const modules = config.tableModules;\n\n const imports = [\n AUTOGEN_HEADER,\n \"\",\n 'import type { FormValidationRules, StorageItemType } from \"@orizm/consumer-sdk/common\";',\n 'import { type ConsumerClientOptions, OrizmConsumerClientBase } from \"@orizm/consumer-sdk\";',\n ].join(\"\\n\");\n\n const types = [\n renderSection(\"Tables\", tables.map(renderTableRowType)),\n modules.map(renderModuleRowTypeBlock).join(\"\\n\\n\"),\n renderSection(\"Descriptor types\", [\n ...tables.map(renderTableDescriptor),\n ...modules.map(renderModuleDescriptorBlock),\n ]),\n renderWebhookTypesSection(tables),\n ]\n .filter(Boolean)\n .join(\"\\n\\n\\n\");\n\n const source = [imports, UTILITIES, types, renderConsumerClient(config)].join(\n \"\\n\\n\\n\",\n );\n\n return formatTsWithPrettier(source);\n}\n\nfunction renderTableRowType(table: RenderTable): string {\n return renderTypeBlock(toCodeTypeName(table.name), [\n \"id: string;\",\n \"createdAt: string;\",\n \"updatedAt: string;\",\n \"group: string | null;\",\n \"publishedAt: string | null;\",\n \"_draft: boolean | null;\",\n \"_published: boolean | null;\",\n ...table.columns.map((col) => renderColumnField(col)),\n ...(table.enableForm ? [\"formSchema: FormValidationRules;\"] : []),\n ]);\n}\n\nfunction renderTableDescriptor(table: RenderTable): string {\n const name = toCodeTypeName(table.name);\n return renderTypeBlock(`${name}__Descriptor`, [\n `row: ${name};`,\n ...renderRefsFieldLines(table.columns),\n ...renderUniqueFieldLines(table),\n ...(table.enableDrafts ? [\"enableDrafts: true;\"] : []),\n ]);\n}\n\nfunction renderConsumerClient(config: CommonOrizmConfig): string {\n const tableEntries = config.tables\n .map(\n (t) =>\n `${t.name}: this.getTableClient<${toCodeTypeName(t.name)}__Descriptor>(\"${t.name}\"),`,\n )\n .join(\"\\n\");\n\n return `export class OrizmClient extends OrizmConsumerClientBase {\n constructor(options: ConsumerClientOptions) {\n super(options);\n }\n\n readonly tables = {\n ${tableEntries}\n };\n}`;\n}\n","import type { ArgsDef } from \"citty\";\nimport { defineCommand } from \"../define-command.js\";\nimport { contextArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { renderConsumerModule } from \"../../codegen/consumer.js\";\nimport { runCodegen } from \"./run-codegen.js\";\n\nconst consumerArgs = {\n ...contextArgs,\n \"config-file\": configFileArg,\n output: {\n type: \"string\",\n alias: \"o\",\n description: \"Output file (.ts) or directory\",\n default: \"./src/orizm\",\n },\n pull: {\n type: \"boolean\",\n description:\n \"Generate from the server's applied definition instead of the local config\",\n default: false,\n },\n} satisfies ArgsDef;\n\nexport default defineCommand({\n meta: {\n name: \"consumer\",\n description: \"Generate Consumer SDK types from a schema definition\",\n },\n args: consumerArgs,\n run: ({ args }) =>\n runCodegen({\n args,\n pull: args.pull === true,\n configFile: args[\"config-file\"] ?? DEFAULT_CONFIG_FILE,\n output: args.output,\n label: \"Consumer\",\n render: renderConsumerModule,\n }),\n});\n"],"mappings":";;;;;AA0BA,SAAgB,qBACd,QACiB;CACjB,MAAM,SAAwB,OAAO;CACrC,MAAM,UAAU,OAAO;CAyBvB,OAAO,qBAJQ;EAnBC;GACd;GACA;GACA;GACA;EACF,CAAC,CAAC,KAAK,IAce;EAAG;EAZX;GACZ,cAAc,UAAU,OAAO,IAAI,kBAAkB,CAAC;GACtD,QAAQ,IAAI,wBAAwB,CAAC,CAAC,KAAK,MAAM;GACjD,cAAc,oBAAoB,CAChC,GAAG,OAAO,IAAI,qBAAqB,GACnC,GAAG,QAAQ,IAAI,2BAA2B,CAC5C,CAAC;GACD,0BAA0B,MAAM;EAClC,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,QAEgC;EAAG,qBAAqB,MAAM;CAAC,CAAC,CAAC,KACvE,QAG+B,CAAC;AACpC;AAEA,SAAS,mBAAmB,OAA4B;CACtD,OAAO,gBAAgB,eAAe,MAAM,IAAI,GAAG;EACjD;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG,MAAM,QAAQ,KAAK,QAAQ,kBAAkB,GAAG,CAAC;EACpD,GAAI,MAAM,aAAa,CAAC,kCAAkC,IAAI,CAAC;CACjE,CAAC;AACH;AAEA,SAAS,sBAAsB,OAA4B;CACzD,MAAM,OAAO,eAAe,MAAM,IAAI;CACtC,OAAO,gBAAgB,GAAG,KAAK,eAAe;EAC5C,QAAQ,KAAK;EACb,GAAG,qBAAqB,MAAM,OAAO;EACrC,GAAG,uBAAuB,KAAK;EAC/B,GAAI,MAAM,eAAe,CAAC,qBAAqB,IAAI,CAAC;CACtD,CAAC;AACH;AAEA,SAAS,qBAAqB,QAAmC;CAQ/D,OAAO;;;;;;MAPc,OAAO,OACzB,KACE,MACC,GAAG,EAAE,KAAK,wBAAwB,eAAe,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,IACrF,CAAC,CACA,KAAK,IAQO,EAAE;;;AAGnB;;;;AC7FA,MAAM,eAAe;CACnB,GAAG;CACH,eAAe;CACf,QAAQ;EACN,MAAM;EACN,OAAO;EACP,aAAa;EACb,SAAS;CACX;CACA,MAAM;EACJ,MAAM;EACN,aACE;EACF,SAAS;CACX;AACF;AAEA,uBAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;CACN,MAAM,EAAE,WACN,WAAW;EACT;EACA,MAAM,KAAK,SAAS;EACpB,YAAY,KAAK;EACjB,QAAQ,KAAK;EACb,OAAO;EACP,QAAQ;CACV,CAAC;AACL,CAAC"}
@@ -12,7 +12,7 @@
12
12
  `orizm.config.ts` を読み込んで、スキーマをプロジェクトに適用します。
13
13
 
14
14
  ```sh copy
15
- orizm schema push [<config-file>] [--dry-run] [--yes]
15
+ orizm schema push [<config-file>] [--dry-run] [--yes] [--force]
16
16
  ```
17
17
 
18
18
  **引数**
@@ -27,8 +27,9 @@ orizm schema push [<config-file>] [--dry-run] [--yes]
27
27
  | --- | --- |
28
28
  | `--dry-run` | 適用せず、変更内容だけを表示します。 |
29
29
  | `--yes` | 確認プロンプトをスキップして適用します(CI 向け)。 |
30
+ | `--force` | 変更が無くても定義を送り、サーバー側の突き合わせ(セマンティック検索のベクトルインデックスの再構築など)を再実行させます。`--dry-run` には影響しません。 |
30
31
 
31
- 適用前には変更内容が表示されます。`--dry-run` でも `--yes` でもないときは、ターミナルで確認プロンプトを出し、承認したときだけ適用します。非対話環境では `--yes` が必要です。変更が無いときは何もしません。
32
+ 適用前には変更内容が表示されます。`--dry-run` でも `--yes` でもないときは、ターミナルで確認プロンプトを出し、承認したときだけ適用します。非対話環境では `--yes` が必要です。変更が無いときは `--force` を付けない限り何もしません。
32
33
 
33
34
  ```sh copy
34
35
  # 変更内容を確認する
@@ -3,7 +3,7 @@
3
3
  # CMS SDKのインストール
4
4
 
5
5
  > [!NOTE]
6
- > このドキュメントは `@orizm/cms-sdk` の **v2.5.0**
6
+ > このドキュメントは `@orizm/cms-sdk` の **v2.6.0-beta.0**
7
7
  > に対応しています。プロジェクトにインストールされているバージョンが異なる場合、記載内容と実際の挙動が一致しないことがあります。
8
8
 
9
9
  CMS SDKは、OrizmのCMS機能をWebサイトに組み込むためのJavaScriptライブラリです。このガイドでは、インストール手順とクライアントセットアップの方法を説明します。
@@ -41,6 +41,9 @@
41
41
  | bucket.update | バケットオブジェクト更新 |
42
42
  | bucket.delete | バケットオブジェクト削除 |
43
43
  | storageItem.upload | ファイルアップロード |
44
+ | dictionary.add | 検索辞書エントリ登録 |
45
+ | dictionary.update | 検索辞書エントリ更新 |
46
+ | dictionary.delete | 検索辞書エントリ削除 |
44
47
  | otpChallenge.success | ワンタイムパスワード・challenge 成功 |
45
48
  | otpChallenge.tooManyAttempts | ワンタイムパスワード・challenge 試行回数が多すぎる |
46
49
  | otpChallenge.invalid | ワンタイムパスワード・challenge OTPが無効な状態でAPIコール |
@@ -3,7 +3,7 @@
3
3
  # Consumer SDKのインストール
4
4
 
5
5
  > [!NOTE]
6
- > このドキュメントは `@orizm/consumer-sdk` の **v2.5.0**
6
+ > このドキュメントは `@orizm/consumer-sdk` の **v2.6.0-beta.0**
7
7
  > に対応しています。プロジェクトにインストールされているバージョンが異なる場合、記載内容と実際の挙動が一致しないことがあります。
8
8
 
9
9
  Consumer SDKはOrizmのデータにアクセスするためのJavaScriptライブラリです。WebサイトやアプリケーションからOrizmのコンテンツを取得する際に使用します。
@@ -0,0 +1,265 @@
1
+ <!-- source: docs/src/app/features/dictionary/page.mdx -->
2
+
3
+ # 検索辞書
4
+
5
+ 検索辞書を使用すると、社内の俗称や型番の表記ゆれを検索に教え込めます。開発コード「マニ丸」で検索した人に正式名称「全熱交換型換気システム」の記事を返す、といった言い換えを、コンテンツ本文を書き換えずに実現できます。
6
+
7
+ 検索辞書は以下の機能を提供します。
8
+
9
+ - 同義語による検索クエリの言い換え(表記ゆれ・俗称の吸収)
10
+ - 用語そのものの解説を検索結果に返す
11
+ - プロジェクト全体に効く語彙管理(テーブルごとの設定は不要)
12
+ - エントリを削除せずに一時的に無効化
13
+
14
+ > [!WARNING]
15
+ > 検索辞書が検索に効くのは [セマンティック検索](./full-text-search.md)
16
+ > を有効にしたプロジェクトで、`mode` に `semantic` または `hybrid`
17
+ > を指定した検索だけです。`mode` を省略した検索(`keyword`)には効きません。
18
+ >
19
+ > セマンティック検索が利用できるかどうかは、プロジェクトの設定に加えてシステム側の設定でも決まります。システム側で有効になっていない環境では、辞書の登録・更新は成功しても検索には反映されません(`semantic` / `hybrid` がエラーになるか、`keyword` と同じ結果に劣化して返ります)。利用中の環境で使えるかは管理者に確認してください。
20
+ >
21
+
22
+ ## ユースケース例
23
+
24
+ ### 社内の俗称・略称で検索できるようにする
25
+
26
+ 製品名や部署名には、正式名称のほかに現場でしか使われない呼び方があります。検索辞書に正式名称を見出し語、俗称を同義語として登録しておくと、どちらで検索しても同じコンテンツに当たります。コンテンツ側に俗称を書き足す必要はありません。
27
+
28
+ ### 型番の表記ゆれを吸収する
29
+
30
+ `ORZ-1200X` のような型番は、全角で入力される・ハイフンが別の記号になるといった揺れが生まれます。この種の違いは [正規化](#表記の同一視) で自動的に吸収されますが、`ORZ 1200X` のように語の途中に空白が入る表記や、`オリズム1200` のようにまったく別の呼び方は吸収されないため、同義語として登録します。
31
+
32
+ ### 用語集として検索結果に出す
33
+
34
+ 説明を付けて登録したエントリは、それ自体が検索対象になります。編集者が社内用語で検索したときに、コンテンツの一覧と一緒に用語の解説を出せます。
35
+
36
+ ## 前提
37
+
38
+ 検索辞書そのものはプロジェクト単位の語彙で、辞書を登録するためのテーブルごとの設定はありません。ただし辞書が効くのは `semantic` / `hybrid` で検索できるテーブルに対してだけです。`orizm.config.ts` にプロジェクトの `semanticSearch` を宣言し、検索したいテーブルに `enableSearch: true` を付けて `orizm schema push` してください。
39
+
40
+ ```ts copy filename="orizm.config.ts" showLineNumbers {4,8}
41
+ import { defineConfig } from "@orizm/cli/config";
42
+
43
+ export default defineConfig({
44
+ semanticSearch: { enabled: true },
45
+ tables: {
46
+ blog: {
47
+ columns: {},
48
+ enableSearch: true,
49
+ },
50
+ },
51
+ });
52
+ ```
53
+
54
+ > [!NOTE]
55
+ > 検索辞書の操作は CMS SDK(および Management API)で行います。Orizm Console /
56
+ > Project Console には検索辞書の画面はありません。
57
+
58
+ ## 2つの効き方
59
+
60
+ 検索辞書は 2 つの経路で検索に作用します。エントリの内容によって、どちらが効くかが変わります。
61
+
62
+ | 経路 | 効く条件 | 反映タイミング |
63
+ | ---------------------------- | --------------------------------------------------------- | -------------- |
64
+ | 同義語によるクエリの言い換え | `hybrid` 検索。同義語が 1 つ以上あるエントリ | 即時 |
65
+ | 用語解説を検索結果に返す | CMS SDK の `semantic` / `hybrid` 検索。説明があるエントリ | 非同期 |
66
+
67
+ どちらも `enabled: false` のエントリには効きません。
68
+
69
+ ### 同義語によるクエリの言い換え
70
+
71
+ `hybrid` で検索すると、クエリの中に辞書の表記が含まれていた場合に、それを同じエントリの別表記へ置き換えた「変種クエリ」が検索に足されます。置き換えは見出し語と同義語の双方向で、見出し語で検索すれば各同義語に、同義語で検索すれば見出し語と他の同義語に置き換わります。
72
+
73
+ 例えば見出し語 `ORZ-1200X`、同義語 `オリズム1200` / `1200X` のエントリがある場合、`オリズム1200 の仕様` というクエリからは `orz-1200x の仕様` と `1200x の仕様` が足されます。
74
+
75
+ 元のクエリは必ず検索対象として残るので、辞書を登録して検索に一致しなくなるコンテンツはありません。ただし順位は変わります。`hybrid` は上位 100 件までの窓で順位を融合して返すため、言い換えで新たに一致したコンテンツが加わるとその分だけ既存のヒットの順位が下がり、一致の多いクエリでは窓から外れて表示されなくなることがあります。
76
+
77
+ この経路は Consumer SDK の `hybrid` 検索でも同じように効きます。ただしどのエントリが効いたのかは検索結果に現れません。
78
+
79
+ ベクトル検索側の障害やシステム側の停止でキーワード検索に劣化したリクエストでは、言い換えも効きません(劣化した応答は `keyword` で検索したときと同じ結果になります)。
80
+
81
+ > [!NOTE]
82
+ > 照合はクエリ文字列に対する部分一致で、単語の区切りは見ません。短い表記を登録すると、それを含む別の語にも言い換えが起きます。
83
+ >
84
+ > 1 つの変種クエリで置き換えるのは 1 エントリの 1 表記だけです。クエリの中の 2
85
+ > 語がどちらも別表記で書かれているコンテンツは拾えないことがあります。
86
+ >
87
+ > 1 回の検索で足される変種クエリは最大 20 件です。また言い換えに使われるのは、同義語を持つ有効なエントリのうち登録が古い順に
88
+ > 5,000 件までで、これを超える分は効きません(説明だけのエントリはこの数に含まれません)。
89
+ >
90
+
91
+ ### 用語解説を検索結果に返す
92
+
93
+ 説明(`description`)を付けたエントリは、それ自体が検索対象になります。CMS SDK で `semantic` または `hybrid` の検索をすると、検索結果に `_dictionary` が付き、クエリに近いものから最大 3 件の用語解説が返ります。
94
+
95
+ ```ts copy
96
+ const result = await cmsClient.tables.blog.search({
97
+ query: "熱を回収する換気",
98
+ mode: "hybrid",
99
+ });
100
+
101
+ console.log(result.contents); // コンテンツのヒット
102
+ console.log(result._dictionary); // 辞書のヒット(最大 3 件)
103
+ ```
104
+
105
+ `_dictionary` の各要素は以下のフィールドを持ちます。
106
+
107
+ | フィールド | 説明 |
108
+ | ------------- | --------------------------------------------------------------------------------------------------------------- |
109
+ | `id` | エントリの ID。`get()` / `update()` / `delete()` にそのまま渡せます |
110
+ | `term` | 見出し語(登録した表記のまま) |
111
+ | `description` | 説明 |
112
+ | `score` | クエリと、見出し語・同義語・説明をつないだ文章との近さ。行の `_semantic.score` とは尺度が違うため比較できません |
113
+
114
+ 照合に使われるのは説明だけではありません。見出し語と同義語も同じ文章に含めて突き合わせるため、説明に俗称を書かなくても、俗称で検索したときに当たりやすくなります。
115
+
116
+ 辞書のヒットは `contents` とは別の枠で返り、`totalCount` にも含まれません。ページングもせず、`offset` を動かしても同じ内容が返ります。
117
+
118
+ 辞書のヒットには近さの下限がありません。説明付きの有効なエントリが 3 件以上あるプロジェクトでは、辞書と関係の薄いクエリでも近い順に 3 件が埋まります。そのまま画面に出すと常に 3 件並ぶので、出すかどうかは `score` を見て呼び出し側で決めてください(`score` の目安になる値は埋め込みモデルによって変わるため、決め打ちのしきい値は用意していません)。
119
+
120
+ `_dictionary` は状態によって 3 通りになります。
121
+
122
+ - **キーが無い**: `keyword` 検索、キーワード検索への劣化時、有効な説明付きのエントリが 1 つも無いプロジェクト(反映待ちの間を含む)、辞書の検索が一時的に失敗したとき
123
+ - **空配列**: 辞書は引けたが返せるエントリが無かった(通常は起きません)
124
+ - **配列**: ヒットあり
125
+
126
+ キーの有無は設定だけで決まるものではないため、`_dictionary` は常に省略され得るものとして扱ってください。
127
+
128
+ > [!WARNING]
129
+ > 辞書のヒットにはグループによる権限のフィルタが掛かりません。特定のグループにだけ見せたい情報は説明に書かないでください。
130
+ >
131
+ > Consumer SDK の検索には `_dictionary`
132
+ > は付きません。辞書エントリには公開・下書きの区別が無いためです。
133
+ >
134
+
135
+ ## 表記の同一視
136
+
137
+ エントリは見出し語を正規化した値で識別されます。表記が違っても正規化後に同じなら同じエントリで、検索時の照合にも同じ正規化が使われます。
138
+
139
+ 以下の違いは同じ語として扱われます。
140
+
141
+ - 全角と半角(`ORZ-1200X` = `orz-1200x`)
142
+ - 大文字と小文字
143
+ - 半角カナと全角カナ(`オリズム` = `オリズム`)
144
+ - ハイフン・マイナス・ダッシュ類(`ORZ‐1200X` = `ORZ−1200X` = `orz-1200x`)
145
+ - 前後の空白、連続する空白、全角空白
146
+ - 貼り付けで紛れ込む不可視文字(ゼロ幅スペースなど)
147
+
148
+ 長音記号 `ー` はハイフンに畳まないため、`コーヒー` と `コ-ヒ-` は別の語です。
149
+
150
+ 見出し語と同義語は入力した表記のまま保存・返却され、正規化した値は検索の照合にだけ使われます。なお同義語のうち、正規化すると見出し語と同じになるもの・先に指定した同義語と同じになるものは、登録時に取り除かれます。
151
+
152
+ ## 使い方
153
+
154
+ CMS SDK の `cmsClient.dictionary` から操作します。テーブルの配下ではなくクライアント直下にあります。
155
+
156
+ 辞書の登録・更新・削除には、プロジェクト内のいずれかのテーブルへの書き込み権限が必要です([権限](./schema/authority.md) でどのテーブルにも書けないロールでは 403 になります)。一覧・取得は認証だけで行えます。
157
+
158
+ ### エントリの登録
159
+
160
+ `add()` に登録したいエントリの配列を渡します。1 回のリクエストで複数のエントリを登録できます。
161
+
162
+ ```ts copy
163
+ await cmsClient.dictionary.add([
164
+ {
165
+ term: "全熱交換型換気システム",
166
+ synonyms: ["マニ丸", "ロスナイ式"],
167
+ description: "熱交換素子で温度と湿度を回収しながら換気する第一種換気設備。",
168
+ },
169
+ ]);
170
+ ```
171
+
172
+ `description` と `synonyms` は省略できます。`enabled` を `false` にすると、登録はしても検索には効かない状態で作れます(既定は `true`)。
173
+
174
+ > [!WARNING]
175
+ > `add()` は、正規化した見出し語が既存のエントリと一致した場合そのエントリを**丸ごと置き換えます**。渡さなかったフィールドは前の値のままにはならず、初期値に戻ります(`synonyms`
176
+ > は `[]`、`description` は `null`、`enabled` は `true`)。
177
+ >
178
+ > 一部のフィールドだけを変えたいときは [`update()`](#エントリの部分更新)
179
+ > を使ってください。
180
+ >
181
+ > 置き換えになるので、同じ一覧を投入し直しても重複したエントリは作られません。ID
182
+ > も変わらないので、`_dictionary` などで受け取った ID
183
+ > は投入し直したあとも使えます。一方、1 回のリクエストに同じ見出し語を 2
184
+ > つ入れることはできません(エラーになります)。
185
+ >
186
+
187
+ ### エントリの一覧取得
188
+
189
+ `list()` でエントリの一覧を取得します。登録が古い順に返り、`enabled: false` のエントリも含まれます。
190
+
191
+ ```ts copy
192
+ const { contents, totalCount } = await cmsClient.dictionary.list();
193
+ ```
194
+
195
+ `query` で絞り込み、`limit` と `offset` でページングできます。
196
+
197
+ ```ts copy
198
+ await cmsClient.dictionary.list({ query: "換気", limit: 50, offset: 0 });
199
+ ```
200
+
201
+ `query` の当たり方は見出し語と同義語で違います。見出し語は部分一致、同義語は完全一致です。どちらも正規化して突き合わせるので、半角で登録した語を全角で検索できます。正規化して空になる値(空白のみなど)は未指定と同じ扱いで、絞り込みません。
202
+
203
+ `limit` を指定しない場合は 100 件まで取得されます。
204
+
205
+ ### エントリの取得
206
+
207
+ `get()` に ID を渡して 1 件を取得します。
208
+
209
+ ```ts copy
210
+ const entry = await cmsClient.dictionary.get(entryId);
211
+ ```
212
+
213
+ ### エントリの部分更新
214
+
215
+ `update()` は渡したフィールドだけを変更します。渡さなかったフィールドは変わりません。
216
+
217
+ ```ts copy
218
+ await cmsClient.dictionary.update(entryId, { synonyms: ["マニ丸", "1200X"] });
219
+ ```
220
+
221
+ `description` に `null` を渡すと説明を消せます。説明が無くなったエントリは検索結果に返らなくなりますが、同義語による言い換えは引き続き効きます。
222
+
223
+ ```ts copy
224
+ await cmsClient.dictionary.update(entryId, { description: null });
225
+ ```
226
+
227
+ 一時的に効果を止めたいときは `enabled` を `false` にします。削除せずに両方の経路を止められます。
228
+
229
+ ```ts copy
230
+ await cmsClient.dictionary.update(entryId, { enabled: false });
231
+ ```
232
+
233
+ `term` を変えると、エントリを識別する値も一緒に変わります。変更後の表記が既にある別のエントリと同じになる場合はエラーになります。このとき同義語も組み直されるため、新しい見出し語と同じになる同義語は(`synonyms` を渡していなくても)取り除かれます。
234
+
235
+ ### エントリの削除
236
+
237
+ `delete()` に ID を渡します。
238
+
239
+ ```ts copy
240
+ await cmsClient.dictionary.delete(entryId);
241
+ ```
242
+
243
+ ## 検索への反映タイミング
244
+
245
+ 同義語による言い換えは、登録・更新した直後の検索から効きます。
246
+
247
+ 用語解説の検索対象化(`_dictionary`)は非同期です。エントリを変更すると裏で辞書の索引が作り直され、それが終わってから検索結果に現れます。所要時間は説明付きのエントリの件数によって変わります。無効化・削除で検索結果から消える場合も同じ経路を通ります。
248
+
249
+ 説明付きの有効なエントリが 1 つも無くなると辞書の索引自体が削除され、以降の検索では `_dictionary` が付かなくなります。
250
+
251
+ ## 上限値
252
+
253
+ | 対象 | 上限 |
254
+ | ------------------------------------- | ------------------ |
255
+ | 1 回の `add()` で登録できるエントリ数 | 500 件(1 件以上) |
256
+ | 見出し語・同義語 1 つあたりの文字数 | 200 文字 |
257
+ | 1 エントリの同義語の数 | 50 個 |
258
+ | 説明の文字数 | 2000 文字 |
259
+ | `list()` の `limit` | 500(既定 100) |
260
+
261
+ 見出し語・同義語・説明には制御文字を含められません(タブ・改行・復帰は除きます。説明は複数行で登録できます。見出し語・同義語では空白に畳まれます)。また空白だけの見出し語・同義語・説明は登録できません。
262
+
263
+ ## 監査ログ
264
+
265
+ エントリの登録・更新・削除は [監査ログ](./console/audit-logs.md) に記録されます。
@@ -62,3 +62,53 @@ await cmsClient.tables.blog.search({ query: "キーワード1 キーワード2"
62
62
 
63
63
  - **Consumer SDK**: 公開データのみ検索可能
64
64
  - **CMS SDK**: 下書きデータも検索可能(主にCMS上での管理用途)
65
+
66
+ ## 検索モード(セマンティック検索)
67
+
68
+ `search()` の `mode` パラメータで検索方式を選択できます。
69
+
70
+ | mode | 説明 |
71
+ | ----------------- | ----------------------------------------------------------------- |
72
+ | `keyword`(既定) | 従来の全文検索。`mode` を省略した場合もこの方式です |
73
+ | `semantic` | 意味検索。クエリとコンテンツの埋め込みベクトルの近さで検索します |
74
+ | `hybrid` | keyword と semantic の融合(RRF)。字面一致と意味の両方を拾います |
75
+
76
+ ```ts copy
77
+ await cmsClient.tables.blog.search({ query: "経費の精算", mode: "hybrid" });
78
+ ```
79
+
80
+ `semantic` / `hybrid` はプロジェクトでセマンティック検索が有効な場合のみ利用できます(無効なプロジェクトではエラーになります)。有効化は `orizm.config.ts` に `semanticSearch: { enabled: true }` を宣言して `orizm schema push` で反映します(無効に戻すときは `enabled: false` を明示します。宣言を省略した定義は現状維持です)。有効化の直後はベクトルインデックスの構築が完了するまで `semantic` / `hybrid` が 403 になります(構築が終わり次第利用できます)。`semantic` / `hybrid` で検索した場合は、検索結果の各行に `_semantic`(スコア・ヒットに寄与したチャンク・レーン別順位)が付与されます(`keyword` では付きません)。
81
+
82
+ > [!WARNING]
83
+ > セマンティック検索を利用できるかどうかは、プロジェクトの設定に加えてシステム側の設定でも決まります。システム側で有効になっていない環境では、`semanticSearch: { enabled: true }` の push は成功しますが `semantic` / `hybrid` の検索は利用できません(ベクトルインデックスが作られていない場合は 403 になり、過去に作られたインデックスが残っている場合は `keyword` の結果に劣化します)。利用中の環境で使えるかは管理者に確認してください。
84
+
85
+ CMS SDK の `semantic` / `hybrid` では、プロジェクトの [検索辞書](./dictionary.md) に説明を付けた有効なエントリがあれば、検索結果に辞書のヒット(`_dictionary`)も付与されます(説明付きのエントリが無いプロジェクトではキー自体が付きません)。検索辞書に同義語を登録しておくと、`hybrid` の検索クエリに表記の言い換えが足され、社内の俗称や型番の表記ゆれでも目的のコンテンツに当たるようになります。
86
+
87
+ フォーム投稿(submissions)の検索は `keyword` のみ対応です(`semantic` / `hybrid` を指定すると 403 になります)。
88
+
89
+ ページングの制約は mode ごとに異なります(超過はいずれも 400 になります)。
90
+
91
+ | mode | `offset + limit` | `limit: 0`(件数だけ取る) |
92
+ | ---------- | ---------------- | -------------------------------- |
93
+ | `keyword` | 10000 まで | 使えます(正確な件数が返ります) |
94
+ | `semantic` | 100 まで | 使えません |
95
+ | `hybrid` | 100 まで | 使えません |
96
+
97
+ `semantic` / `hybrid` の上限が小さいのは、`semantic` では近傍探索(ANN)の候補プールが深い窓を安定して裏付けられない(加えて窓の各行にチャンク本文を付けて返す)ため、`hybrid` では融合(RRF)が固定ランク窓の中でだけページ間の順序を安定して定義できるためです。深いページングや件数だけの取得が必要な場合は `keyword` を使ってください。`limit` / `offset` は mode を問わず整数かつ 0 以上のみ受け付けます。
98
+
99
+ `query` は mode を問わず 512 文字までです(超過は 400 になります)。空文字や空白だけの `query` は検索せず、0 件(`contents: []`, `totalCount: 0`)を返します。
100
+
101
+ > [!WARNING]
102
+ > `semantic` / `hybrid` の `totalCount`
103
+ > は正確な件数ではなく、**ページ数の計算には使えません**。 `semantic` の
104
+ > `totalCount` は近傍探索(ANN)の候補プールの大きさで、`offset + limit`
105
+ > に応じて増えます(ページを進めるほど値が大きくなります)。該当するコンテンツが無いクエリでも
106
+ > 0 にはなりません(ANN は常に最も近いものを返すため)。`hybrid` の `totalCount`
107
+ > は下界(2 レーンの大きい方。返した行数を下回ることはありません)です。`limit:
108
+ > 0` が `keyword` 専用なのも同じ理由です。正確な件数やページ数が必要な場合は
109
+ > `keyword` を使ってください。
110
+
111
+ > [!NOTE]
112
+ > 埋め込み基盤の一時的な障害時は、検索を失敗させる代わりに `keyword`
113
+ > の結果に劣化して応答します(このとき `_semantic` と `_dictionary`
114
+ > は付かず、`hybrid` で効いていた検索辞書によるクエリの言い換えも外れます)。
@@ -1,4 +1,4 @@
1
- # Orizm docs (v3.2.0)
1
+ # Orizm docs (v3.3.0-beta.0)
2
2
 
3
3
  Bundled Orizm docs, version-matched to the installed `@orizm/cli`.
4
4
  Read the relevant page before generating Orizm code. Files are relative to this directory.
@@ -54,6 +54,7 @@ Starter Kit v2: edit only `apps/cms`, `apps/consumer`, `packages/design-editor`.
54
54
  - [インストール](./features/design-editor/install.md)
55
55
  - [プロパティエディター](./features/design-editor/prop-editor.md)
56
56
  - [スキーマ定義ガイド](./features/design-editor/schema.md)
57
+ - [検索辞書](./features/dictionary.md)
57
58
  - [下書き管理](./features/draft.md)
58
59
  - [フォーム管理の概要](./features/form/about.md)
59
60
  - [フォームエディター](./features/form/editor.md)
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "3.2.0",
3
- "generatedAt": "2026-08-27T09:52:39.664Z",
4
- "pages": 69,
2
+ "version": "3.3.0-beta.0",
3
+ "generatedAt": "2026-09-10T05:03:49.643Z",
4
+ "pages": 70,
5
5
  "source": "orizm-docs"
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { t as defineCommand } from "./cli/main.mjs";
2
2
  import { i as globalArgs, n as configFileArg, t as DEFAULT_CONFIG_FILE } from "./shared-CZZimGxc.mjs";
3
- import { n as configLoadFailure, t as loadConfig } from "./config-loader-BEgS869e.mjs";
3
+ import { n as configLoadFailure, t as loadConfig } from "./config-loader-CtbZOGjc.mjs";
4
4
  import { Result } from "@praha/byethrow";
5
5
  import path from "node:path";
6
6
  import { mkdir, writeFile } from "node:fs/promises";
@@ -120,4 +120,4 @@ var erd_default = defineCommand({
120
120
 
121
121
  //#endregion
122
122
  export { erd_default as default };
123
- //# sourceMappingURL=erd-BNv5Th6z.mjs.map
123
+ //# sourceMappingURL=erd-BihhEfZ_.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"erd-BNv5Th6z.mjs","names":[],"sources":["../src/cli/erd.ts","../src/cli/commands/schema/erd.ts"],"sourcesContent":["import { CommonOrizmConfig } from \"./types.js\";\n\ntype TableInput = {\n name: string;\n columns: ColumnInput[];\n};\n\ntype ColumnInput = {\n name: string;\n type: string;\n isForeignKey: boolean;\n};\n\ntype RelationInput = {\n from: string;\n to: string;\n type: string;\n comment: string;\n};\n\ntype TemplateInput = {\n tables: TableInput[];\n relations: RelationInput[];\n};\n\nconst RELATION = {\n ONE_TO_MANY: \"||--o{\",\n ONE_TO_ONE: \"||--||\",\n} as const;\n\nfunction convertToInput(config: CommonOrizmConfig): TemplateInput {\n const tables: TableInput[] = [];\n const relations: RelationInput[] = [];\n\n for (const table of config.tables) {\n const modules: TableInput[] = [];\n const erdTable: TableInput = { name: table.name, columns: [] };\n\n for (const column of table.columns) {\n erdTable.columns.push({\n name: column.name,\n type: column.type,\n isForeignKey: column.type === \"reference\",\n });\n\n if (column.type === \"reference\") {\n relations.push({\n from: column.tableName,\n to: table.name,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n\n if (column.type === \"module\" || column.type === \"module-array\") {\n const module = config.tableModules.find(\n (m) => m.name === column.moduleName,\n );\n if (!module) {\n continue;\n }\n\n const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;\n modules.push({\n name: moduleTableName,\n columns: module.columns.map((c) => ({\n name: c.name,\n type: c.type,\n isForeignKey: c.type === \"reference\",\n })),\n });\n\n relations.push({\n from: table.name,\n to: moduleTableName,\n type:\n column.type === \"module\"\n ? RELATION.ONE_TO_ONE\n : RELATION.ONE_TO_MANY,\n comment: column.type === \"module\" ? \"module\" : \"module-array\",\n });\n\n for (const moduleColumn of module.columns) {\n if (moduleColumn.type === \"reference\") {\n relations.push({\n from: moduleTableName,\n to: moduleColumn.tableName,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n }\n }\n }\n\n tables.push(erdTable);\n tables.push(...modules);\n }\n\n return { tables, relations };\n}\n\nfunction renderMermaid(input: TemplateInput): string {\n const tables = input.tables\n .map((table) => {\n const columns = [\n \" id string PK\",\n ...table.columns.map(\n (col) =>\n ` ${col.name} ${col.type}${col.isForeignKey ? \" FK\" : \"\"}`,\n ),\n ].join(\"\\n\");\n return ` ${table.name} {\\n${columns}\\n }`;\n })\n .join(\"\\n\");\n\n const relations = input.relations\n .map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`)\n .join(\"\\n\");\n\n return `generated by @orizm/cli\n\n\\`\\`\\`mermaid\nerDiagram\n${tables}\n\n${relations}\n\\`\\`\\``;\n}\n\nexport function generateErd(config: CommonOrizmConfig): string {\n return renderMermaid(convertToInput(config));\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { generateErd } from \"../../erd.js\";\n\nexport default defineCommand({\n meta: {\n name: \"erd\",\n description: \"Generate an ERD in Mermaid format from orizm.config.ts\",\n },\n args: {\n ...globalArgs,\n \"config-file\": configFileArg,\n output: {\n type: \"string\",\n alias: \"o\",\n description: \"Output file path (defaults to stdout)\",\n },\n },\n run: async ({ args }) => {\n const loaded = await loadConfig(args[\"config-file\"] ?? DEFAULT_CONFIG_FILE);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n const mermaid = generateErd(loaded.value);\n\n if (args.output != null && args.output !== \"\") {\n const output = args.output;\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, mermaid + \"\\n\", \"utf-8\");\n return Result.succeed({\n json: { output },\n text: () => `ERD written to ${output}`,\n });\n }\n\n return Result.succeed({ json: { erd: mermaid }, text: () => mermaid });\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"erd-BihhEfZ_.mjs","names":[],"sources":["../src/cli/erd.ts","../src/cli/commands/schema/erd.ts"],"sourcesContent":["import { CommonOrizmConfig } from \"./types.js\";\n\ntype TableInput = {\n name: string;\n columns: ColumnInput[];\n};\n\ntype ColumnInput = {\n name: string;\n type: string;\n isForeignKey: boolean;\n};\n\ntype RelationInput = {\n from: string;\n to: string;\n type: string;\n comment: string;\n};\n\ntype TemplateInput = {\n tables: TableInput[];\n relations: RelationInput[];\n};\n\nconst RELATION = {\n ONE_TO_MANY: \"||--o{\",\n ONE_TO_ONE: \"||--||\",\n} as const;\n\nfunction convertToInput(config: CommonOrizmConfig): TemplateInput {\n const tables: TableInput[] = [];\n const relations: RelationInput[] = [];\n\n for (const table of config.tables) {\n const modules: TableInput[] = [];\n const erdTable: TableInput = { name: table.name, columns: [] };\n\n for (const column of table.columns) {\n erdTable.columns.push({\n name: column.name,\n type: column.type,\n isForeignKey: column.type === \"reference\",\n });\n\n if (column.type === \"reference\") {\n relations.push({\n from: column.tableName,\n to: table.name,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n\n if (column.type === \"module\" || column.type === \"module-array\") {\n const module = config.tableModules.find(\n (m) => m.name === column.moduleName,\n );\n if (!module) {\n continue;\n }\n\n const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;\n modules.push({\n name: moduleTableName,\n columns: module.columns.map((c) => ({\n name: c.name,\n type: c.type,\n isForeignKey: c.type === \"reference\",\n })),\n });\n\n relations.push({\n from: table.name,\n to: moduleTableName,\n type:\n column.type === \"module\"\n ? RELATION.ONE_TO_ONE\n : RELATION.ONE_TO_MANY,\n comment: column.type === \"module\" ? \"module\" : \"module-array\",\n });\n\n for (const moduleColumn of module.columns) {\n if (moduleColumn.type === \"reference\") {\n relations.push({\n from: moduleTableName,\n to: moduleColumn.tableName,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n }\n }\n }\n\n tables.push(erdTable);\n tables.push(...modules);\n }\n\n return { tables, relations };\n}\n\nfunction renderMermaid(input: TemplateInput): string {\n const tables = input.tables\n .map((table) => {\n const columns = [\n \" id string PK\",\n ...table.columns.map(\n (col) =>\n ` ${col.name} ${col.type}${col.isForeignKey ? \" FK\" : \"\"}`,\n ),\n ].join(\"\\n\");\n return ` ${table.name} {\\n${columns}\\n }`;\n })\n .join(\"\\n\");\n\n const relations = input.relations\n .map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`)\n .join(\"\\n\");\n\n return `generated by @orizm/cli\n\n\\`\\`\\`mermaid\nerDiagram\n${tables}\n\n${relations}\n\\`\\`\\``;\n}\n\nexport function generateErd(config: CommonOrizmConfig): string {\n return renderMermaid(convertToInput(config));\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { generateErd } from \"../../erd.js\";\n\nexport default defineCommand({\n meta: {\n name: \"erd\",\n description: \"Generate an ERD in Mermaid format from orizm.config.ts\",\n },\n args: {\n ...globalArgs,\n \"config-file\": configFileArg,\n output: {\n type: \"string\",\n alias: \"o\",\n description: \"Output file path (defaults to stdout)\",\n },\n },\n run: async ({ args }) => {\n const loaded = await loadConfig(args[\"config-file\"] ?? DEFAULT_CONFIG_FILE);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n const mermaid = generateErd(loaded.value);\n\n if (args.output != null && args.output !== \"\") {\n const output = args.output;\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, mermaid + \"\\n\", \"utf-8\");\n return Result.succeed({\n json: { output },\n text: () => `ERD written to ${output}`,\n });\n }\n\n return Result.succeed({ json: { erd: mermaid }, text: () => mermaid });\n },\n});\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  const require_cli_main = require('./cli/main.cjs');
2
2
  const require_shared = require('./shared-DHRPzzKl.cjs');
3
- const require_config_loader = require('./config-loader-D8x32gEU.cjs');
3
+ const require_config_loader = require('./config-loader-CZfANHBf.cjs');
4
4
  let _praha_byethrow = require("@praha/byethrow");
5
5
  let node_path = require("node:path");
6
6
  node_path = require_cli_main.__toESM(node_path, 1);
@@ -121,4 +121,4 @@ var erd_default = require_cli_main.defineCommand({
121
121
 
122
122
  //#endregion
123
123
  exports.default = erd_default;
124
- //# sourceMappingURL=erd-ByuVMQ5n.cjs.map
124
+ //# sourceMappingURL=erd-DmnB1v2c.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"erd-ByuVMQ5n.cjs","names":["defineCommand","globalArgs","configFileArg","loadConfig","Result","configLoadFailure","path"],"sources":["../src/cli/erd.ts","../src/cli/commands/schema/erd.ts"],"sourcesContent":["import { CommonOrizmConfig } from \"./types.js\";\n\ntype TableInput = {\n name: string;\n columns: ColumnInput[];\n};\n\ntype ColumnInput = {\n name: string;\n type: string;\n isForeignKey: boolean;\n};\n\ntype RelationInput = {\n from: string;\n to: string;\n type: string;\n comment: string;\n};\n\ntype TemplateInput = {\n tables: TableInput[];\n relations: RelationInput[];\n};\n\nconst RELATION = {\n ONE_TO_MANY: \"||--o{\",\n ONE_TO_ONE: \"||--||\",\n} as const;\n\nfunction convertToInput(config: CommonOrizmConfig): TemplateInput {\n const tables: TableInput[] = [];\n const relations: RelationInput[] = [];\n\n for (const table of config.tables) {\n const modules: TableInput[] = [];\n const erdTable: TableInput = { name: table.name, columns: [] };\n\n for (const column of table.columns) {\n erdTable.columns.push({\n name: column.name,\n type: column.type,\n isForeignKey: column.type === \"reference\",\n });\n\n if (column.type === \"reference\") {\n relations.push({\n from: column.tableName,\n to: table.name,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n\n if (column.type === \"module\" || column.type === \"module-array\") {\n const module = config.tableModules.find(\n (m) => m.name === column.moduleName,\n );\n if (!module) {\n continue;\n }\n\n const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;\n modules.push({\n name: moduleTableName,\n columns: module.columns.map((c) => ({\n name: c.name,\n type: c.type,\n isForeignKey: c.type === \"reference\",\n })),\n });\n\n relations.push({\n from: table.name,\n to: moduleTableName,\n type:\n column.type === \"module\"\n ? RELATION.ONE_TO_ONE\n : RELATION.ONE_TO_MANY,\n comment: column.type === \"module\" ? \"module\" : \"module-array\",\n });\n\n for (const moduleColumn of module.columns) {\n if (moduleColumn.type === \"reference\") {\n relations.push({\n from: moduleTableName,\n to: moduleColumn.tableName,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n }\n }\n }\n\n tables.push(erdTable);\n tables.push(...modules);\n }\n\n return { tables, relations };\n}\n\nfunction renderMermaid(input: TemplateInput): string {\n const tables = input.tables\n .map((table) => {\n const columns = [\n \" id string PK\",\n ...table.columns.map(\n (col) =>\n ` ${col.name} ${col.type}${col.isForeignKey ? \" FK\" : \"\"}`,\n ),\n ].join(\"\\n\");\n return ` ${table.name} {\\n${columns}\\n }`;\n })\n .join(\"\\n\");\n\n const relations = input.relations\n .map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`)\n .join(\"\\n\");\n\n return `generated by @orizm/cli\n\n\\`\\`\\`mermaid\nerDiagram\n${tables}\n\n${relations}\n\\`\\`\\``;\n}\n\nexport function generateErd(config: CommonOrizmConfig): string {\n return renderMermaid(convertToInput(config));\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { generateErd } from \"../../erd.js\";\n\nexport default defineCommand({\n meta: {\n name: \"erd\",\n description: \"Generate an ERD in Mermaid format from orizm.config.ts\",\n },\n args: {\n ...globalArgs,\n \"config-file\": configFileArg,\n output: {\n type: \"string\",\n alias: \"o\",\n description: \"Output file path (defaults to stdout)\",\n },\n },\n run: async ({ args }) => {\n const loaded = await loadConfig(args[\"config-file\"] ?? DEFAULT_CONFIG_FILE);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n const mermaid = generateErd(loaded.value);\n\n if (args.output != null && args.output !== \"\") {\n const output = args.output;\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, mermaid + \"\\n\", \"utf-8\");\n return Result.succeed({\n json: { output },\n text: () => `ERD written to ${output}`,\n });\n }\n\n return Result.succeed({ json: { erd: mermaid }, text: () => mermaid });\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"erd-DmnB1v2c.cjs","names":["defineCommand","globalArgs","configFileArg","loadConfig","Result","configLoadFailure","path"],"sources":["../src/cli/erd.ts","../src/cli/commands/schema/erd.ts"],"sourcesContent":["import { CommonOrizmConfig } from \"./types.js\";\n\ntype TableInput = {\n name: string;\n columns: ColumnInput[];\n};\n\ntype ColumnInput = {\n name: string;\n type: string;\n isForeignKey: boolean;\n};\n\ntype RelationInput = {\n from: string;\n to: string;\n type: string;\n comment: string;\n};\n\ntype TemplateInput = {\n tables: TableInput[];\n relations: RelationInput[];\n};\n\nconst RELATION = {\n ONE_TO_MANY: \"||--o{\",\n ONE_TO_ONE: \"||--||\",\n} as const;\n\nfunction convertToInput(config: CommonOrizmConfig): TemplateInput {\n const tables: TableInput[] = [];\n const relations: RelationInput[] = [];\n\n for (const table of config.tables) {\n const modules: TableInput[] = [];\n const erdTable: TableInput = { name: table.name, columns: [] };\n\n for (const column of table.columns) {\n erdTable.columns.push({\n name: column.name,\n type: column.type,\n isForeignKey: column.type === \"reference\",\n });\n\n if (column.type === \"reference\") {\n relations.push({\n from: column.tableName,\n to: table.name,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n\n if (column.type === \"module\" || column.type === \"module-array\") {\n const module = config.tableModules.find(\n (m) => m.name === column.moduleName,\n );\n if (!module) {\n continue;\n }\n\n const moduleTableName = `${table.name}_${column.name}_${column.moduleName}`;\n modules.push({\n name: moduleTableName,\n columns: module.columns.map((c) => ({\n name: c.name,\n type: c.type,\n isForeignKey: c.type === \"reference\",\n })),\n });\n\n relations.push({\n from: table.name,\n to: moduleTableName,\n type:\n column.type === \"module\"\n ? RELATION.ONE_TO_ONE\n : RELATION.ONE_TO_MANY,\n comment: column.type === \"module\" ? \"module\" : \"module-array\",\n });\n\n for (const moduleColumn of module.columns) {\n if (moduleColumn.type === \"reference\") {\n relations.push({\n from: moduleTableName,\n to: moduleColumn.tableName,\n type: RELATION.ONE_TO_MANY,\n comment: \"reference\",\n });\n }\n }\n }\n }\n\n tables.push(erdTable);\n tables.push(...modules);\n }\n\n return { tables, relations };\n}\n\nfunction renderMermaid(input: TemplateInput): string {\n const tables = input.tables\n .map((table) => {\n const columns = [\n \" id string PK\",\n ...table.columns.map(\n (col) =>\n ` ${col.name} ${col.type}${col.isForeignKey ? \" FK\" : \"\"}`,\n ),\n ].join(\"\\n\");\n return ` ${table.name} {\\n${columns}\\n }`;\n })\n .join(\"\\n\");\n\n const relations = input.relations\n .map((rel) => ` ${rel.from} ${rel.type} ${rel.to} : ${rel.comment}`)\n .join(\"\\n\");\n\n return `generated by @orizm/cli\n\n\\`\\`\\`mermaid\nerDiagram\n${tables}\n\n${relations}\n\\`\\`\\``;\n}\n\nexport function generateErd(config: CommonOrizmConfig): string {\n return renderMermaid(convertToInput(config));\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Result } from \"@praha/byethrow\";\nimport { defineCommand } from \"../define-command.js\";\nimport { globalArgs, configFileArg, DEFAULT_CONFIG_FILE } from \"../shared.js\";\nimport { configLoadFailure } from \"../config-errors.js\";\nimport { loadConfig } from \"../../config-loader.js\";\nimport { generateErd } from \"../../erd.js\";\n\nexport default defineCommand({\n meta: {\n name: \"erd\",\n description: \"Generate an ERD in Mermaid format from orizm.config.ts\",\n },\n args: {\n ...globalArgs,\n \"config-file\": configFileArg,\n output: {\n type: \"string\",\n alias: \"o\",\n description: \"Output file path (defaults to stdout)\",\n },\n },\n run: async ({ args }) => {\n const loaded = await loadConfig(args[\"config-file\"] ?? DEFAULT_CONFIG_FILE);\n if (Result.isFailure(loaded)) return configLoadFailure(loaded.error);\n\n const mermaid = generateErd(loaded.value);\n\n if (args.output != null && args.output !== \"\") {\n const output = args.output;\n await mkdir(path.dirname(output), { recursive: true });\n await writeFile(output, mermaid + \"\\n\", \"utf-8\");\n return Result.succeed({\n json: { output },\n text: () => `ERD written to ${output}`,\n });\n }\n\n return Result.succeed({ json: { erd: mermaid }, text: () => mermaid });\n },\n});\n"],"mappings":"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"}