swallowkit 1.0.0-beta.15 → 1.0.0-beta.17

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 (43) hide show
  1. package/dist/__tests__/fixtures.d.ts.map +1 -1
  2. package/dist/__tests__/fixtures.js +1 -0
  3. package/dist/__tests__/fixtures.js.map +1 -1
  4. package/dist/cli/commands/add-auth.d.ts.map +1 -1
  5. package/dist/cli/commands/add-auth.js +85 -5
  6. package/dist/cli/commands/add-auth.js.map +1 -1
  7. package/dist/cli/commands/create-model.js +1 -1
  8. package/dist/cli/commands/create-model.js.map +1 -1
  9. package/dist/cli/commands/dev-seeds.js +5 -5
  10. package/dist/cli/commands/dev-seeds.js.map +1 -1
  11. package/dist/cli/commands/dev.js +64 -24
  12. package/dist/cli/commands/dev.js.map +1 -1
  13. package/dist/cli/commands/init.js +4 -4
  14. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  15. package/dist/cli/commands/scaffold.js +61 -5
  16. package/dist/cli/commands/scaffold.js.map +1 -1
  17. package/dist/core/scaffold/auth-generator.d.ts +1 -1
  18. package/dist/core/scaffold/auth-generator.d.ts.map +1 -1
  19. package/dist/core/scaffold/auth-generator.js +17 -20
  20. package/dist/core/scaffold/auth-generator.js.map +1 -1
  21. package/dist/core/scaffold/functions-generator.d.ts +2 -2
  22. package/dist/core/scaffold/functions-generator.d.ts.map +1 -1
  23. package/dist/core/scaffold/functions-generator.js +375 -107
  24. package/dist/core/scaffold/functions-generator.js.map +1 -1
  25. package/dist/core/scaffold/model-parser.d.ts +7 -0
  26. package/dist/core/scaffold/model-parser.d.ts.map +1 -1
  27. package/dist/core/scaffold/model-parser.js +25 -0
  28. package/dist/core/scaffold/model-parser.js.map +1 -1
  29. package/package.json +3 -3
  30. package/src/__tests__/__snapshots__/functions-generator.test.ts.snap +694 -0
  31. package/src/__tests__/auth.test.ts +13 -13
  32. package/src/__tests__/fixtures.ts +1 -0
  33. package/src/__tests__/functions-generator.test.ts +136 -0
  34. package/src/__tests__/model-parser.test.ts +72 -0
  35. package/src/cli/commands/add-auth.ts +95 -6
  36. package/src/cli/commands/create-model.ts +1 -1
  37. package/src/cli/commands/dev-seeds.ts +5 -5
  38. package/src/cli/commands/dev.ts +67 -23
  39. package/src/cli/commands/init.ts +4 -4
  40. package/src/cli/commands/scaffold.ts +69 -10
  41. package/src/core/scaffold/auth-generator.ts +16 -19
  42. package/src/core/scaffold/functions-generator.ts +402 -108
  43. package/src/core/scaffold/model-parser.ts +28 -0
@@ -20,6 +20,7 @@ export interface ModelInfo {
20
20
  nestedSchemaRefs: NestedSchemaRef[]; // ネストしたスキーマ参照
21
21
  connectorConfig?: ModelConnectorConfig; // コネクタメタデータ(外部データソース用)
22
22
  authPolicy?: ModelAuthPolicy; // 認可ポリシー(ロールベースアクセス制御用)
23
+ partitionKey: string; // Cosmos DB パーティションキーパス(デフォルト: "/id")
23
24
  }
24
25
 
25
26
  export interface FieldInfo {
@@ -89,6 +90,9 @@ export async function parseModelFile(modelPath: string): Promise<ModelInfo> {
89
90
 
90
91
  // authPolicy を抽出(ロールベースアクセス制御用メタデータ)
91
92
  const authPolicy = parseAuthPolicy(content);
93
+
94
+ // partitionKey を抽出(Cosmos DB パーティションキー)
95
+ const partitionKey = parsePartitionKey(content);
92
96
 
93
97
  // ネストしたスキーマ参照を検出
94
98
  const nestedSchemaRefs = detectNestedSchemaRefs(modelPath, content, schemaName);
@@ -103,6 +107,17 @@ export async function parseModelFile(modelPath: string): Promise<ModelInfo> {
103
107
  const hasId = fields.some(f => f.name === "id");
104
108
  const hasCreatedAt = fields.some(f => f.name === "createdAt");
105
109
  const hasUpdatedAt = fields.some(f => f.name === "updatedAt");
110
+
111
+ // パーティションキーのバリデーション
112
+ if (partitionKey !== '/id') {
113
+ if (!partitionKey.startsWith('/')) {
114
+ console.warn(`⚠️ [${modelName}] partitionKey should start with '/': got '${partitionKey}'`);
115
+ }
116
+ const pkField = partitionKey.startsWith('/') ? partitionKey.slice(1) : partitionKey;
117
+ if (fields.length > 0 && !fields.some(f => f.name === pkField)) {
118
+ console.warn(`⚠️ [${modelName}] partitionKey field '${pkField}' not found in schema fields`);
119
+ }
120
+ }
106
121
 
107
122
  return {
108
123
  name: modelName,
@@ -114,6 +129,7 @@ export async function parseModelFile(modelPath: string): Promise<ModelInfo> {
114
129
  hasCreatedAt,
115
130
  hasUpdatedAt,
116
131
  nestedSchemaRefs,
132
+ partitionKey,
117
133
  ...(connectorConfig ? { connectorConfig } : {}),
118
134
  ...(authPolicy ? { authPolicy } : {}),
119
135
  };
@@ -410,6 +426,8 @@ async function extractFieldsFromSchema(modelPath: string, schemaName: string): P
410
426
  // コメントを削除
411
427
  modelContent = modelContent.replace(/\/\*[\s\S]*?\*\//g, '');
412
428
  modelContent = modelContent.replace(/\/\/.*/g, '');
429
+ // TypeScript の `as const` アサーションを削除(.mjs では構文エラーになる)
430
+ modelContent = modelContent.replace(/\s+as\s+const\b/g, '');
413
431
 
414
432
  // インライン化したローカルインポートを先頭に追加
415
433
  const inlinedDeps = localImports.length > 0 ? localImports.join('\n\n') + '\n\n' : '';
@@ -776,6 +794,16 @@ export function parseAuthPolicy(content: string): ModelAuthPolicy | undefined {
776
794
  };
777
795
  }
778
796
 
797
+ /**
798
+ * パーティションキーを抽出する
799
+ * export const partitionKey = '/tenantId' のようなエクスポートを検出
800
+ * 未指定の場合はデフォルト '/id' を返す
801
+ */
802
+ export function parsePartitionKey(content: string): string {
803
+ const match = content.match(/export\s+const\s+partitionKey\s*=\s*['"]([^'"]+)['"]/);
804
+ return match ? match[1] : '/id';
805
+ }
806
+
779
807
  /**
780
808
  * 文字列を kebab-case に変換
781
809
  */