@opensaas/stack-cli 0.3.0 → 0.5.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 (105) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +193 -0
  3. package/dist/commands/generate.d.ts.map +1 -1
  4. package/dist/commands/generate.js +4 -13
  5. package/dist/commands/generate.js.map +1 -1
  6. package/dist/commands/migrate.d.ts +9 -0
  7. package/dist/commands/migrate.d.ts.map +1 -0
  8. package/dist/commands/migrate.js +473 -0
  9. package/dist/commands/migrate.js.map +1 -0
  10. package/dist/generator/context.d.ts.map +1 -1
  11. package/dist/generator/context.js +20 -5
  12. package/dist/generator/context.js.map +1 -1
  13. package/dist/generator/index.d.ts +1 -1
  14. package/dist/generator/index.d.ts.map +1 -1
  15. package/dist/generator/index.js +1 -1
  16. package/dist/generator/index.js.map +1 -1
  17. package/dist/generator/lists.d.ts.map +1 -1
  18. package/dist/generator/lists.js +33 -1
  19. package/dist/generator/lists.js.map +1 -1
  20. package/dist/generator/prisma-extensions.d.ts +11 -0
  21. package/dist/generator/prisma-extensions.d.ts.map +1 -0
  22. package/dist/generator/prisma-extensions.js +134 -0
  23. package/dist/generator/prisma-extensions.js.map +1 -0
  24. package/dist/generator/prisma.d.ts.map +1 -1
  25. package/dist/generator/prisma.js +4 -0
  26. package/dist/generator/prisma.js.map +1 -1
  27. package/dist/generator/types.d.ts.map +1 -1
  28. package/dist/generator/types.js +151 -17
  29. package/dist/generator/types.js.map +1 -1
  30. package/dist/index.js +3 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/mcp/lib/documentation-provider.d.ts +23 -0
  33. package/dist/mcp/lib/documentation-provider.d.ts.map +1 -1
  34. package/dist/mcp/lib/documentation-provider.js +471 -0
  35. package/dist/mcp/lib/documentation-provider.js.map +1 -1
  36. package/dist/mcp/lib/wizards/migration-wizard.d.ts +80 -0
  37. package/dist/mcp/lib/wizards/migration-wizard.d.ts.map +1 -0
  38. package/dist/mcp/lib/wizards/migration-wizard.js +499 -0
  39. package/dist/mcp/lib/wizards/migration-wizard.js.map +1 -0
  40. package/dist/mcp/server/index.d.ts.map +1 -1
  41. package/dist/mcp/server/index.js +103 -0
  42. package/dist/mcp/server/index.js.map +1 -1
  43. package/dist/mcp/server/stack-mcp-server.d.ts +85 -0
  44. package/dist/mcp/server/stack-mcp-server.d.ts.map +1 -1
  45. package/dist/mcp/server/stack-mcp-server.js +219 -0
  46. package/dist/mcp/server/stack-mcp-server.js.map +1 -1
  47. package/dist/migration/generators/migration-generator.d.ts +60 -0
  48. package/dist/migration/generators/migration-generator.d.ts.map +1 -0
  49. package/dist/migration/generators/migration-generator.js +510 -0
  50. package/dist/migration/generators/migration-generator.js.map +1 -0
  51. package/dist/migration/introspectors/index.d.ts +12 -0
  52. package/dist/migration/introspectors/index.d.ts.map +1 -0
  53. package/dist/migration/introspectors/index.js +10 -0
  54. package/dist/migration/introspectors/index.js.map +1 -0
  55. package/dist/migration/introspectors/keystone-introspector.d.ts +59 -0
  56. package/dist/migration/introspectors/keystone-introspector.d.ts.map +1 -0
  57. package/dist/migration/introspectors/keystone-introspector.js +229 -0
  58. package/dist/migration/introspectors/keystone-introspector.js.map +1 -0
  59. package/dist/migration/introspectors/nextjs-introspector.d.ts +59 -0
  60. package/dist/migration/introspectors/nextjs-introspector.d.ts.map +1 -0
  61. package/dist/migration/introspectors/nextjs-introspector.js +159 -0
  62. package/dist/migration/introspectors/nextjs-introspector.js.map +1 -0
  63. package/dist/migration/introspectors/prisma-introspector.d.ts +45 -0
  64. package/dist/migration/introspectors/prisma-introspector.d.ts.map +1 -0
  65. package/dist/migration/introspectors/prisma-introspector.js +190 -0
  66. package/dist/migration/introspectors/prisma-introspector.js.map +1 -0
  67. package/dist/migration/types.d.ts +86 -0
  68. package/dist/migration/types.d.ts.map +1 -0
  69. package/dist/migration/types.js +5 -0
  70. package/dist/migration/types.js.map +1 -0
  71. package/package.json +12 -9
  72. package/src/commands/__snapshots__/generate.test.ts.snap +92 -21
  73. package/src/commands/generate.ts +8 -19
  74. package/src/commands/migrate.ts +534 -0
  75. package/src/generator/__snapshots__/context.test.ts.snap +60 -15
  76. package/src/generator/__snapshots__/types.test.ts.snap +689 -95
  77. package/src/generator/context.test.ts +3 -1
  78. package/src/generator/context.ts +20 -5
  79. package/src/generator/index.ts +1 -1
  80. package/src/generator/lists.ts +39 -1
  81. package/src/generator/prisma-extensions.ts +159 -0
  82. package/src/generator/prisma.ts +5 -0
  83. package/src/generator/types.ts +204 -17
  84. package/src/index.ts +4 -0
  85. package/src/mcp/lib/documentation-provider.ts +507 -0
  86. package/src/mcp/lib/wizards/migration-wizard.ts +584 -0
  87. package/src/mcp/server/index.ts +121 -0
  88. package/src/mcp/server/stack-mcp-server.ts +243 -0
  89. package/src/migration/generators/migration-generator.ts +675 -0
  90. package/src/migration/introspectors/index.ts +12 -0
  91. package/src/migration/introspectors/keystone-introspector.ts +296 -0
  92. package/src/migration/introspectors/nextjs-introspector.ts +209 -0
  93. package/src/migration/introspectors/prisma-introspector.ts +233 -0
  94. package/src/migration/types.ts +92 -0
  95. package/tests/introspectors/keystone-introspector.test.ts +255 -0
  96. package/tests/introspectors/nextjs-introspector.test.ts +302 -0
  97. package/tests/introspectors/prisma-introspector.test.ts +268 -0
  98. package/tests/migration-generator.test.ts +592 -0
  99. package/tests/migration-wizard.test.ts +442 -0
  100. package/tsconfig.tsbuildinfo +1 -1
  101. package/dist/generator/type-patcher.d.ts +0 -13
  102. package/dist/generator/type-patcher.d.ts.map +0 -1
  103. package/dist/generator/type-patcher.js +0 -68
  104. package/dist/generator/type-patcher.js.map +0 -1
  105. package/src/generator/type-patcher.ts +0 -93
