chirag-appwrite-cli 0.3.0 → 0.3.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/bundle.cjs CHANGED
@@ -94643,6 +94643,20 @@ var DatabasesGenerator = class {
94643
94643
  getFields(entity) {
94644
94644
  return "columns" in entity ? entity.columns : entity.attributes;
94645
94645
  }
94646
+ /**
94647
+ * Checks if an entity has relationship columns.
94648
+ * Used to disable bulk methods for tables with relationships.
94649
+ *
94650
+ * TODO: Remove this restriction when bulk operations support relationships.
94651
+ * To enable bulk methods for all tables, simply return false here:
94652
+ * return false;
94653
+ */
94654
+ hasRelationshipColumns(entity) {
94655
+ const fields = this.getFields(entity);
94656
+ if (!fields)
94657
+ return false;
94658
+ return fields.some((field) => field.type === "relationship");
94659
+ }
94646
94660
  generateTableType(entity, entities) {
94647
94661
  const fields = this.getFields(entity);
94648
94662
  if (!fields)
@@ -94753,7 +94767,7 @@ export type QueryBuilder<T> = {
94753
94767
  }`;
94754
94768
  }
94755
94769
  generateDatabaseTablesType(entitiesByDb, appwriteDep) {
94756
- const hasBulkMethods = this.supportsBulkMethods(appwriteDep);
94770
+ const supportsBulk = this.supportsBulkMethods(appwriteDep);
94757
94771
  const dbReturnTypes = Array.from(entitiesByDb.entries()).map(([dbId, dbEntities]) => {
94758
94772
  const tableTypes = dbEntities.map((entity) => {
94759
94773
  const typeName = toPascalCase(entity.name);
@@ -94762,10 +94776,11 @@ export type QueryBuilder<T> = {
94762
94776
  update: (id: string, data: Partial<Omit<${typeName}, keyof Models.Row>>, options?: { permissions?: Permission[]; transactionId?: string }) => Promise<${typeName}>;
94763
94777
  delete: (id: string, options?: { transactionId?: string }) => Promise<void>;
94764
94778
  list: (options?: { queries?: (q: QueryBuilder<${typeName}>) => string[] }) => Promise<{ total: number; rows: ${typeName}[] }>;`;
94765
- const bulkMethods = hasBulkMethods ? `
94766
- createMany: (rows: Array<{ data: Omit<${typeName}, keyof Models.Row>; rowId?: string; permissions?: Permission[] }>, options?: { transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
94767
- updateMany: (rows: Array<{ rowId: string; data: Partial<Omit<${typeName}, keyof Models.Row>>; permissions?: Permission[] }>, options?: { transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
94768
- deleteMany: (rowIds: string[], options?: { transactionId?: string }) => Promise<void>;` : "";
94779
+ const canUseBulkMethods = supportsBulk && !this.hasRelationshipColumns(entity);
94780
+ const bulkMethods = canUseBulkMethods ? `
94781
+ createMany: (rows: Array<Omit<${typeName}, keyof Models.Row> & { $id?: string; $permissions?: string[] }>, options?: { transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
94782
+ updateMany: (data: Partial<Omit<${typeName}, keyof Models.Row>>, options?: { queries?: (q: QueryBuilder<${typeName}>) => string[]; transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
94783
+ deleteMany: (options?: { queries?: (q: QueryBuilder<${typeName}>) => string[]; transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;` : "";
94769
94784
  return ` '${entity.name}': {
94770
94785
  ${baseMethods}${bulkMethods}
94771
94786
  }`;
@@ -94809,19 +94824,19 @@ ${dbReturnTypes}
94809
94824
  }
94810
94825
  generateQueryBuilder() {
94811
94826
  return `const createQueryBuilder = <T>(): QueryBuilder<T> => ({
94812
- equal: (field, value) => Query.equal(String(field), value),
94813
- notEqual: (field, value) => Query.notEqual(String(field), value),
94814
- lessThan: (field, value) => Query.lessThan(String(field), value),
94815
- lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value),
94816
- greaterThan: (field, value) => Query.greaterThan(String(field), value),
94817
- greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value),
94818
- contains: (field, value) => Query.contains(String(field), value),
94827
+ equal: (field, value) => Query.equal(String(field), value as any),
94828
+ notEqual: (field, value) => Query.notEqual(String(field), value as any),
94829
+ lessThan: (field, value) => Query.lessThan(String(field), value as any),
94830
+ lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value as any),
94831
+ greaterThan: (field, value) => Query.greaterThan(String(field), value as any),
94832
+ greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value as any),
94833
+ contains: (field, value) => Query.contains(String(field), value as any),
94819
94834
  search: (field, value) => Query.search(String(field), value),
94820
94835
  isNull: (field) => Query.isNull(String(field)),
94821
94836
  isNotNull: (field) => Query.isNotNull(String(field)),
94822
94837
  startsWith: (field, value) => Query.startsWith(String(field), value),
94823
94838
  endsWith: (field, value) => Query.endsWith(String(field), value),
94824
- between: (field, start, end) => Query.between(String(field), start, end),
94839
+ between: (field, start, end) => Query.between(String(field), start as any, end as any),
94825
94840
  select: (fields) => Query.select(fields.map(String)),
94826
94841
  orderAsc: (field) => Query.orderAsc(String(field)),
94827
94842
  orderDesc: (field) => Query.orderDesc(String(field)),
@@ -94833,84 +94848,30 @@ ${dbReturnTypes}
94833
94848
  and: (...queries) => Query.and(queries),
94834
94849
  })`;
94835
94850
  }
94836
- generateTableHelpers(dbId, dbEntities, appwriteDep) {
94837
- const hasBulkMethods = this.supportsBulkMethods(appwriteDep);
94838
- return dbEntities.map((entity) => {
94839
- const entityName = entity.name;
94840
- const typeName = toPascalCase(entity.name);
94841
- const baseMethods = ` create: (data: Omit<${typeName}, keyof Models.Row>, options?: { rowId?: string; permissions?: Permission[]; transactionId?: string }) =>
94842
- tablesDB.createRow<${typeName}>({
94843
- databaseId: '${dbId}',
94844
- tableId: '${entity.$id}',
94845
- rowId: options?.rowId ?? ID.unique(),
94846
- data,
94847
- permissions: options?.permissions?.map((p) => p.toString()),
94848
- transactionId: options?.transactionId,
94849
- }),
94850
- get: (id: string) =>
94851
- tablesDB.getRow<${typeName}>({
94852
- databaseId: '${dbId}',
94853
- tableId: '${entity.$id}',
94854
- rowId: id,
94855
- }),
94856
- update: (id: string, data: Partial<Omit<${typeName}, keyof Models.Row>>, options?: { permissions?: Permission[]; transactionId?: string }) =>
94857
- tablesDB.updateRow<${typeName}>({
94858
- databaseId: '${dbId}',
94859
- tableId: '${entity.$id}',
94860
- rowId: id,
94861
- data,
94862
- ...(options?.permissions ? { permissions: options.permissions.map((p) => p.toString()) } : {}),
94863
- transactionId: options?.transactionId,
94864
- }),
94865
- delete: async (id: string, options?: { transactionId?: string }) => {
94866
- await tablesDB.deleteRow({
94867
- databaseId: '${dbId}',
94868
- tableId: '${entity.$id}',
94869
- rowId: id,
94870
- transactionId: options?.transactionId,
94871
- });
94872
- },
94873
- list: (options?: { queries?: (q: QueryBuilder<${typeName}>) => string[] }) =>
94874
- tablesDB.listRows<${typeName}>({
94875
- databaseId: '${dbId}',
94876
- tableId: '${entity.$id}',
94877
- queries: options?.queries?.(createQueryBuilder<${typeName}>()),
94878
- }),`;
94879
- const bulkMethods = hasBulkMethods ? `
94880
- createMany: (rows: Array<{ data: Omit<${typeName}, keyof Models.Row>; rowId?: string; permissions?: Permission[] }>, options?: { transactionId?: string }) =>
94881
- tablesDB.createRows<${typeName}>({
94882
- databaseId: '${dbId}',
94883
- tableId: '${entity.$id}',
94884
- rows: rows.map((row) => ({
94885
- rowId: row.rowId ?? ID.unique(),
94886
- data: row.data,
94887
- permissions: row.permissions?.map((p) => p.toString()),
94888
- })),
94889
- transactionId: options?.transactionId,
94890
- }),
94891
- updateMany: (rows: Array<{ rowId: string; data: Partial<Omit<${typeName}, keyof Models.Row>>; permissions?: Permission[] }>, options?: { transactionId?: string }) =>
94892
- tablesDB.updateRows<${typeName}>({
94893
- databaseId: '${dbId}',
94894
- tableId: '${entity.$id}',
94895
- rows: rows.map((row) => ({
94896
- rowId: row.rowId,
94897
- data: row.data,
94898
- permissions: row.permissions?.map((p) => p.toString()),
94899
- })),
94900
- transactionId: options?.transactionId,
94901
- }),
94902
- deleteMany: async (rowIds: string[], options?: { transactionId?: string }) => {
94903
- await tablesDB.deleteRows({
94904
- databaseId: '${dbId}',
94905
- tableId: '${entity.$id}',
94906
- rows: rowIds.map((rowId) => ({ rowId })),
94907
- transactionId: options?.transactionId,
94908
- });
94909
- },` : "";
94910
- return ` '${entityName}': {
94911
- ${baseMethods}${bulkMethods}
94912
- }`;
94851
+ generateTableIdMap(entitiesByDb) {
94852
+ const dbMappings = Array.from(entitiesByDb.entries()).map(([dbId, dbEntities]) => {
94853
+ const tableMappings = dbEntities.map((entity) => ` '${entity.name}': '${entity.$id}'`).join(",\n");
94854
+ return ` '${dbId}': {
94855
+ ${tableMappings}
94856
+ }`;
94913
94857
  }).join(",\n");
94858
+ return `const tableIdMap: Record<string, Record<string, string>> = {
94859
+ ${dbMappings}
94860
+ }`;
94861
+ }
94862
+ generateTablesWithRelationships(entitiesByDb) {
94863
+ const tablesWithRelationships = [];
94864
+ for (const [dbId, dbEntities] of entitiesByDb.entries()) {
94865
+ for (const entity of dbEntities) {
94866
+ if (this.hasRelationshipColumns(entity)) {
94867
+ tablesWithRelationships.push(`'${dbId}:${entity.name}'`);
94868
+ }
94869
+ }
94870
+ }
94871
+ if (tablesWithRelationships.length === 0) {
94872
+ return `const tablesWithRelationships = new Set<string>()`;
94873
+ }
94874
+ return `const tablesWithRelationships = new Set<string>([${tablesWithRelationships.join(", ")}])`;
94914
94875
  }
94915
94876
  generateDatabasesFile(config2) {
94916
94877
  const entities = config2.tables?.length ? config2.tables : config2.collections;
@@ -94918,27 +94879,133 @@ ${baseMethods}${bulkMethods}
94918
94879
  return "// No tables or collections found in configuration\n";
94919
94880
  }
94920
94881
  const entitiesByDb = this.groupEntitiesByDb(entities);
94921
- const typeNames = entities.map((e) => toPascalCase(e.name));
94922
94882
  const appwriteDep = this.getAppwriteDependency();
94923
- const databasesMap = Array.from(entitiesByDb.entries()).map(([dbId, dbEntities]) => {
94924
- return ` '${dbId}': {
94925
- ${this.generateTableHelpers(dbId, dbEntities, appwriteDep)}
94926
- }`;
94927
- }).join(",\n");
94883
+ const supportsBulk = this.supportsBulkMethods(appwriteDep);
94884
+ const bulkMethodsCode = supportsBulk ? `
94885
+ createMany: (rows: any[], options?: { transactionId?: string }) =>
94886
+ tablesDB.createRows({
94887
+ databaseId,
94888
+ tableId,
94889
+ rows,
94890
+ transactionId: options?.transactionId,
94891
+ }),
94892
+ updateMany: (data: any, options?: { queries?: (q: any) => string[]; transactionId?: string }) =>
94893
+ tablesDB.updateRows({
94894
+ databaseId,
94895
+ tableId,
94896
+ data,
94897
+ queries: options?.queries?.(createQueryBuilder()),
94898
+ transactionId: options?.transactionId,
94899
+ }),
94900
+ deleteMany: (options?: { queries?: (q: any) => string[]; transactionId?: string }) =>
94901
+ tablesDB.deleteRows({
94902
+ databaseId,
94903
+ tableId,
94904
+ queries: options?.queries?.(createQueryBuilder()),
94905
+ transactionId: options?.transactionId,
94906
+ }),` : "";
94907
+ const hasBulkCheck = supportsBulk ? `const hasBulkMethods = (dbId: string, tableName: string) => !tablesWithRelationships.has(\`\${dbId}:\${tableName}\`);` : "";
94928
94908
  return `import { Client, TablesDB, ID, Query, type Models, Permission } from '${appwriteDep}';
94929
- import type { ${typeNames.join(", ")}, DatabaseId, DatabaseTables, QueryBuilder } from './types.js';
94909
+ import type { DatabaseId, DatabaseTables, QueryBuilder } from './types.js';
94930
94910
 
94931
94911
  ${this.generateQueryBuilder()};
94932
94912
 
94933
- export const createDatabases = (client: Client) => {
94934
- const tablesDB = new TablesDB(client);
94913
+ ${this.generateTableIdMap(entitiesByDb)};
94914
+
94915
+ ${this.generateTablesWithRelationships(entitiesByDb)};
94935
94916
 
94936
- const _databases: { [K in DatabaseId]: DatabaseTables[K] } = {
94937
- ${databasesMap}
94917
+ function createTableApi<T extends Models.Row>(
94918
+ tablesDB: TablesDB,
94919
+ databaseId: string,
94920
+ tableId: string,
94921
+ ) {
94922
+ return {
94923
+ create: (data: any, options?: { rowId?: string; permissions?: Permission[]; transactionId?: string }) =>
94924
+ tablesDB.createRow<T>({
94925
+ databaseId,
94926
+ tableId,
94927
+ rowId: options?.rowId ?? ID.unique(),
94928
+ data,
94929
+ permissions: options?.permissions?.map((p) => p.toString()),
94930
+ transactionId: options?.transactionId,
94931
+ }),
94932
+ get: (id: string) =>
94933
+ tablesDB.getRow<T>({
94934
+ databaseId,
94935
+ tableId,
94936
+ rowId: id,
94937
+ }),
94938
+ update: (id: string, data: any, options?: { permissions?: Permission[]; transactionId?: string }) =>
94939
+ tablesDB.updateRow<T>({
94940
+ databaseId,
94941
+ tableId,
94942
+ rowId: id,
94943
+ data,
94944
+ ...(options?.permissions ? { permissions: options.permissions.map((p) => p.toString()) } : {}),
94945
+ transactionId: options?.transactionId,
94946
+ }),
94947
+ delete: async (id: string, options?: { transactionId?: string }) => {
94948
+ await tablesDB.deleteRow({
94949
+ databaseId,
94950
+ tableId,
94951
+ rowId: id,
94952
+ transactionId: options?.transactionId,
94953
+ });
94954
+ },
94955
+ list: (options?: { queries?: (q: any) => string[] }) =>
94956
+ tablesDB.listRows<T>({
94957
+ databaseId,
94958
+ tableId,
94959
+ queries: options?.queries?.(createQueryBuilder<T>()),
94960
+ }),${bulkMethodsCode}
94938
94961
  };
94962
+ }
94963
+
94964
+ ${hasBulkCheck}
94965
+
94966
+ function createDatabaseProxy<D extends DatabaseId>(
94967
+ tablesDB: TablesDB,
94968
+ databaseId: D,
94969
+ ): DatabaseTables[D] {
94970
+ const tableApiCache = new Map<string, ReturnType<typeof createTableApi>>();
94971
+
94972
+ return new Proxy({} as DatabaseTables[D], {
94973
+ get(_target, tableName: string) {
94974
+ if (typeof tableName === 'symbol') return undefined;
94975
+
94976
+ if (!tableApiCache.has(tableName)) {
94977
+ const tableId = tableIdMap[databaseId]?.[tableName];
94978
+ if (!tableId) return undefined;
94979
+
94980
+ const api = createTableApi(tablesDB, databaseId, tableId);
94981
+ ${supportsBulk ? `
94982
+ // Remove bulk methods for tables with relationships
94983
+ if (!hasBulkMethods(databaseId, tableName)) {
94984
+ delete (api as any).createMany;
94985
+ delete (api as any).updateMany;
94986
+ delete (api as any).deleteMany;
94987
+ }` : ""}
94988
+ tableApiCache.set(tableName, api);
94989
+ }
94990
+ return tableApiCache.get(tableName);
94991
+ },
94992
+ has(_target, tableName: string) {
94993
+ return typeof tableName === 'string' && tableName in (tableIdMap[databaseId] ?? {});
94994
+ },
94995
+ });
94996
+ }
94997
+
94998
+ export const createDatabases = (client: Client) => {
94999
+ const tablesDB = new TablesDB(client);
95000
+ const dbCache = new Map<DatabaseId, DatabaseTables[DatabaseId]>();
94939
95001
 
94940
95002
  return {
94941
- from: <T extends DatabaseId>(databaseId: T): DatabaseTables[T] => _databases[databaseId],
95003
+ from: <T extends DatabaseId>(databaseId: T): DatabaseTables[T] => {
95004
+ if (!dbCache.has(databaseId)) {
95005
+ dbCache.set(databaseId, createDatabaseProxy(tablesDB, databaseId));
95006
+ }
95007
+ return dbCache.get(databaseId) as DatabaseTables[T];
95008
+ },
94942
95009
  };
94943
95010
  };
94944
95011
  `;
@@ -7,6 +7,15 @@ export interface GenerateResult {
7
7
  export declare class DatabasesGenerator {
8
8
  private getType;
9
9
  private getFields;
10
+ /**
11
+ * Checks if an entity has relationship columns.
12
+ * Used to disable bulk methods for tables with relationships.
13
+ *
14
+ * TODO: Remove this restriction when bulk operations support relationships.
15
+ * To enable bulk methods for all tables, simply return false here:
16
+ * return false;
17
+ */
18
+ private hasRelationshipColumns;
10
19
  private generateTableType;
11
20
  private generateEnums;
12
21
  private groupEntitiesByDb;
@@ -16,7 +25,8 @@ export declare class DatabasesGenerator {
16
25
  private generateDatabaseTablesType;
17
26
  generateTypesFile(config: ConfigType): string;
18
27
  private generateQueryBuilder;
19
- private generateTableHelpers;
28
+ private generateTableIdMap;
29
+ private generateTablesWithRelationships;
20
30
  generateDatabasesFile(config: ConfigType): string;
21
31
  generateIndexFile(): string;
22
32
  generate(config: ConfigType): Promise<GenerateResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"databases.d.ts","sourceRoot":"","sources":["../../../../lib/commands/generators/databases.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAG3D,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AASD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO;IA0Df,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,wBAAwB;IAqChC,OAAO,CAAC,0BAA0B;IAiClC,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAsC7C,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,oBAAoB;IA0F5B,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAoCjD,iBAAiB,IAAI,MAAM;IAarB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC;IA4BrD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB3E"}
1
+ {"version":3,"file":"databases.d.ts","sourceRoot":"","sources":["../../../../lib/commands/generators/databases.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAG3D,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AASD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO;IA0Df,OAAO,CAAC,SAAS;IAQjB;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,wBAAwB;IAqChC,OAAO,CAAC,0BAA0B;IAmClC,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAsC7C,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,+BAA+B;IAkBvC,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAmJjD,iBAAiB,IAAI,MAAM;IAarB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC;IA4BrD,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB3E"}
@@ -52,6 +52,20 @@ export class DatabasesGenerator {
52
52
  ? entity.columns
53
53
  : entity.attributes;
54
54
  }
55
+ /**
56
+ * Checks if an entity has relationship columns.
57
+ * Used to disable bulk methods for tables with relationships.
58
+ *
59
+ * TODO: Remove this restriction when bulk operations support relationships.
60
+ * To enable bulk methods for all tables, simply return false here:
61
+ * return false;
62
+ */
63
+ hasRelationshipColumns(entity) {
64
+ const fields = this.getFields(entity);
65
+ if (!fields)
66
+ return false;
67
+ return fields.some((field) => field.type === "relationship");
68
+ }
55
69
  generateTableType(entity, entities) {
56
70
  const fields = this.getFields(entity);
57
71
  if (!fields)
@@ -166,7 +180,7 @@ export type QueryBuilder<T> = {
166
180
  }`;
167
181
  }
168
182
  generateDatabaseTablesType(entitiesByDb, appwriteDep) {
169
- const hasBulkMethods = this.supportsBulkMethods(appwriteDep);
183
+ const supportsBulk = this.supportsBulkMethods(appwriteDep);
170
184
  const dbReturnTypes = Array.from(entitiesByDb.entries())
171
185
  .map(([dbId, dbEntities]) => {
172
186
  const tableTypes = dbEntities
@@ -177,11 +191,13 @@ export type QueryBuilder<T> = {
177
191
  update: (id: string, data: Partial<Omit<${typeName}, keyof Models.Row>>, options?: { permissions?: Permission[]; transactionId?: string }) => Promise<${typeName}>;
178
192
  delete: (id: string, options?: { transactionId?: string }) => Promise<void>;
179
193
  list: (options?: { queries?: (q: QueryBuilder<${typeName}>) => string[] }) => Promise<{ total: number; rows: ${typeName}[] }>;`;
180
- const bulkMethods = hasBulkMethods
194
+ // Bulk methods not supported for tables with relationship columns (see hasRelationshipColumns)
195
+ const canUseBulkMethods = supportsBulk && !this.hasRelationshipColumns(entity);
196
+ const bulkMethods = canUseBulkMethods
181
197
  ? `
182
- createMany: (rows: Array<{ data: Omit<${typeName}, keyof Models.Row>; rowId?: string; permissions?: Permission[] }>, options?: { transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
183
- updateMany: (rows: Array<{ rowId: string; data: Partial<Omit<${typeName}, keyof Models.Row>>; permissions?: Permission[] }>, options?: { transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
184
- deleteMany: (rowIds: string[], options?: { transactionId?: string }) => Promise<void>;`
198
+ createMany: (rows: Array<Omit<${typeName}, keyof Models.Row> & { $id?: string; $permissions?: string[] }>, options?: { transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
199
+ updateMany: (data: Partial<Omit<${typeName}, keyof Models.Row>>, options?: { queries?: (q: QueryBuilder<${typeName}>) => string[]; transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
200
+ deleteMany: (options?: { queries?: (q: QueryBuilder<${typeName}>) => string[]; transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;`
185
201
  : "";
186
202
  return ` '${entity.name}': {\n${baseMethods}${bulkMethods}\n }`;
187
203
  })
@@ -224,19 +240,19 @@ export type QueryBuilder<T> = {
224
240
  }
225
241
  generateQueryBuilder() {
226
242
  return `const createQueryBuilder = <T>(): QueryBuilder<T> => ({
227
- equal: (field, value) => Query.equal(String(field), value),
228
- notEqual: (field, value) => Query.notEqual(String(field), value),
229
- lessThan: (field, value) => Query.lessThan(String(field), value),
230
- lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value),
231
- greaterThan: (field, value) => Query.greaterThan(String(field), value),
232
- greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value),
233
- contains: (field, value) => Query.contains(String(field), value),
243
+ equal: (field, value) => Query.equal(String(field), value as any),
244
+ notEqual: (field, value) => Query.notEqual(String(field), value as any),
245
+ lessThan: (field, value) => Query.lessThan(String(field), value as any),
246
+ lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value as any),
247
+ greaterThan: (field, value) => Query.greaterThan(String(field), value as any),
248
+ greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value as any),
249
+ contains: (field, value) => Query.contains(String(field), value as any),
234
250
  search: (field, value) => Query.search(String(field), value),
235
251
  isNull: (field) => Query.isNull(String(field)),
236
252
  isNotNull: (field) => Query.isNotNull(String(field)),
237
253
  startsWith: (field, value) => Query.startsWith(String(field), value),
238
254
  endsWith: (field, value) => Query.endsWith(String(field), value),
239
- between: (field, start, end) => Query.between(String(field), start, end),
255
+ between: (field, start, end) => Query.between(String(field), start as any, end as any),
240
256
  select: (fields) => Query.select(fields.map(String)),
241
257
  orderAsc: (field) => Query.orderAsc(String(field)),
242
258
  orderDesc: (field) => Query.orderDesc(String(field)),
@@ -248,86 +264,30 @@ export type QueryBuilder<T> = {
248
264
  and: (...queries) => Query.and(queries),
249
265
  })`;
250
266
  }
251
- generateTableHelpers(dbId, dbEntities, appwriteDep) {
252
- const hasBulkMethods = this.supportsBulkMethods(appwriteDep);
253
- return dbEntities
254
- .map((entity) => {
255
- const entityName = entity.name;
256
- const typeName = toPascalCase(entity.name);
257
- const baseMethods = ` create: (data: Omit<${typeName}, keyof Models.Row>, options?: { rowId?: string; permissions?: Permission[]; transactionId?: string }) =>
258
- tablesDB.createRow<${typeName}>({
259
- databaseId: '${dbId}',
260
- tableId: '${entity.$id}',
261
- rowId: options?.rowId ?? ID.unique(),
262
- data,
263
- permissions: options?.permissions?.map((p) => p.toString()),
264
- transactionId: options?.transactionId,
265
- }),
266
- get: (id: string) =>
267
- tablesDB.getRow<${typeName}>({
268
- databaseId: '${dbId}',
269
- tableId: '${entity.$id}',
270
- rowId: id,
271
- }),
272
- update: (id: string, data: Partial<Omit<${typeName}, keyof Models.Row>>, options?: { permissions?: Permission[]; transactionId?: string }) =>
273
- tablesDB.updateRow<${typeName}>({
274
- databaseId: '${dbId}',
275
- tableId: '${entity.$id}',
276
- rowId: id,
277
- data,
278
- ...(options?.permissions ? { permissions: options.permissions.map((p) => p.toString()) } : {}),
279
- transactionId: options?.transactionId,
280
- }),
281
- delete: async (id: string, options?: { transactionId?: string }) => {
282
- await tablesDB.deleteRow({
283
- databaseId: '${dbId}',
284
- tableId: '${entity.$id}',
285
- rowId: id,
286
- transactionId: options?.transactionId,
287
- });
288
- },
289
- list: (options?: { queries?: (q: QueryBuilder<${typeName}>) => string[] }) =>
290
- tablesDB.listRows<${typeName}>({
291
- databaseId: '${dbId}',
292
- tableId: '${entity.$id}',
293
- queries: options?.queries?.(createQueryBuilder<${typeName}>()),
294
- }),`;
295
- const bulkMethods = hasBulkMethods
296
- ? `
297
- createMany: (rows: Array<{ data: Omit<${typeName}, keyof Models.Row>; rowId?: string; permissions?: Permission[] }>, options?: { transactionId?: string }) =>
298
- tablesDB.createRows<${typeName}>({
299
- databaseId: '${dbId}',
300
- tableId: '${entity.$id}',
301
- rows: rows.map((row) => ({
302
- rowId: row.rowId ?? ID.unique(),
303
- data: row.data,
304
- permissions: row.permissions?.map((p) => p.toString()),
305
- })),
306
- transactionId: options?.transactionId,
307
- }),
308
- updateMany: (rows: Array<{ rowId: string; data: Partial<Omit<${typeName}, keyof Models.Row>>; permissions?: Permission[] }>, options?: { transactionId?: string }) =>
309
- tablesDB.updateRows<${typeName}>({
310
- databaseId: '${dbId}',
311
- tableId: '${entity.$id}',
312
- rows: rows.map((row) => ({
313
- rowId: row.rowId,
314
- data: row.data,
315
- permissions: row.permissions?.map((p) => p.toString()),
316
- })),
317
- transactionId: options?.transactionId,
318
- }),
319
- deleteMany: async (rowIds: string[], options?: { transactionId?: string }) => {
320
- await tablesDB.deleteRows({
321
- databaseId: '${dbId}',
322
- tableId: '${entity.$id}',
323
- rows: rowIds.map((rowId) => ({ rowId })),
324
- transactionId: options?.transactionId,
325
- });
326
- },`
327
- : "";
328
- return ` '${entityName}': {\n${baseMethods}${bulkMethods}\n }`;
267
+ generateTableIdMap(entitiesByDb) {
268
+ const dbMappings = Array.from(entitiesByDb.entries())
269
+ .map(([dbId, dbEntities]) => {
270
+ const tableMappings = dbEntities
271
+ .map((entity) => ` '${entity.name}': '${entity.$id}'`)
272
+ .join(",\n");
273
+ return ` '${dbId}': {\n${tableMappings}\n }`;
329
274
  })
330
275
  .join(",\n");
276
+ return `const tableIdMap: Record<string, Record<string, string>> = {\n${dbMappings}\n}`;
277
+ }
278
+ generateTablesWithRelationships(entitiesByDb) {
279
+ const tablesWithRelationships = [];
280
+ for (const [dbId, dbEntities] of entitiesByDb.entries()) {
281
+ for (const entity of dbEntities) {
282
+ if (this.hasRelationshipColumns(entity)) {
283
+ tablesWithRelationships.push(`'${dbId}:${entity.name}'`);
284
+ }
285
+ }
286
+ }
287
+ if (tablesWithRelationships.length === 0) {
288
+ return `const tablesWithRelationships = new Set<string>()`;
289
+ }
290
+ return `const tablesWithRelationships = new Set<string>([${tablesWithRelationships.join(", ")}])`;
331
291
  }
332
292
  generateDatabasesFile(config) {
333
293
  const entities = config.tables?.length ? config.tables : config.collections;
@@ -335,27 +295,137 @@ export type QueryBuilder<T> = {
335
295
  return "// No tables or collections found in configuration\n";
336
296
  }
337
297
  const entitiesByDb = this.groupEntitiesByDb(entities);
338
- const typeNames = entities.map((e) => toPascalCase(e.name));
339
298
  const appwriteDep = this.getAppwriteDependency();
340
- const databasesMap = Array.from(entitiesByDb.entries())
341
- .map(([dbId, dbEntities]) => {
342
- return ` '${dbId}': {\n${this.generateTableHelpers(dbId, dbEntities, appwriteDep)}\n }`;
343
- })
344
- .join(",\n");
299
+ const supportsBulk = this.supportsBulkMethods(appwriteDep);
300
+ const bulkMethodsCode = supportsBulk
301
+ ? `
302
+ createMany: (rows: any[], options?: { transactionId?: string }) =>
303
+ tablesDB.createRows({
304
+ databaseId,
305
+ tableId,
306
+ rows,
307
+ transactionId: options?.transactionId,
308
+ }),
309
+ updateMany: (data: any, options?: { queries?: (q: any) => string[]; transactionId?: string }) =>
310
+ tablesDB.updateRows({
311
+ databaseId,
312
+ tableId,
313
+ data,
314
+ queries: options?.queries?.(createQueryBuilder()),
315
+ transactionId: options?.transactionId,
316
+ }),
317
+ deleteMany: (options?: { queries?: (q: any) => string[]; transactionId?: string }) =>
318
+ tablesDB.deleteRows({
319
+ databaseId,
320
+ tableId,
321
+ queries: options?.queries?.(createQueryBuilder()),
322
+ transactionId: options?.transactionId,
323
+ }),`
324
+ : "";
325
+ const hasBulkCheck = supportsBulk
326
+ ? `const hasBulkMethods = (dbId: string, tableName: string) => !tablesWithRelationships.has(\`\${dbId}:\${tableName}\`);`
327
+ : "";
345
328
  return `import { Client, TablesDB, ID, Query, type Models, Permission } from '${appwriteDep}';
346
- import type { ${typeNames.join(", ")}, DatabaseId, DatabaseTables, QueryBuilder } from './types.js';
329
+ import type { DatabaseId, DatabaseTables, QueryBuilder } from './types.js';
347
330
 
348
331
  ${this.generateQueryBuilder()};
349
332
 
350
- export const createDatabases = (client: Client) => {
351
- const tablesDB = new TablesDB(client);
333
+ ${this.generateTableIdMap(entitiesByDb)};
334
+
335
+ ${this.generateTablesWithRelationships(entitiesByDb)};
352
336
 
353
- const _databases: { [K in DatabaseId]: DatabaseTables[K] } = {
354
- ${databasesMap}
337
+ function createTableApi<T extends Models.Row>(
338
+ tablesDB: TablesDB,
339
+ databaseId: string,
340
+ tableId: string,
341
+ ) {
342
+ return {
343
+ create: (data: any, options?: { rowId?: string; permissions?: Permission[]; transactionId?: string }) =>
344
+ tablesDB.createRow<T>({
345
+ databaseId,
346
+ tableId,
347
+ rowId: options?.rowId ?? ID.unique(),
348
+ data,
349
+ permissions: options?.permissions?.map((p) => p.toString()),
350
+ transactionId: options?.transactionId,
351
+ }),
352
+ get: (id: string) =>
353
+ tablesDB.getRow<T>({
354
+ databaseId,
355
+ tableId,
356
+ rowId: id,
357
+ }),
358
+ update: (id: string, data: any, options?: { permissions?: Permission[]; transactionId?: string }) =>
359
+ tablesDB.updateRow<T>({
360
+ databaseId,
361
+ tableId,
362
+ rowId: id,
363
+ data,
364
+ ...(options?.permissions ? { permissions: options.permissions.map((p) => p.toString()) } : {}),
365
+ transactionId: options?.transactionId,
366
+ }),
367
+ delete: async (id: string, options?: { transactionId?: string }) => {
368
+ await tablesDB.deleteRow({
369
+ databaseId,
370
+ tableId,
371
+ rowId: id,
372
+ transactionId: options?.transactionId,
373
+ });
374
+ },
375
+ list: (options?: { queries?: (q: any) => string[] }) =>
376
+ tablesDB.listRows<T>({
377
+ databaseId,
378
+ tableId,
379
+ queries: options?.queries?.(createQueryBuilder<T>()),
380
+ }),${bulkMethodsCode}
355
381
  };
382
+ }
383
+
384
+ ${hasBulkCheck}
385
+
386
+ function createDatabaseProxy<D extends DatabaseId>(
387
+ tablesDB: TablesDB,
388
+ databaseId: D,
389
+ ): DatabaseTables[D] {
390
+ const tableApiCache = new Map<string, ReturnType<typeof createTableApi>>();
391
+
392
+ return new Proxy({} as DatabaseTables[D], {
393
+ get(_target, tableName: string) {
394
+ if (typeof tableName === 'symbol') return undefined;
395
+
396
+ if (!tableApiCache.has(tableName)) {
397
+ const tableId = tableIdMap[databaseId]?.[tableName];
398
+ if (!tableId) return undefined;
399
+
400
+ const api = createTableApi(tablesDB, databaseId, tableId);
401
+ ${supportsBulk ? `
402
+ // Remove bulk methods for tables with relationships
403
+ if (!hasBulkMethods(databaseId, tableName)) {
404
+ delete (api as any).createMany;
405
+ delete (api as any).updateMany;
406
+ delete (api as any).deleteMany;
407
+ }` : ""}
408
+ tableApiCache.set(tableName, api);
409
+ }
410
+ return tableApiCache.get(tableName);
411
+ },
412
+ has(_target, tableName: string) {
413
+ return typeof tableName === 'string' && tableName in (tableIdMap[databaseId] ?? {});
414
+ },
415
+ });
416
+ }
417
+
418
+ export const createDatabases = (client: Client) => {
419
+ const tablesDB = new TablesDB(client);
420
+ const dbCache = new Map<DatabaseId, DatabaseTables[DatabaseId]>();
356
421
 
357
422
  return {
358
- from: <T extends DatabaseId>(databaseId: T): DatabaseTables[T] => _databases[databaseId],
423
+ from: <T extends DatabaseId>(databaseId: T): DatabaseTables[T] => {
424
+ if (!dbCache.has(databaseId)) {
425
+ dbCache.set(databaseId, createDatabaseProxy(tablesDB, databaseId));
426
+ }
427
+ return dbCache.get(databaseId) as DatabaseTables[T];
428
+ },
359
429
  };
360
430
  };
361
431
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"databases.js","sourceRoot":"","sources":["../../../../lib/commands/generators/databases.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"databases.js","sourceRoot":"","sources":["../../../../lib/commands/generators/databases.ts"],"names":[],"mappings":"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"}
package/dist/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "type": "module",
4
4
  "homepage": "https://appwrite.io/support",
5
5
  "description": "Repo short description goes here",
6
- "version": "0.3.0",
6
+ "version": "0.3.1",
7
7
  "license": "",
8
8
  "main": "dist/index.js",
9
9
  "types": "dist/index.d.ts",
@@ -84,6 +84,20 @@ export class DatabasesGenerator {
84
84
  : (entity as NonNullable<ConfigType["collections"]>[number]).attributes;
85
85
  }
86
86
 
87
+ /**
88
+ * Checks if an entity has relationship columns.
89
+ * Used to disable bulk methods for tables with relationships.
90
+ *
91
+ * TODO: Remove this restriction when bulk operations support relationships.
92
+ * To enable bulk methods for all tables, simply return false here:
93
+ * return false;
94
+ */
95
+ private hasRelationshipColumns(entity: Entity): boolean {
96
+ const fields = this.getFields(entity);
97
+ if (!fields) return false;
98
+ return fields.some((field) => field.type === "relationship");
99
+ }
100
+
87
101
  private generateTableType(entity: Entity, entities: Entities): string {
88
102
  const fields = this.getFields(entity);
89
103
  if (!fields) return "";
@@ -222,7 +236,7 @@ export type QueryBuilder<T> = {
222
236
  entitiesByDb: Map<string, Entity[]>,
223
237
  appwriteDep: string,
224
238
  ): string {
225
- const hasBulkMethods = this.supportsBulkMethods(appwriteDep);
239
+ const supportsBulk = this.supportsBulkMethods(appwriteDep);
226
240
  const dbReturnTypes = Array.from(entitiesByDb.entries())
227
241
  .map(([dbId, dbEntities]) => {
228
242
  const tableTypes = dbEntities
@@ -234,11 +248,13 @@ export type QueryBuilder<T> = {
234
248
  delete: (id: string, options?: { transactionId?: string }) => Promise<void>;
235
249
  list: (options?: { queries?: (q: QueryBuilder<${typeName}>) => string[] }) => Promise<{ total: number; rows: ${typeName}[] }>;`;
236
250
 
237
- const bulkMethods = hasBulkMethods
251
+ // Bulk methods not supported for tables with relationship columns (see hasRelationshipColumns)
252
+ const canUseBulkMethods = supportsBulk && !this.hasRelationshipColumns(entity);
253
+ const bulkMethods = canUseBulkMethods
238
254
  ? `
239
- createMany: (rows: Array<{ data: Omit<${typeName}, keyof Models.Row>; rowId?: string; permissions?: Permission[] }>, options?: { transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
240
- updateMany: (rows: Array<{ rowId: string; data: Partial<Omit<${typeName}, keyof Models.Row>>; permissions?: Permission[] }>, options?: { transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
241
- deleteMany: (rowIds: string[], options?: { transactionId?: string }) => Promise<void>;`
255
+ createMany: (rows: Array<Omit<${typeName}, keyof Models.Row> & { $id?: string; $permissions?: string[] }>, options?: { transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
256
+ updateMany: (data: Partial<Omit<${typeName}, keyof Models.Row>>, options?: { queries?: (q: QueryBuilder<${typeName}>) => string[]; transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;
257
+ deleteMany: (options?: { queries?: (q: QueryBuilder<${typeName}>) => string[]; transactionId?: string }) => Promise<{ total: number; rows: ${typeName}[] }>;`
242
258
  : "";
243
259
 
244
260
  return ` '${entity.name}': {\n${baseMethods}${bulkMethods}\n }`;
@@ -291,19 +307,19 @@ export type QueryBuilder<T> = {
291
307
 
292
308
  private generateQueryBuilder(): string {
293
309
  return `const createQueryBuilder = <T>(): QueryBuilder<T> => ({
294
- equal: (field, value) => Query.equal(String(field), value),
295
- notEqual: (field, value) => Query.notEqual(String(field), value),
296
- lessThan: (field, value) => Query.lessThan(String(field), value),
297
- lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value),
298
- greaterThan: (field, value) => Query.greaterThan(String(field), value),
299
- greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value),
300
- contains: (field, value) => Query.contains(String(field), value),
310
+ equal: (field, value) => Query.equal(String(field), value as any),
311
+ notEqual: (field, value) => Query.notEqual(String(field), value as any),
312
+ lessThan: (field, value) => Query.lessThan(String(field), value as any),
313
+ lessThanEqual: (field, value) => Query.lessThanEqual(String(field), value as any),
314
+ greaterThan: (field, value) => Query.greaterThan(String(field), value as any),
315
+ greaterThanEqual: (field, value) => Query.greaterThanEqual(String(field), value as any),
316
+ contains: (field, value) => Query.contains(String(field), value as any),
301
317
  search: (field, value) => Query.search(String(field), value),
302
318
  isNull: (field) => Query.isNull(String(field)),
303
319
  isNotNull: (field) => Query.isNotNull(String(field)),
304
320
  startsWith: (field, value) => Query.startsWith(String(field), value),
305
321
  endsWith: (field, value) => Query.endsWith(String(field), value),
306
- between: (field, start, end) => Query.between(String(field), start, end),
322
+ between: (field, start, end) => Query.between(String(field), start as any, end as any),
307
323
  select: (fields) => Query.select(fields.map(String)),
308
324
  orderAsc: (field) => Query.orderAsc(String(field)),
309
325
  orderDesc: (field) => Query.orderDesc(String(field)),
@@ -316,94 +332,35 @@ export type QueryBuilder<T> = {
316
332
  })`;
317
333
  }
318
334
 
319
- private generateTableHelpers(
320
- dbId: string,
321
- dbEntities: Entity[],
322
- appwriteDep: string,
323
- ): string {
324
- const hasBulkMethods = this.supportsBulkMethods(appwriteDep);
325
-
326
- return dbEntities
327
- .map((entity) => {
328
- const entityName = entity.name;
329
- const typeName = toPascalCase(entity.name);
330
-
331
- const baseMethods = ` create: (data: Omit<${typeName}, keyof Models.Row>, options?: { rowId?: string; permissions?: Permission[]; transactionId?: string }) =>
332
- tablesDB.createRow<${typeName}>({
333
- databaseId: '${dbId}',
334
- tableId: '${entity.$id}',
335
- rowId: options?.rowId ?? ID.unique(),
336
- data,
337
- permissions: options?.permissions?.map((p) => p.toString()),
338
- transactionId: options?.transactionId,
339
- }),
340
- get: (id: string) =>
341
- tablesDB.getRow<${typeName}>({
342
- databaseId: '${dbId}',
343
- tableId: '${entity.$id}',
344
- rowId: id,
345
- }),
346
- update: (id: string, data: Partial<Omit<${typeName}, keyof Models.Row>>, options?: { permissions?: Permission[]; transactionId?: string }) =>
347
- tablesDB.updateRow<${typeName}>({
348
- databaseId: '${dbId}',
349
- tableId: '${entity.$id}',
350
- rowId: id,
351
- data,
352
- ...(options?.permissions ? { permissions: options.permissions.map((p) => p.toString()) } : {}),
353
- transactionId: options?.transactionId,
354
- }),
355
- delete: async (id: string, options?: { transactionId?: string }) => {
356
- await tablesDB.deleteRow({
357
- databaseId: '${dbId}',
358
- tableId: '${entity.$id}',
359
- rowId: id,
360
- transactionId: options?.transactionId,
361
- });
362
- },
363
- list: (options?: { queries?: (q: QueryBuilder<${typeName}>) => string[] }) =>
364
- tablesDB.listRows<${typeName}>({
365
- databaseId: '${dbId}',
366
- tableId: '${entity.$id}',
367
- queries: options?.queries?.(createQueryBuilder<${typeName}>()),
368
- }),`;
369
-
370
- const bulkMethods = hasBulkMethods
371
- ? `
372
- createMany: (rows: Array<{ data: Omit<${typeName}, keyof Models.Row>; rowId?: string; permissions?: Permission[] }>, options?: { transactionId?: string }) =>
373
- tablesDB.createRows<${typeName}>({
374
- databaseId: '${dbId}',
375
- tableId: '${entity.$id}',
376
- rows: rows.map((row) => ({
377
- rowId: row.rowId ?? ID.unique(),
378
- data: row.data,
379
- permissions: row.permissions?.map((p) => p.toString()),
380
- })),
381
- transactionId: options?.transactionId,
382
- }),
383
- updateMany: (rows: Array<{ rowId: string; data: Partial<Omit<${typeName}, keyof Models.Row>>; permissions?: Permission[] }>, options?: { transactionId?: string }) =>
384
- tablesDB.updateRows<${typeName}>({
385
- databaseId: '${dbId}',
386
- tableId: '${entity.$id}',
387
- rows: rows.map((row) => ({
388
- rowId: row.rowId,
389
- data: row.data,
390
- permissions: row.permissions?.map((p) => p.toString()),
391
- })),
392
- transactionId: options?.transactionId,
393
- }),
394
- deleteMany: async (rowIds: string[], options?: { transactionId?: string }) => {
395
- await tablesDB.deleteRows({
396
- databaseId: '${dbId}',
397
- tableId: '${entity.$id}',
398
- rows: rowIds.map((rowId) => ({ rowId })),
399
- transactionId: options?.transactionId,
400
- });
401
- },`
402
- : "";
403
-
404
- return ` '${entityName}': {\n${baseMethods}${bulkMethods}\n }`;
335
+ private generateTableIdMap(entitiesByDb: Map<string, Entity[]>): string {
336
+ const dbMappings = Array.from(entitiesByDb.entries())
337
+ .map(([dbId, dbEntities]) => {
338
+ const tableMappings = dbEntities
339
+ .map((entity) => ` '${entity.name}': '${entity.$id}'`)
340
+ .join(",\n");
341
+ return ` '${dbId}': {\n${tableMappings}\n }`;
405
342
  })
406
343
  .join(",\n");
344
+
345
+ return `const tableIdMap: Record<string, Record<string, string>> = {\n${dbMappings}\n}`;
346
+ }
347
+
348
+ private generateTablesWithRelationships(entitiesByDb: Map<string, Entity[]>): string {
349
+ const tablesWithRelationships: string[] = [];
350
+
351
+ for (const [dbId, dbEntities] of entitiesByDb.entries()) {
352
+ for (const entity of dbEntities) {
353
+ if (this.hasRelationshipColumns(entity)) {
354
+ tablesWithRelationships.push(`'${dbId}:${entity.name}'`);
355
+ }
356
+ }
357
+ }
358
+
359
+ if (tablesWithRelationships.length === 0) {
360
+ return `const tablesWithRelationships = new Set<string>()`;
361
+ }
362
+
363
+ return `const tablesWithRelationships = new Set<string>([${tablesWithRelationships.join(", ")}])`;
407
364
  }
408
365
 
409
366
  generateDatabasesFile(config: ConfigType): string {
@@ -414,29 +371,140 @@ export type QueryBuilder<T> = {
414
371
  }
415
372
 
416
373
  const entitiesByDb = this.groupEntitiesByDb(entities);
417
- const typeNames = entities.map((e) => toPascalCase(e.name));
418
374
  const appwriteDep = this.getAppwriteDependency();
419
-
420
- const databasesMap = Array.from(entitiesByDb.entries())
421
- .map(([dbId, dbEntities]) => {
422
- return ` '${dbId}': {\n${this.generateTableHelpers(dbId, dbEntities, appwriteDep)}\n }`;
423
- })
424
- .join(",\n");
375
+ const supportsBulk = this.supportsBulkMethods(appwriteDep);
376
+
377
+ const bulkMethodsCode = supportsBulk
378
+ ? `
379
+ createMany: (rows: any[], options?: { transactionId?: string }) =>
380
+ tablesDB.createRows({
381
+ databaseId,
382
+ tableId,
383
+ rows,
384
+ transactionId: options?.transactionId,
385
+ }),
386
+ updateMany: (data: any, options?: { queries?: (q: any) => string[]; transactionId?: string }) =>
387
+ tablesDB.updateRows({
388
+ databaseId,
389
+ tableId,
390
+ data,
391
+ queries: options?.queries?.(createQueryBuilder()),
392
+ transactionId: options?.transactionId,
393
+ }),
394
+ deleteMany: (options?: { queries?: (q: any) => string[]; transactionId?: string }) =>
395
+ tablesDB.deleteRows({
396
+ databaseId,
397
+ tableId,
398
+ queries: options?.queries?.(createQueryBuilder()),
399
+ transactionId: options?.transactionId,
400
+ }),`
401
+ : "";
402
+
403
+ const hasBulkCheck = supportsBulk
404
+ ? `const hasBulkMethods = (dbId: string, tableName: string) => !tablesWithRelationships.has(\`\${dbId}:\${tableName}\`);`
405
+ : "";
425
406
 
426
407
  return `import { Client, TablesDB, ID, Query, type Models, Permission } from '${appwriteDep}';
427
- import type { ${typeNames.join(", ")}, DatabaseId, DatabaseTables, QueryBuilder } from './types.js';
408
+ import type { DatabaseId, DatabaseTables, QueryBuilder } from './types.js';
428
409
 
429
410
  ${this.generateQueryBuilder()};
430
411
 
431
- export const createDatabases = (client: Client) => {
432
- const tablesDB = new TablesDB(client);
412
+ ${this.generateTableIdMap(entitiesByDb)};
433
413
 
434
- const _databases: { [K in DatabaseId]: DatabaseTables[K] } = {
435
- ${databasesMap}
414
+ ${this.generateTablesWithRelationships(entitiesByDb)};
415
+
416
+ function createTableApi<T extends Models.Row>(
417
+ tablesDB: TablesDB,
418
+ databaseId: string,
419
+ tableId: string,
420
+ ) {
421
+ return {
422
+ create: (data: any, options?: { rowId?: string; permissions?: Permission[]; transactionId?: string }) =>
423
+ tablesDB.createRow<T>({
424
+ databaseId,
425
+ tableId,
426
+ rowId: options?.rowId ?? ID.unique(),
427
+ data,
428
+ permissions: options?.permissions?.map((p) => p.toString()),
429
+ transactionId: options?.transactionId,
430
+ }),
431
+ get: (id: string) =>
432
+ tablesDB.getRow<T>({
433
+ databaseId,
434
+ tableId,
435
+ rowId: id,
436
+ }),
437
+ update: (id: string, data: any, options?: { permissions?: Permission[]; transactionId?: string }) =>
438
+ tablesDB.updateRow<T>({
439
+ databaseId,
440
+ tableId,
441
+ rowId: id,
442
+ data,
443
+ ...(options?.permissions ? { permissions: options.permissions.map((p) => p.toString()) } : {}),
444
+ transactionId: options?.transactionId,
445
+ }),
446
+ delete: async (id: string, options?: { transactionId?: string }) => {
447
+ await tablesDB.deleteRow({
448
+ databaseId,
449
+ tableId,
450
+ rowId: id,
451
+ transactionId: options?.transactionId,
452
+ });
453
+ },
454
+ list: (options?: { queries?: (q: any) => string[] }) =>
455
+ tablesDB.listRows<T>({
456
+ databaseId,
457
+ tableId,
458
+ queries: options?.queries?.(createQueryBuilder<T>()),
459
+ }),${bulkMethodsCode}
436
460
  };
461
+ }
462
+
463
+ ${hasBulkCheck}
464
+
465
+ function createDatabaseProxy<D extends DatabaseId>(
466
+ tablesDB: TablesDB,
467
+ databaseId: D,
468
+ ): DatabaseTables[D] {
469
+ const tableApiCache = new Map<string, ReturnType<typeof createTableApi>>();
470
+
471
+ return new Proxy({} as DatabaseTables[D], {
472
+ get(_target, tableName: string) {
473
+ if (typeof tableName === 'symbol') return undefined;
474
+
475
+ if (!tableApiCache.has(tableName)) {
476
+ const tableId = tableIdMap[databaseId]?.[tableName];
477
+ if (!tableId) return undefined;
478
+
479
+ const api = createTableApi(tablesDB, databaseId, tableId);
480
+ ${supportsBulk ? `
481
+ // Remove bulk methods for tables with relationships
482
+ if (!hasBulkMethods(databaseId, tableName)) {
483
+ delete (api as any).createMany;
484
+ delete (api as any).updateMany;
485
+ delete (api as any).deleteMany;
486
+ }` : ""}
487
+ tableApiCache.set(tableName, api);
488
+ }
489
+ return tableApiCache.get(tableName);
490
+ },
491
+ has(_target, tableName: string) {
492
+ return typeof tableName === 'string' && tableName in (tableIdMap[databaseId] ?? {});
493
+ },
494
+ });
495
+ }
496
+
497
+ export const createDatabases = (client: Client) => {
498
+ const tablesDB = new TablesDB(client);
499
+ const dbCache = new Map<DatabaseId, DatabaseTables[DatabaseId]>();
437
500
 
438
501
  return {
439
- from: <T extends DatabaseId>(databaseId: T): DatabaseTables[T] => _databases[databaseId],
502
+ from: <T extends DatabaseId>(databaseId: T): DatabaseTables[T] => {
503
+ if (!dbCache.has(databaseId)) {
504
+ dbCache.set(databaseId, createDatabaseProxy(tablesDB, databaseId));
505
+ }
506
+ return dbCache.get(databaseId) as DatabaseTables[T];
507
+ },
440
508
  };
441
509
  };
442
510
  `;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "type": "module",
4
4
  "homepage": "https://appwrite.io/support",
5
5
  "description": "Repo short description goes here",
6
- "version": "0.3.0",
6
+ "version": "0.3.1",
7
7
  "license": "",
8
8
  "main": "dist/index.js",
9
9
  "types": "dist/index.d.ts",