frappebun 0.0.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 (66) hide show
  1. package/README.md +72 -0
  2. package/package.json +59 -0
  3. package/src/api/auth.ts +76 -0
  4. package/src/api/index.ts +10 -0
  5. package/src/api/resource.ts +177 -0
  6. package/src/api/route.ts +301 -0
  7. package/src/app/index.ts +6 -0
  8. package/src/app/loader.ts +218 -0
  9. package/src/auth/auth.ts +247 -0
  10. package/src/auth/index.ts +2 -0
  11. package/src/cli/args.ts +40 -0
  12. package/src/cli/bin.ts +12 -0
  13. package/src/cli/commands/add-api.ts +32 -0
  14. package/src/cli/commands/add-doctype.ts +43 -0
  15. package/src/cli/commands/add-page.ts +33 -0
  16. package/src/cli/commands/add-user.ts +96 -0
  17. package/src/cli/commands/dev.ts +71 -0
  18. package/src/cli/commands/drop-site.ts +27 -0
  19. package/src/cli/commands/init.ts +98 -0
  20. package/src/cli/commands/migrate.ts +110 -0
  21. package/src/cli/commands/new-site.ts +61 -0
  22. package/src/cli/commands/routes.ts +56 -0
  23. package/src/cli/commands/use.ts +30 -0
  24. package/src/cli/index.ts +73 -0
  25. package/src/cli/log.ts +13 -0
  26. package/src/cli/scaffold/templates.ts +189 -0
  27. package/src/context.ts +162 -0
  28. package/src/core/doctype/migration/migration.ts +17 -0
  29. package/src/core/doctype/role/role.ts +7 -0
  30. package/src/core/doctype/session/session.ts +16 -0
  31. package/src/core/doctype/user/user.controller.ts +11 -0
  32. package/src/core/doctype/user/user.ts +22 -0
  33. package/src/core/doctype/user_role/user_role.ts +9 -0
  34. package/src/core/doctypes.ts +25 -0
  35. package/src/core/index.ts +1 -0
  36. package/src/database/database.ts +359 -0
  37. package/src/database/filters.ts +131 -0
  38. package/src/database/index.ts +30 -0
  39. package/src/database/query-builder.ts +1118 -0
  40. package/src/database/schema.ts +188 -0
  41. package/src/doctype/define.ts +45 -0
  42. package/src/doctype/discovery.ts +57 -0
  43. package/src/doctype/field.ts +160 -0
  44. package/src/doctype/index.ts +20 -0
  45. package/src/doctype/layout.ts +62 -0
  46. package/src/doctype/query-builder-stub.ts +16 -0
  47. package/src/doctype/registry.ts +106 -0
  48. package/src/doctype/types.ts +407 -0
  49. package/src/document/document.ts +593 -0
  50. package/src/document/index.ts +6 -0
  51. package/src/document/naming.ts +56 -0
  52. package/src/errors.ts +53 -0
  53. package/src/frappe.d.ts +128 -0
  54. package/src/globals.ts +72 -0
  55. package/src/index.ts +112 -0
  56. package/src/migrations/index.ts +11 -0
  57. package/src/migrations/runner.ts +256 -0
  58. package/src/permissions/index.ts +265 -0
  59. package/src/response.ts +100 -0
  60. package/src/server.ts +210 -0
  61. package/src/site.ts +126 -0
  62. package/src/ssr/handler.ts +56 -0
  63. package/src/ssr/index.ts +11 -0
  64. package/src/ssr/page-loader.ts +200 -0
  65. package/src/ssr/renderer.ts +94 -0
  66. package/src/ssr/use-context.ts +41 -0
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Parse Frappe filter syntax into parameterized SQL WHERE clauses.
3
+ */
4
+
5
+ import type {
6
+ FilterInput,
7
+ ObjectFilter,
8
+ ArrayFilter,
9
+ FilterValue,
10
+ FilterCondition,
11
+ } from "../doctype/types"
12
+
13
+ export interface ParsedFilter {
14
+ sql: string
15
+ values: FilterValue[]
16
+ }
17
+
18
+ export function parseFilters(filters: FilterInput): ParsedFilter {
19
+ if (
20
+ filters == null ||
21
+ (typeof filters === "object" && !Array.isArray(filters) && Object.keys(filters).length === 0)
22
+ ) {
23
+ return { sql: "1=1", values: [] }
24
+ }
25
+
26
+ if (Array.isArray(filters)) {
27
+ return parseArrayFilter(filters as ArrayFilter)
28
+ }
29
+
30
+ return parseObjectFilter(filters as ObjectFilter)
31
+ }
32
+
33
+ function parseArrayFilter(filters: ArrayFilter): ParsedFilter {
34
+ const [operator, ...conditions] = filters
35
+
36
+ if (operator === "or" || operator === "and") {
37
+ const parts: string[] = []
38
+ const values: FilterValue[] = []
39
+
40
+ for (const cond of conditions) {
41
+ const parsed = parseFilters(cond as FilterInput)
42
+ parts.push(`(${parsed.sql})`)
43
+ values.push(...parsed.values)
44
+ }
45
+
46
+ return { sql: parts.join(operator === "or" ? " OR " : " AND "), values }
47
+ }
48
+
49
+ // Plain array treated as AND
50
+ const parts: string[] = []
51
+ const values: FilterValue[] = []
52
+ for (const cond of filters.slice(1)) {
53
+ const parsed = parseFilters(cond as FilterInput)
54
+ parts.push(`(${parsed.sql})`)
55
+ values.push(...parsed.values)
56
+ }
57
+ return { sql: parts.join(" AND "), values }
58
+ }
59
+
60
+ function parseObjectFilter(filters: ObjectFilter): ParsedFilter {
61
+ const parts: string[] = []
62
+ const values: FilterValue[] = []
63
+
64
+ for (const [fieldName, condition] of Object.entries(filters)) {
65
+ const col = `"${fieldName}"`
66
+
67
+ if (condition === null) {
68
+ parts.push(`${col} IS NULL`)
69
+ } else if (Array.isArray(condition)) {
70
+ const parsed = parseOperatorCondition(col, condition as FilterCondition)
71
+ parts.push(parsed.sql)
72
+ values.push(...parsed.values)
73
+ } else {
74
+ parts.push(`${col} = ?`)
75
+ values.push(condition as FilterValue)
76
+ }
77
+ }
78
+
79
+ return { sql: parts.join(" AND "), values }
80
+ }
81
+
82
+ function parseOperatorCondition(col: string, [op, val]: FilterCondition): ParsedFilter {
83
+ const opUpper = op.toUpperCase()
84
+
85
+ switch (opUpper) {
86
+ case ">":
87
+ case "<":
88
+ case ">=":
89
+ case "<=":
90
+ case "=":
91
+ case "!=":
92
+ return { sql: `${col} ${op} ?`, values: [val as FilterValue] }
93
+
94
+ case "LIKE":
95
+ case "NOT LIKE":
96
+ return { sql: `${col} ${opUpper} ?`, values: [val as FilterValue] }
97
+
98
+ case "IN":
99
+ if (Array.isArray(val) && val.length > 0) {
100
+ const placeholders = val.map(() => "?").join(", ")
101
+ return { sql: `${col} IN (${placeholders})`, values: val as FilterValue[] }
102
+ }
103
+ return { sql: "0=1", values: [] }
104
+
105
+ case "NOT IN":
106
+ if (Array.isArray(val) && val.length > 0) {
107
+ const placeholders = val.map(() => "?").join(", ")
108
+ return { sql: `${col} NOT IN (${placeholders})`, values: val as FilterValue[] }
109
+ }
110
+ return { sql: "1=1", values: [] }
111
+
112
+ case "BETWEEN": {
113
+ if (Array.isArray(val) && val.length === 2) {
114
+ return { sql: `${col} BETWEEN ? AND ?`, values: val as FilterValue[] }
115
+ }
116
+ throw new Error(`BETWEEN filter expects an array of 2 values`)
117
+ }
118
+
119
+ case "IS":
120
+ if (val === "set") {
121
+ return { sql: `${col} IS NOT NULL AND ${col} != ''`, values: [] }
122
+ }
123
+ if (val === "not set") {
124
+ return { sql: `(${col} IS NULL OR ${col} = '')`, values: [] }
125
+ }
126
+ throw new Error(`IS filter expects "set" or "not set"`)
127
+
128
+ default:
129
+ throw new Error(`Unknown filter operator: "${op}"`)
130
+ }
131
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Database module — re-exports everything.
3
+ */
4
+
5
+ export { FrappeDatabase } from "./database"
6
+ export type { GetAllArgs } from "./database"
7
+ export { parseFilters } from "./filters"
8
+ export type { ParsedFilter } from "./filters"
9
+ export { syncSchema, buildCreateTableSQL, buildAlterTableSQL, tableExists } from "./schema"
10
+ export {
11
+ QueryBuilder,
12
+ FnExpr,
13
+ OnCondition,
14
+ Paginator,
15
+ fn,
16
+ q,
17
+ createQueryBuilder,
18
+ emptyState,
19
+ } from "./query-builder"
20
+ export type {
21
+ BuilderState,
22
+ ConnectedWhere,
23
+ WhereNode,
24
+ OrderByNode,
25
+ HavingNode,
26
+ JoinDef,
27
+ CteDef,
28
+ UnionDef,
29
+ Connector,
30
+ } from "./query-builder"