@@ -1,93 +0,0 @@
1
- import type { OpenSaasConfig } from '@opensaas/stack-core'
2
- import * as fs from 'fs'
3
- import * as path from 'path'
4
-
5
- /**
6
- * Patches Prisma's generated types based on field-level type patch configurations
7
- *
8
- * This reads Prisma's generated index.d.ts and replaces field types according to
9
- * the `typePatch` configuration on each field. Fields can specify custom result types
10
- * that will replace the original Prisma types in query results.
11
- *
12
- * The patched types are written to `.opensaas/prisma-client.d.ts` so users can
13
- * import from there to get the transformed types.
14
- */
15
- export function patchPrismaTypes(config: OpenSaasConfig, projectRoot: string): void {
16
- const opensaasPath = config.opensaasPath || '.opensaas'
17
-
18
- // Prisma generates to opensaasPath/prisma-client
19
- const prismaClientDir = path.join(projectRoot, opensaasPath, 'prisma-client')
20
- const prismaIndexPath = path.join(prismaClientDir, 'index.d.ts')
21
-
22
- // Check if Prisma types exist
23
- if (!fs.existsSync(prismaIndexPath)) {
24
- console.warn(
25
- '⚠️ Prisma types not found. Run `npx prisma generate` first to generate Prisma Client.',
26
- )
27
- return
28
- }
29
-
30
- // Read original Prisma types
31
- const originalTypes = fs.readFileSync(prismaIndexPath, 'utf-8')
32
-
33
- // Collect all fields that need type patching
34
- type FieldPatch = {
35
- fieldName: string
36
- resultType: string
37
- patchScope: 'scalars-only' | 'all'
38
- }
39
-
40
- const fieldPatches: FieldPatch[] = []
41
-
42
- for (const listConfig of Object.values(config.lists)) {
43
- for (const [fieldName, fieldConfig] of Object.entries(listConfig.fields)) {
44
- if (fieldConfig.typePatch) {
45
- fieldPatches.push({
46
- fieldName,
47
- resultType: fieldConfig.typePatch.resultType,
48
- patchScope: fieldConfig.typePatch.patchScope || 'scalars-only',
49
- })
50
- }
51
- }
52
- }
53
-
54
- if (fieldPatches.length === 0) {
55
- // No fields need patching
56
- return
57
- }
58
-
59
- // Patch the types
60
- let patchedTypes = originalTypes
61
-
62
- // For each field that needs patching, replace its type
63
- for (const { fieldName, resultType, patchScope } of fieldPatches) {
64
- if (patchScope === 'scalars-only') {
65
- // Pattern matches: fieldName: <type> ONLY inside scalars: $Extensions.GetPayloadResult<{...}>
66
- // This ensures we don't patch Input types (UserCreateInput, etc.)
67
- // Example match:
68
- // scalars: $Extensions.GetPayloadResult<{
69
- // id: string
70
- // password: string ← Replace this
71
- // ...
72
- const pattern = new RegExp(
73
- `(scalars:\\s*\\$Extensions\\.GetPayloadResult<\\{[^}]*?\\b${fieldName}:\\s*)[^,\\n}]+`,
74
- 'g',
75
- )
76
-
77
- patchedTypes = patchedTypes.replace(pattern, `$1${resultType}`)
78
- } else {
79
- // patchScope === 'all' - patch everywhere the field appears
80
- // This is more aggressive and will patch input types too
81
- const pattern = new RegExp(`(\\b${fieldName}:\\s*)[^,\\n}]+`, 'g')
82
- patchedTypes = patchedTypes.replace(pattern, `$1${resultType}`)
83
- }
84
- }
85
-
86
- // Write patched types back to Prisma's index.d.ts
87
- // This directly modifies the Prisma-generated file with our type patches
88
- fs.writeFileSync(prismaIndexPath, patchedTypes, 'utf-8')
89
-
90
- console.log(
91
- `✅ Patched Prisma types (${fieldPatches.length} field${fieldPatches.length === 1 ? '' : 's'})`,
92
- )
93
- }